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驅動架構到此就結束了。