天天看點

Linux-USB驅動筆記(八)--Gadget Function驅動1、前言2、Gadget Function 驅動3、API函數

Linux-USB驅動筆記(八)--Gadget Function驅動

  • 1、前言
  • 2、Gadget Function 驅動
    • 2.1、usb_function -- 配置的一個功能
    • 2.2、usb_request -- I/O請求
    • 2.3、usb_function_driver
  • 3、API函數

1、前言

在Linux-USB驅動筆記(四)–USB整體架構中有説到Gadget Function驅動,下面我們來具體看一下。

Gadget Function就是指裝置的功能,比如作為U盤,需要檔案存儲的功能,則需要File Storage驅動,這個驅動也稱為Function驅動。

2、Gadget Function 驅動

Function驅動隻是利用通用的API,并通過usb_request與底層UDC驅動互動。

Gadget Function 驅動相關的代碼位于 /drivers/usb/gadget/function 目錄下。

2.1、usb_function – 配置的一個功能

struct usb_function {
  const char      *name;
  struct usb_gadget_strings  **strings;
  struct usb_descriptor_header  **fs_descriptors; //全速和低速描述符表
  struct usb_descriptor_header  **hs_descriptors; //高速描述符表
  struct usb_descriptor_header  **ss_descriptors; //超高速描述符表
  struct usb_descriptor_header  **ssp_descriptors;//超高速加描述符表

  struct usb_configuration  *config; //usb配置

  struct usb_os_desc_table  *os_desc_table;
  unsigned      os_desc_n;


  /* 配置管理:  bind/unbind */
   // gadget注冊前綁定資源(接口辨別,類描述符,端點,IO緩存)
  int      (*bind)(struct usb_configuration *,
          struct usb_function *);
  void      (*unbind)(struct usb_configuration *,
          struct usb_function *);
  void      (*free_func)(struct usb_function *f);
  struct module    *mod;

  /* 運作狀态管理 */
  int      (*set_alt)(struct usb_function *,
          unsigned interface, unsigned alt);
  int      (*get_alt)(struct usb_function *,
          unsigned interface);
  void      (*disable)(struct usb_function *);
  int      (*setup)(struct usb_function *,
          const struct usb_ctrlrequest *);
  bool      (*req_match)(struct usb_function *,
          const struct usb_ctrlrequest *,
          bool config0);
  void      (*suspend)(struct usb_function *);
  void      (*resume)(struct usb_function *);

  /* USB 3.0 附加 */
  int      (*get_status)(struct usb_function *);
  int      (*func_suspend)(struct usb_function *,
            u8 suspend_opt);
  /* private: */
  /* internals */
  struct list_head    list;
  DECLARE_BITMAP(endpoints, 32);
  const struct usb_function_instance *fi;

  unsigned int    bind_deactivated:1;
};
           

重要字段及其含義如下:

字段 含義
struct usb_descriptor_header **fs_descriptors; 全速和低速描述符表
struct usb_descriptor_header **hs_descriptors; 高速描述符表
struct usb_descriptor_header **ss_descriptors; 超高速描述符表
struct usb_descriptor_header **ssp_descriptors; 超高速加描述符表
struct usb_configuration *config; usb配置

2.2、usb_request – I/O請求

struct usb_request {
  void      *buf;
  unsigned    length;
  dma_addr_t    dma;

  struct scatterlist  *sg;
  unsigned    num_sgs;
  unsigned    num_mapped_sgs;

  unsigned    stream_id:16;
  unsigned    no_interrupt:1;
  unsigned    zero:1;
  unsigned    short_not_ok:1;
  unsigned    dma_mapped:1;

  void      (*complete)(struct usb_ep *ep,
          struct usb_request *req);
  void      *context;
  struct list_head  list;

  int      status;
  unsigned    actual;
};
           

在Gadget驅動中,用usb_request結構體來描述一次傳輸請求。這個和主機側的URB類似,隻是它更輕量,可以有更多的預配置設定。

2.3、usb_function_driver

struct usb_function_driver {
  const char *name;
  struct module *mod;
  struct list_head list;
  struct usb_function_instance *(*alloc_inst)(void);
  struct usb_function *(*alloc_func)(struct usb_function_instance *inst);
};
           

和platform_driver類似,用來注冊usb_function驅動。

3、API函數

API 作用
int usb_function_register(struct usb_function_driver *newf) 注冊usb_function_driver(隻是把usb_function_driver加入func_list連結清單)
void usb_function_unregister(struct usb_function_driver *fd) 登出usb_function_driver
int usb_add_function(struct usb_configuration *, struct usb_function *); 添加一個功能到配置
void usb_remove_function(struct usb_configuration *c, struct usb_function *f) 從配置中移除功能
int usb_ep_enable(struct usb_ep *ep); 使能端點
int usb_ep_disable(struct usb_ep *ep); 禁用端點
struct usb_request *usb_ep_alloc_request(struct usb_ep *ep, gfp_t gfp_flags); 配置設定usb_request
void usb_ep_free_request(struct usb_ep *ep, struct usb_request *req); 釋放usb_request
struct usb_request *alloc_ep_req(struct usb_ep *ep, size_t len); 配置設定usb_request
int usb_ep_queue(struct usb_ep *ep,struct usb_request *req, gfp_t gfp_flags); 送出usb_request
int usb_ep_dequeue(struct usb_ep *ep, struct usb_request *req); 取消usb_request
int usb_ep_fifo_status(struct usb_ep *ep) 傳回端點FIFO位元組數
void usb_ep_fifo_flush(struct usb_ep *ep) 重新整理FIFO資料
struct usb_ep *usb_ep_autoconfig(struct usb_gadget *,struct usb_endpoint_descriptor *); 端點自動配置
函數 實作
usb_ep_enable 最終調用 ep->ops->enable(ep, desc);
usb_ep_disable 最終調用 ep->ops->disable(ep, desc);
usb_ep_alloc_request 最終調用 ep->ops->alloc_request(ep, gfp_flags);
usb_ep_free_request 最終調用 ep->ops->free_request(ep, req);
usb_ep_queue 最終調用 ep->ops->queue(ep, req, gfp_flags);
usb_ep_dequeue 最終調用 ep->ops->dequeue(ep, req);

上面這些通用的API都是調用到UDC驅動中的函數,然後進行硬體操作。

USB驅動架構到此就結束了。

繼續閱讀