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文章
7960瀏覽量
265097 -
鼠標
+關注
關注
6文章
591瀏覽量
39815 -
框架
+關注
關注
0文章
403瀏覽量
17511
發布評論請先 登錄
相關推薦
評論