Linux-2.6.34中USB键盘驱动printk无输出问题求助
USB键盘驱动添加printk无输出的排查原因
printk日志级别被过滤
Linux内核日志有分级机制,默认控制台可能只显示优先级较高的日志。如果你的printk没指定级别(比如直接写printk("xxx");),默认的日志级别可能低于当前console的显示阈值。解决方法:- 给printk加上明确的高优先级级别,比如
printk(KERN_INFO "USB kbd input received\n"); - 临时调整console日志级别:
echo 8 > /proc/sys/kernel/printk(数值8会显示所有级别的内核日志)
- 给printk加上明确的高优先级级别,比如
修改后的驱动未被加载
你修改了usbkbd.c但系统可能仍在使用旧的驱动版本:- 先检查驱动状态:
lsmod | grep usbhid,如果usbhid是可加载模块,需要重新编译模块:make modules SUBDIRS=drivers/hid/usbhid,然后卸载旧模块rmmod usbhid,再加载新模块insmod usbhid.ko - 如果usbhid是内核内置驱动,必须重新编译整个内核并重启系统才能生效
- 先检查驱动状态:
代码添加位置错误
确保printk加在了键盘输入的关键处理路径上,比如usb_kbd_interrupt()函数(这个函数负责处理USB键盘的中断输入数据)。如果加在了初始化函数、错误分支或者不会被执行的代码块里,自然不会触发输出。日志未输出到当前控制台
有些系统会把内核日志定向到串口或者其他设备,而非当前虚拟控制台。直接用dmesg命令查看所有内核日志缓存:dmesg | grep "你的打印关键词",大概率能找到你的输出内容。编译优化导致代码被剔除
内核编译时如果开启了优化选项(如-O2),编译器可能会认为无意义的printk(比如没有引用变量的固定字符串)是冗余代码并剔除。可以在printk中加入会变化的变量(比如输入数据的字节值),或者给相关变量加上volatile修饰,避免被优化。键盘未绑定到usbhid驱动
部分特殊键盘可能被专属HID驱动接管,而非usbhid。可以通过cat /sys/bus/usb/devices/[你的键盘设备号]/driver查看当前绑定的驱动,确认是usbhid。如果不是,卸载对应的专属驱动后,usbhid会自动接管键盘。
内容的提问来源于stack exchange,提问作者zappen
相关产品推荐
相关产品推荐

