1. 目標(biāo)
使用鼠標(biāo)模擬按鍵:左鍵相當(dāng)于"L"、右鍵相當(dāng)于"S"、"中鍵"相當(dāng)于 "回車"。
2. 編程
2.1 驅(qū)動(dòng)框架
對(duì)于 GPIO 按鍵,是直接構(gòu)造、注冊(cè)一個(gè) input_dev 結(jié)構(gòu)體,在 GPIO 中斷函數(shù)里獲得數(shù)據(jù)。
現(xiàn)在數(shù)據(jù)來源發(fā)生了變化,數(shù)據(jù)來自 USB 設(shè)備,需要做的事情是:
- 構(gòu)造、注冊(cè) usb_driver
- usb_driver 發(fā)現(xiàn)能支持是設(shè)備后,它的 probe 函數(shù)被調(diào)用:
- 構(gòu)造、注冊(cè) input_dev 結(jié)構(gòu)體
- 獲得數(shù)據(jù):
- 構(gòu)造、提交 URB
- 在 URB 的回調(diào)函數(shù)里,向 Input 系統(tǒng)上報(bào)數(shù)據(jù)
2.2 實(shí)現(xiàn) usb_driver
仿照 usbmouse.c 如下代碼構(gòu)造一個(gè) usb_driver 結(jié)構(gòu)體:
核心是:
- id_table:這個(gè)驅(qū)動(dòng)能支持哪些設(shè)備
- probe 函數(shù):發(fā)現(xiàn)能支持的設(shè)備后,probe 函數(shù)記錄設(shè)備信息、注冊(cè)輸入設(shè)備等等
2.2.1 id_table
id_table 是一個(gè) usb_device_id 數(shù)組,示例如下:
usb_device_id 結(jié)構(gòu)體定義如下:
- match_flags:表示要比較哪些信息,可以比較設(shè)備 ID、DeviceClass、InterfaceClass 等等
- 根據(jù) match_flags 提供其他信息:比如設(shè)備 ID、DeviceClass、InterfaceClass 等等
- driver_info:驅(qū)動(dòng)程序可能用到的一些信息
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 函數(shù)
probe 函數(shù)原型如下:
int (*probe) (struct usb_interface *intf,
const struct usb_device_id *id);
第 1 個(gè)參數(shù)是"struct usb_interface *"類型,表示匹配到的"USB 邏輯設(shè)備"。
第 2 個(gè)參數(shù)是"struct usb_device_id *"類型,它是 usb_driver 的 id_table 中的某項(xiàng),表示第 1 個(gè)參數(shù)就是跟這個(gè) usb_device_id 匹配的。有必要的話,probe 函數(shù)里可以從 id->driver_info 得到驅(qū)動(dòng)相關(guān)的一些信息。
在 probe 函數(shù),一般要記錄 intf 信息,以后發(fā)起 USB 傳輸時(shí)會(huì)用到 intf 信息。
2.3 實(shí)現(xiàn)輸入設(shè)備
核心是:分配、設(shè)置、注冊(cè)一個(gè) input_device 結(jié)構(gòu)體。
2.4 實(shí)現(xiàn)數(shù)據(jù)傳輸
分配、填充、提交 URB,在 URB 的回調(diào)函數(shù)里上報(bào)"input_event"。
-
usb
+關(guān)注
關(guān)注
60文章
7936瀏覽量
264475 -
鼠標(biāo)
+關(guān)注
關(guān)注
6文章
591瀏覽量
39754 -
框架
+關(guān)注
關(guān)注
0文章
403瀏覽量
17475
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論