USB设备驱动开发-USBGadgetDriver讲解.docx

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
一、Linux USB Gadget Driver功能 ??????为了与主机端驱动设备的USB Device Driver概念进行区别,将在外围器件中运行的驱动程序称为USB Gadget Driver。其中,Host端驱动设备的驱动程序是master或者client driver,设备端gadget driver是slave或者function driver。 ?????? Gadget Driver和USB Host端驱动程序类似,都是使用请求队列来对I/O包进行缓冲,这些请求可以被提交和取消。它们的结构、消息和常量的定义也和USB技术规范第九章的内容一致。同时也是通过bind和unbind将driver与device建立关系。 二、Linux USB Gadget Driver核心数据结构 1. USB_Gadget对象 struct usb_gadget { /* readonly to gadget driver */ const struct usb_gadget_ops *ops; //Gadget设备操作函数集 struct usb_ep *ep0; //控制端点,只对setup包响应 struct list_head ep_list;//将设备的所有端点连成链表,ep0不在其中 enum usb_device_speed speed;//高速、全速和低速 unsigned is_dualspeed:1; //是否同时支持高速和全速 unsigned is_otg:1; //是否支持OTG(On-To-Go) unsigned is_a_peripheral:1; unsigned b_hnp_enable:1; unsigned a_hnp_support:1; unsigned a_alt_hnp_support:1; const char *name; //器件名称 struct device dev; //内核设备模型使用 }; 2. Gadget器件操作函数集 操作UDC硬件的API,但操作端点的函数由端点操作函数集完成 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); }; 3. USB Gadget driver对象 struct usb_gadget_driver { char *function; //驱动名称 enum usb_device_speed speed; //USB设备速度类型 int (*bind)(struct usb_gadget *); //将驱动和设备绑定,一般在驱动注册时调用 void (*unbind)(struct usb_gadget *);//卸载驱动时调用,rmmod时调用 int (*setup)(struct usb_gadget *, const struct usb_ctrlrequest *); //处理ep0的控制请求,在中断中调用,不能睡眠 void (*disconnect)(struct usb_gadget *); //可能在中断中调用不能睡眠 void (*suspend)(struct usb_gadget *); //电源管理模式相关,设备挂起 void (*resume)(struct usb_gadget *);//电源管理模式相关,设备恢复 /* FIXME support safe rmmod */ struct device_driver driver; //内核设备管理使用 }; 4. 描述一个I/O请求 struct usb_request { void *buf; //数据缓存区 unsigned length; //数据长度 dma_addr_t dma; //与buf关联的DMA地址,DMA传输时使用 unsigned no_interrupt:1;//当为true时,表示没有完成函数

文档评论(0)

shuwkb + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档