USB设备驱动小结

  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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值