linux 下usb 鼠标的驱动基本上属于USB 协议中HID 设备的中断通信的应用。代码vendormstarkernellinarodrivershid칂d캘use.c,下面一起学习usb 鼠标驱动,usb 键盘vendormstarkernellinarodrivershid칂d칋d.c 后续在学习。
讯享网
讯享网
通过宏module_usb_driver将usb 鼠标设备usb_mouse_driver注册下去
就这样,usb mouse 驱动就被注册到usb 总线上去了。
讯享网
上一步完成了驱动的配置,传入了id_table,此处也即usb_mouse_id_table,里面记载了支持的设备列表,USB_INTERFACE_INFO 来定义一类USB鼠标设备。通过这个信息就可以完成驱动和设备的匹配,成功之后就会调用usb_mouse_driver 里面的probe。
驱动和设备匹配成功之后就会调用driver 的探测函数,主要任务有:
- 获取接口; // 判断端点是否为中断模式
- 申请一个input 设备并填充;
- 创建管道,设置大小,再申请缓存区;
- 申请一个urb 用于与usb 设备通信;
- 注册input 设备;
- 设置接口数据;
讯享网
讯享网
在usb mouse 产生事件时,usb_mouse_irq回调会被触发
usb 键盘/鼠标协议说明
https://blog.csdn.net/peakguy/article/details/
https://www.cnblogs.com/vonly/p/7403823.html
https://blog.csdn.net/jiujiujiuqiuqiuqiu/article/details/
鼠标发送给PC的数据每次4个字节
BYTE1 BYTE2 BYTE3 BYTE4
定义分别是:
BYTE1 –
|–bit7: 1 表示 Y 坐标的变化量超出-256 ~ 255的范围,0表示没有溢出
|–bit6: 1 表示 X 坐标的变化量超出-256 ~ 255的范围,0表示没有溢出
|–bit5: Y 坐标变化的符号位,1表示负数,即鼠标向下移动
|–bit4: X 坐标变化的符号位,1表示负数,即鼠标向左移动
|–bit3: 恒为1
|–bit2: 1表示中键按下
|–bit1: 1表示右键按下
|–bit0: 1表示左键按下
BYTE2 – X坐标变化量,与byte的bit4组成9位符号数,负数表示向左移,正数表右移。用补码表示变化量
BYTE3 – Y坐标变化量,与byte的bit5组成9位符号数,负数表示向下移,正数表上移。用补码表示变化量
BYTE4 – 滚轮变化。
由于手上没有USB鼠标,对BYTE1的4-7位没有测试,对于BYTE2 BYTE3做个测试,BYTE1的4-7全为0的时候,BYTE2 BYTE3的正负表示鼠标移动方向
键盘发送给PC的数据每次8个字节
BYTE1 BYTE2 BYTE3 BYTE4 BYTE5 BYTE6 BYTE7 BYTE8
定义分别是:
BYTE1 –
|–bit0: Left Control是否按下,按下为1
|–bit1: Left Shift 是否按下,按下为1
|–bit2: Left Alt 是否按下,按下为1
|–bit3: Left GUI 是否按下,按下为1
|–bit4: Right Control是否按下,按下为1
|–bit5: Right Shift 是否按下,按下为1
|–bit6: Right Alt 是否按下,按下为1
|–bit7: Right GUI 是否按下,按下为1
BYTE2 – 暂不清楚,有的地方说是保留位
BYTE3–BYTE8 – 这六个为普通按键
键盘经过测试。
例如:键盘发送一帧数据 02 00 0x04 0x05 00 00 00 00
表示同时按下了Left Shift + ‘a’+‘b’三个键
回调里面解析完 usb mouse 事件之后,通过input_report_key丢给linux 的input 系统来处理。至此usb mouse 完成了事件的获取没解析和转发。另外input子系统还有以下input event 转发接口,在其它输入设备中可以用到,例如usb keyboard。
讯享网

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/174317.html