USB裝置驅動小結

來源:互聯網
上載者:User

  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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.