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
USB设备驱动小结
最新推荐文章于 2022-05-14 19:08:38 发布