Linux-USB驱动笔记(七)--设备控制器(UDC)驱动

1、前言

Linux-USB驱动笔记(四)–USB整体框架中有説到设备侧的设备控制器(UDC),下面我们来具体看一下。

2、设备控制器(UDC)

USB设备控制器(UDC)驱动指的是作为其他USB主机控制器的USB硬件设备上的底层控制器驱动。该硬件和驱动负责将一个USB设备依附于一个USB主机控制器上。

UDC驱动位于/drivers/usb/gadget目录下。

2.1、usb_gadget – USB从机设备

struct usb_gadget {
    
    
  struct work_struct    work; 
  struct usb_udc      *udc; 
  /* readonly to gadget driver */
  const struct usb_gadget_ops  *ops; 
  struct usb_ep      *ep0; 
  struct list_head    ep_list;
  enum usb_device_speed    speed; 
  enum usb_device_speed    max_speed; 
  enum usb_device_state    state; 
  const char      *name;
  struct device      dev;
  unsigned      isoch_delay; 
  unsigned      out_epnum; 
  unsigned      in_epnum;
  unsigned      mA;  
  struct usb_otg_caps    *otg_caps; 
   //标志是否支持某些功能
  unsigned      sg_supported:1;
  unsigned      is_otg:1;
  unsigned      is_a_peripheral:1;
  unsigned      b_hnp_enable:1;
  unsigned      a_hnp_support:1;
  unsigned      a_alt_hnp_support:1;
  unsigned      hnp_polling_support:1;
  unsigned      host_request_flag:1;
  unsigned      quirk_ep_out_aligned_size:1;
  unsigned      quirk_altset_not_supp:1;
  unsigned      quirk_stall_not_supp:1;
  unsigned      quirk_zlp_not_supp:1;
  unsigned      quirk_avoids_skb_reserve:1;
  unsigned      is_selfpowered:1;
  unsigned      deactivated:1;
  unsigned      connected:1;
  unsigned      lpm_capable:1;
};
字段 含义
struct work_struct work; sysfs_notify()使用的工作队列
struct usb_udc *udc; usb设备控制器
const struct usb_gadget_ops *ops; UDC操作函数
struct usb_ep *ep0; 端点0,用于驱动设置请求应答
struct list_head ep_list; 其他端口列表
enum usb_device_speed speed; 当前连接的USB主机速率
enum usb_device_speed max_speed; UDC能处理的最大速率
enum usb_device_state state; UDC状态
const char *name; 名称
struct device dev; 设备
unsigned isoch_delay; 设置等待请求
unsigned out_epnum; 最近使用的输出端点号
unsigned in_epnum; 最近使用的输入端点号
unsigned mA; 最近设置的mA值
struct usb_otg_caps *otg_caps; OTG功能

2.2、usb_gadget_ops – UDC操作函数


struct usb_gadget_ops {
    
    
  int  (*get_frame)(struct usb_gadget *);
  int  (*wakeup)(struct usb_gadget *);
  int  (*set_selfpowered) (struct usb_gadget *, int is_selfpowered);
  int  (*vbus_session) (struct usb_gadget *, int is_active);
  int  (*vbus_draw) (struct usb_gadget *, unsigned mA);
  int  (*pullup) (struct usb_gadget *, int is_on);
  int  (*ioctl)(struct usb_gadget *,
        unsigned code, unsigned long param);
  void  (*get_config_params)(struct usb_dcd_config_params *);
  int  (*udc_start)(struct usb_gadget *,
      struct usb_gadget_driver *);
  int  (*udc_stop)(struct usb_gadget *);
  void  (*udc_set_speed)(struct usb_gadget *, enum usb_device_speed);
  struct usb_ep *(*match_ep)(struct usb_gadget *,
      struct usb_endpoint_descriptor *,
      struct usb_ss_ep_comp_descriptor *);
};

以面的操作函数不涉及端点操作。

2.3、usb_ep – 端点


struct usb_ep {
    
    
  void      *driver_data;

  const char    *name;
  const struct usb_ep_ops  *ops; 
  struct list_head  ep_list;
  struct usb_ep_caps  caps;
  bool      claimed;
  bool      enabled;
  unsigned    maxpacket:16;
  unsigned    maxpacket_limit:16;
  unsigned    max_streams:16;
  unsigned    mult:2;
  unsigned    maxburst:5;
  u8      address;
  const struct usb_endpoint_descriptor  *desc; 
  const struct usb_ss_ep_comp_descriptor  *comp_desc;
};

重要字段及其含义如下:

字段 含义
const struct usb_ep_ops *ops 端点操作函数集
const struct usb_endpoint_descriptor *desc 端点描述符

2.4、usb_ep_ops – 端点操作函数


struct usb_ep_ops {
    
    
  int (*enable) (struct usb_ep *ep,
    const struct usb_endpoint_descriptor *desc);
  int (*disable) (struct usb_ep *ep);
  void (*dispose) (struct usb_ep *ep);

  struct usb_request *(*alloc_request) (struct usb_ep *ep,
    gfp_t gfp_flags);
  void (*free_request) (struct usb_ep *ep, struct usb_request *req);

  int (*queue) (struct usb_ep *ep, struct usb_request *req,
    gfp_t gfp_flags);
  int (*dequeue) (struct usb_ep *ep, struct usb_request *req);

  int (*set_halt) (struct usb_ep *ep, int value);
  int (*set_wedge) (struct usb_ep *ep);

  int (*fifo_status) (struct usb_ep *ep);
  void (*fifo_flush) (struct usb_ep *ep);
};

3、总结如下

  • 1、usb_gadget表示一个从机设备(UDC + 端点),它包含一些端点(包括端点0和其他端点)。所以它有一个端点列表成员ep_list, 初始化过程中会将所有需要的端点放到该链表中。

  • 2、 usb_gadget_ops主要用来操作UDC。

  • 3、 usb_ep表示一个端点,每个端点都有自己的操作函数usb_ep_ops。

  • 4、 usb_ep_ops主要用来操作端点。

猜你喜欢

转载自blog.csdn.net/weixin_45309916/article/details/120276249