700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Linux-USB驱动笔记(七)--设备控制器(UDC)驱动

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

时间:2019-10-09 13:19:57

相关推荐

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

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

1、前言2、设备控制器(UDC)2.1、usb_gadget -- USB从机设备2.2、usb_gadget_ops -- UDC操作函数2.3、usb_ep -- 端点2.4、usb_ep_ops -- 端点操作函数 3、总结如下

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 devicedev;unsignedisoch_delay; unsignedout_epnum; unsignedin_epnum;unsignedmA; struct usb_otg_caps *otg_caps; //标志是否支持某些功能unsignedsg_supported:1;unsignedis_otg:1;unsignedis_a_peripheral:1;unsignedb_hnp_enable:1;unsigneda_hnp_support:1;unsigneda_alt_hnp_support:1;unsignedhnp_polling_support:1;unsignedhost_request_flag:1;unsignedquirk_ep_out_aligned_size:1;unsignedquirk_altset_not_supp:1;unsignedquirk_stall_not_supp:1;unsignedquirk_zlp_not_supp:1;unsignedquirk_avoids_skb_reserve:1;unsignedis_selfpowered:1;unsigneddeactivated:1;unsignedconnected:1;unsignedlpm_capable:1;};

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;boolclaimed;boolenabled;unsigned maxpacket:16;unsigned maxpacket_limit:16;unsigned max_streams:16;unsigned mult:2;unsigned maxburst:5;u8address;const struct usb_endpoint_descriptor *desc; const struct usb_ss_ep_comp_descriptor *comp_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主要用来操作端点。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。