Linux-USB驱动笔记(八)--Gadget Function驱动

r囧r小猫 2022-09-11 06:22 649阅读 0赞

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 – 配置的一个功能

  1. struct usb_function {
  2. const char *name;
  3. struct usb_gadget_strings **strings;
  4. struct usb_descriptor_header **fs_descriptors; //全速和低速描述符表
  5. struct usb_descriptor_header **hs_descriptors; //高速描述符表
  6. struct usb_descriptor_header **ss_descriptors; //超高速描述符表
  7. struct usb_descriptor_header **ssp_descriptors;//超高速加描述符表
  8. struct usb_configuration *config; //usb配置
  9. struct usb_os_desc_table *os_desc_table;
  10. unsigned os_desc_n;
  11. /* 配置管理: bind/unbind */
  12. // gadget注册前绑定资源(接口标识,类描述符,端点,IO缓存)
  13. int (*bind)(struct usb_configuration *,
  14. struct usb_function *);
  15. void (*unbind)(struct usb_configuration *,
  16. struct usb_function *);
  17. void (*free_func)(struct usb_function *f);
  18. struct module *mod;
  19. /* 运行状态管理 */
  20. int (*set_alt)(struct usb_function *,
  21. unsigned interface, unsigned alt);
  22. int (*get_alt)(struct usb_function *,
  23. unsigned interface);
  24. void (*disable)(struct usb_function *);
  25. int (*setup)(struct usb_function *,
  26. const struct usb_ctrlrequest *);
  27. bool (*req_match)(struct usb_function *,
  28. const struct usb_ctrlrequest *,
  29. bool config0);
  30. void (*suspend)(struct usb_function *);
  31. void (*resume)(struct usb_function *);
  32. /* USB 3.0 附加 */
  33. int (*get_status)(struct usb_function *);
  34. int (*func_suspend)(struct usb_function *,
  35. u8 suspend_opt);
  36. /* private: */
  37. /* internals */
  38. struct list_head list;
  39. DECLARE_BITMAP(endpoints, 32);
  40. const struct usb_function_instance *fi;
  41. unsigned int bind_deactivated:1;
  42. };

重要字段及其含义如下:






























字段 含义
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请求

  1. struct usb_request {
  2. void *buf;
  3. unsigned length;
  4. dma_addr_t dma;
  5. struct scatterlist *sg;
  6. unsigned num_sgs;
  7. unsigned num_mapped_sgs;
  8. unsigned stream_id:16;
  9. unsigned no_interrupt:1;
  10. unsigned zero:1;
  11. unsigned short_not_ok:1;
  12. unsigned dma_mapped:1;
  13. void (*complete)(struct usb_ep *ep,
  14. struct usb_request *req);
  15. void *context;
  16. struct list_head list;
  17. int status;
  18. unsigned actual;
  19. };

在Gadget驱动中,用usb_request结构体来描述一次传输请求。这个和主机侧的URB类似,只是它更轻量,可以有更多的预分配。

2.3、usb_function_driver

  1. struct usb_function_driver {
  2. const char *name;
  3. struct module *mod;
  4. struct list_head list;
  5. struct usb_function_instance *(*alloc_inst)(void);
  6. struct usb_function *(*alloc_func)(struct usb_function_instance *inst);
  7. };

和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驱动框架到此就结束了。

发表评论

表情:
评论列表 (有 0 条评论,649人围观)

还没有评论,来说两句吧...

相关阅读