1 USB裝置驅動小結
2
3 1. 編寫USB驅動的主要工作
4 首先要清楚,編寫usb驅動的主要工作是完成probe()和disconnect()函數。它們分別是在裝置插入和斷開時被調用。
5 這兩個函數主要完成初始化和釋放軟硬體資源。
6
7 2. usb_driver的主要作用
8 與platform_driver相似,usb_driver只是起到了牽線的作用。usb本身所屬裝置的驅動的結構與其不掛在usb匯流排上時
9 一樣,但是在訪問方式上卻發生了很大的變化,沒有了對I/O記憶體和I/O連接埠的訪問,而換來的是urb請求塊。
10 因此,usb_driver只是起到了一個找到usb裝置,管理串連和中斷連線的工作。具體的資料通訊功能是靠相應的裝置類
11 驅動來實現的。
12
13 3. 驅動程式是如何找到相應的裝置的。
14 答案是靠vender id 和 product id.
15
16 /* Define these values to match your devices */
17 #define USB_SKEL_VENDOR_ID 0x061a
18 #define USB_SKEL_PRODUCT_ID 0x0200
19
20 /* table of devices that work with this driver */
21 static struct usb_device_id skel_table[] = {
22 { USB_DEVICE(USB_SKEL_VENDOR_ID, USB_SKEL_PRODUCT_ID) },
23 { } /* Terminating entry */
24 };
25 MODULE_DEVICE_TABLE(usb, skel_table);
26
27 4. 如何設定minor號
28 /* Get a minor range for your devices from the usb maintainer */
29 #define USB_SKEL_MINOR_BASE 240
30
31 static struct usb_class_driver skel_class = {
32 .name = "skel%d",
33 .fops = &skel_fops,
34 .minor_base = USB_SKEL_MINOR_BASE,
35 };
36 ...
37 retval = usb_register_dev(interface, &skel_class);
38 ...
39
40 5. urb的處理流程
41 第一種,手動設定,整個流程走一遍,傳輸大量資訊時使用
42 usb_alloc_urb(); //申請
43 usb_fill_bulk_urb(); //初始化參數
44 usb_submit_urb(); //提交
45
46 第二種,簡單的批量與控制urb
47 (1) usb_bulk_msg()
48 這個函數建立一個usb批量urb並將它發送到特定的裝置,這個函數是同步的,它一直等到urb
49 完成後才返回。
50 int usb_bulk_msg(struct usb_device *usb_dev,
51 unsigned int pipe,
52 void *data, //buffer
53 int len, //[in], data length
54 int *actual_length, //[out], actual data length of send or receive
55 int timeout);
56 (2) usb_control_msg()
57 與usb_bulk_msg具有相似的功能,不過它提供驅動發送和結束urb控制資訊而非批量資訊的能力。
58 int usb_control_msg(struct usb_device *dev,
59 unsigned int pipe,
60 __u8 request,
61 __u8 requesttype,
62 __u16 value,
63 __u16 index,
64 void *data,
65 __u16 size,
66 int timeout);
67
68 6. 如何讀取一個寄存器
69 /* --------------------------------------------------------------------------*/
70 /**
71 * @Brief: fps200_usb_readRegister
72 *
73 * @Param: usbdev
74 * @Param: reg
75 * @Param: data
76 *
77 * @Returns:
78 */
79 /* --------------------------------------------------------------------------*/
80 static int fps200_usb_readRegister(struct usb_device *usbdev,
81 int reg, unsigned char *data){
82 return usb_control_msg(usbdev, /* the device */
83 usb_rcvctrlpipe(usbdev, 0), /* pipe */
84 FPS200_USB_READ_REQUEST, /* request */
85 USB_TYPE_VENDOR | USB_DIR_IN |
86 USB_RECIP_DEVICE,/* bmRequestType */
87 reg, /* value */
88 0, /* index */
89 data,
90 1, //the length of data
91 FPS200_USB_TIMEOUT);
92 }
93
94 7. 如何寫一個寄存器
95 /* --------------------------------------------------------------------------*/
96 /**
97 * @Brief: fps200_usb_writeRegister
98 *
99 * @Param: usbdev
100 * @Param: reg
101 * @Param: data
102 *
103 * @Returns:
104 */
105 /* --------------------------------------------------------------------------*/
106 static int fps200_usb_writeRegister(struct usb_device *usbdev,
107 int reg, unsigned char data){
108 return usb_control_msg(usbdev, /* the device */
109 usb_sndctrlpipe(usbdev, 0), /* pipe */
110 FPS200_USB_WRITE_REQUEST, /* request */
111 USB_TYPE_VENDOR | USB_DIR_OUT |
112 USB_RECIP_DEVICE,/* bmRequestType */
113 (data << 8) | reg, /* value, 16bits */
114 0, /* index */
115 NULL, //data buffer
116 0, //size, 0
117 FPS200_USB_TIMEOUT);
118 }
119