1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 【usb】linux内核USB键盘驱动解析--普通键值上报及转化

【usb】linux内核USB键盘驱动解析--普通键值上报及转化

时间:2019-11-05 10:10:27

相关推荐

【usb】linux内核USB键盘驱动解析--普通键值上报及转化

一、概况

建议阅读前置文章【usb】linux内核USB键盘驱动解析–特殊键值上报及转化以Linux5.10内核中USB键盘驱动为例进行解析:https://mirrors./pub/linux/kernel/v5.x/linux-5.10.tar.gz文件路径:linux-5.10/drivers/hid/usbhid/usbkbd.c本次我们主要分析第120~139行的这个for循环。

二、探索

for循环变量i范围是2-7,是因为普通键值存放在数组的第2-7个元素。第一个存放的是特殊键值,第二个保留。kbd->old[i] > 3这个判断是因为,0-3几个键值是保留的没有对应的物理按键。所以我们不需要关注。具体说明见hut1_4第10节。

if (kbd->old[i] > 3 && memscan(kbd->new + 2, kbd->old[i], 6) == kbd->new + 8) {if (usb_kbd_keycode[kbd->old[i]])input_report_key(kbd->dev, usb_kbd_keycode[kbd->old[i]], 0);

上面这段代码,首先memscan的功能是 在一块内存中查找一个字符,也就是在kbd->new + 2这块内存中查找字符kbd->old[i]。6表示kbd->new + 2这块内存大小为6。如果找到了则返回该字符地址,否则返回该内存块末尾地址+1。所以这段代码的意思是,在新报上来的键值中查找旧的键值,如果没有找到,并且if (usb_kbd_keycode[kbd->old[i]])旧的键值为有效键值,那么就上报旧的键值已释放(按键已松开/抬起)。

if (kbd->new[i] > 3 && memscan(kbd->old + 2, kbd->new[i], 6) == kbd->old + 8) {if (usb_kbd_keycode[kbd->new[i]])input_report_key(kbd->dev, usb_kbd_keycode[kbd->new[i]], 1);

这段代码逻辑和上面的差不多,在旧的键值中查找新的键值,如果没有找到这个新的键值,并且这个新的键值是有效的,那么就上报该新键值被按下。

三、总结

kbd->old中保存了上次报上来的键值,kbd->new中是本次报上来的键值。如果上次报了某键值,但是本次没报,说明该按键被释放了,所以上报案件旧释放事件。如果上次没有报某按键而这次报了,说明该按键是这次被按下了,所以要上报按键按下事件。

四、参考资料

hut1_4

memscan(9) — linux-manual-4.8

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。