1. 目标
使用鼠标模拟按键:左键相当于"L"、右键相当于"S"、"中键"相当于 "回车"。
2. 编程
2.1 驱动框架
对于 GPIO 按键,是直接构造、注册一个 input_dev 结构体,在 GPIO 中断函数里获得数据。
现在数据来源发生了变化,数据来自 USB 设备,需要做的事情是:
- 构造、注册 usb_driver
- usb_driver 发现能支持是设备后,它的 probe 函数被调用:
- 构造、注册 input_dev 结构体
- 获得数据:
- 构造、提交 URB
- 在 URB 的回调函数里,向 Input 系统上报数据
2.2 实现 usb_driver
仿照 usbmouse.c 如下代码构造一个 usb_driver 结构体:
核心是:
- id_table:这个驱动能支持哪些设备
- probe 函数:发现能支持的设备后,probe 函数记录设备信息、注册输入设备等等
2.2.1 id_table
id_table 是一个 usb_device_id 数组,示例如下:
usb_device_id 结构体定义如下:
- match_flags:表示要比较哪些信息,可以比较设备 ID、DeviceClass、InterfaceClass 等等
- 根据 match_flags 提供其他信息:比如设备 ID、DeviceClass、InterfaceClass 等等
- driver_info:驱动程序可能用到的一些信息
struct usb_device_id {
/* which fields to match against? */
__u16 match_flags;
/* Used for product specific matches; range is inclusive */
__u16 idVendor;
__u16 idProduct;
__u16 bcdDevice_lo;
__u16 bcdDevice_hi;
/* Used for device class matches */
__u8 bDeviceClass;
__u8 bDeviceSubClass;
__u8 bDeviceProtocol;
/* Used for interface class matches */
__u8 bInterfaceClass;
__u8 bInterfaceSubClass;
__u8 bInterfaceProtocol;
/* Used for vendor-specific interface matches */
__u8 bInterfaceNumber;
/* not matched against */
kernel_ulong_t driver_info
__attribute__((aligned(sizeof(kernel_ulong_t))));
};
2.2.2 probe 函数
probe 函数原型如下:
int (*probe) (struct usb_interface *intf,
const struct usb_device_id *id);
第 1 个参数是"struct usb_interface *"类型,表示匹配到的"USB 逻辑设备"。
第 2 个参数是"struct usb_device_id *"类型,它是 usb_driver 的 id_table 中的某项,表示第 1 个参数就是跟这个 usb_device_id 匹配的。有必要的话,probe 函数里可以从 id->driver_info 得到驱动相关的一些信息。
在 probe 函数,一般要记录 intf 信息,以后发起 USB 传输时会用到 intf 信息。
2.3 实现输入设备
核心是:分配、设置、注册一个 input_device 结构体。
2.4 实现数据传输
分配、填充、提交 URB,在 URB 的回调函数里上报"input_event"。
-
usb
+关注
关注
60文章
7939浏览量
264519 -
鼠标
+关注
关注
6文章
591浏览量
39760 -
框架
+关注
关注
0文章
403浏览量
17478
发布评论请先 登录
相关推荐
评论