首页 Linux USB设备驱动开发

Linux USB设备驱动开发

举报
开通vip

Linux USB设备驱动开发null 嵌入式培训专家USB设备驱动开发 www.farsight.com.cn主讲:宋宝华今天的内容今天的内容 1.USB及驱动框架简介 1.1 USB协议 1.2 USB驱动的体系结构 2.主机端驱动 2.1 主机控制器驱动 2.2 设备驱动 3.设备端驱动 3.1 设备控制器驱动 3.2 gadget驱动 4. USB OTG USB协议(1)USB协议(1)设备、配置、接...

Linux USB设备驱动开发
null 嵌入式培训专家USB设备驱动开发 www.farsight.com.cn主讲:宋宝华今天的内容今天的内容 1.USB及驱动框架简介 1.1 USB 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 1.2 USB驱动的体系结构 2.主机端驱动 2.1 主机控制器驱动 2.2 设备驱动 3.设备端驱动 3.1 设备控制器驱动 3.2 gadget驱动 4. USB OTG USB协议(1)USB协议(1)设备、配置、接口和端点 拓扑结构 USB协议(2)USB协议(2)传输方式 控制(Control)传输方式 同步(Synchronization)传输方式 中断(Interrupt)传输方式 批量(Bulk)传输方式事务处理 USB协议(3)USB协议(3)设备状态 包格式USB控制器USB控制器主机、设备、OTG控制器USB接口USB接口A、Bmini、micro直观的例子—U盘描述符直观的例子—U盘描述符 bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 64 idVendor 0x0781 SanDisk Corp. idProduct 0x5151 bcdDevice 0.10 iManufacturer 1 SanDisk Corporation iProduct 2 Cruzer Micro iSerial 3 20060877500A1BE1FDE1 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 32 bNumInterfaces 1 bConfigurationValue 1 iConfiguration 0 bmAttributes 0x80 MaxPower 200mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 2 bInterfaceClass 8 Mass Storage bInterfaceSubClass 6 SCSI bInterfaceProtocol 80 Bulk (Zip) iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 2 Transfer Type Bulk Synch Type none wMaxPacketSize 512 bInterval 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x01 EP 1 OUT bmAttributes 2 Transfer Type Bulk Synch Type none wMaxPacketSize 512 bInterval 1 Language IDs: (length=4) 0409 English(US) lsusb USB驱动体系结构USB驱动体系结构从运行Linux的主机侧 从运行Linux的设备侧 USB主机端驱动体系结构USB主机端驱动体系结构USB主机控制器驱动USB主机控制器驱动数据结构: struct usb_hcd struct hc_driverstatic const struct hc_driver xxx_hc_driver = { .description = xxx_hcd_name, .product_desc = "xxx OTG Controller", .hcd_priv_size = sizeof(xxx_hcd_t), .irq = xxx_hcd_irq, .flags = HCD_MEMORY | HCD_USB2, .start = xxx_hcd_start, .stop = xxx_hcd_stop, .urb_enqueue = xxx_hcd_urb_enqueue, .urb_dequeue = xxx_hcd_urb_dequeue, .endpoint_disable = xxx_hcd_endpoint_disable, .get_frame_number = xxx_hcd_get_frame_number, .hub_status_data = xxx_hcd_hub_status_data, .hub_control = xxx_hcd_hub_control, };API: struct usb_hcd *usb_create_hcd (const struct hc_driver *driver, struct device *dev, char *bus_name); USB设备驱动体系结构USB设备驱动体系结构USB设备驱动数据结构和API USB设备驱动数据结构和API struct usb_driver static struct usb_driver skel_driver = { .name = "skeleton", .probe = skel_probe, .disconnect = skel_disconnect, .id_table = skel_table, }; struct usb_device_id static struct usb_device_id skel_table [] = { { USB_DEVICE(USB_SKEL_VENDOR_ID, USB_SKEL_PRODUCT_ID) }, { } }; MODULE_DEVICE_TABLE (usb, skel_table); USB字符设备 int usb_register_dev(struct usb_interface *intf, struct usb_class_driver *class_driver); void usb_deregister_dev(struct usb_interface *intf, struct usb_class_driver *class_driver); struct usb_class_driver { char *name; /*sysfs中用来描述设备名*/ struct file_operations *fops;/*文件操作结构体指针*/ int minor_base; /*开始次设备号*/ };USB设备驱动--URBUSB设备驱动--URBUSB请求块(USB request block,urb) USB设备驱动实例 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 USB设备驱动实例分析USB骨架程序 USB串口驱动 1 static int __init usb_serial_init(void) 2 { ... 6 /* 分配tty_driver */ 7 usb_serial_tty_driver = alloc_tty_driver(SERIAL_TTY_MINORS); ... 39 /* 注册tty_driver */ 40 result = tty_register_driver(usb_serial_tty_driver); ... 47 /* 注册USB驱动 */ 48 result = usb_register(&usb_serial_driver); 49 if (result < 0) 50 { 51 err("%s - usb_register failed", __FUNCTION__); 52 goto exit_tty; 53 } ... 72 } USB键盘驱动USB设备控制器驱动USB设备控制器驱动数据结构 struct usb_ep_ops static struct usb_ep_ops xxx_ep_ops = { .enable = xxx_ep_enable, .disable = xxx_ep_disable, .alloc_request = xxx_alloc_request, .free_request = xxx_free_request, .alloc_buffer = xxx_alloc_buffer, .free_buffer = xxx_free_buffer, .queue = xxx_ep_queue, .dequeue = xxx_ep_dequeue, .set_halt = xxx_ep_set_halt, }; struct usb_gadget_ops static const struct usb_gadget_ops xxx_udc_ops = { .get_frame = xxx_udc_get_frame, .wakeup = xxx_udc_wakeup, }; struct usb_gadget struct usb_gadget { const struct usb_gadget_ops *ops; //设备的操作集 struct usb_ep *ep0; //ep0, 处理setup()请求 struct list_head ep_list; //设备支持的ep的list enum usb_device_speed speed; //当前连接到host的速度 unsigned is_dualspeed:1; //支持full/high speed unsigned is_otg:1; //用到mini-AB接口,所以gadget driver必须提供USB OTG descriptor ... }; struct xxx_udc struct xxx_udc { struct usb_gadget gadget; struct usb_gadget_driver *driver; ... }; USB Gadget驱动--组成(1)USB Gadget驱动--组成(1)struct usb_gadget_driver static struct usb_gadget_driver zero_driver = { #ifdef CONFIG_USB_GADGET_DUALSPEED .speed = USB_SPEED_HIGH, #else .speed = USB_SPEED_FULL, #endif .function = (char *) longname, .bind = zero_bind, .unbind = __exit_p(zero_unbind), .setup = zero_setup, .disconnect = zero_disconnect, .suspend = zero_suspend, .resume = zero_resume, .driver = { .name = (char *) shortname, .owner = THIS_MODULE, }, };USB Gadget驱动--组成(2)USB Gadget驱动--组成(2)设备、配置、接口、端点描述符 static struct usb_device_descriptor device_desc = { ... };static struct usb_config_descriptor source_sink_config = { ... };static struct usb_config_descriptor source_sink_config = { ... };static struct usb_endpoint_descriptor fs_source_desc = { ... }; static struct usb_endpoint_descriptor fs_sink_desc = { ..., }; ....static const struct usb_descriptor_header *fs_source_sink_function [] = { (struct usb_descriptor_header *) &otg_descriptor, (struct usb_descriptor_header *) &source_sink_intf, (struct usb_descriptor_header *) &fs_sink_desc, (struct usb_descriptor_header *) &fs_source_desc, NULL, }; int usb_gadget_config_buf( const struct usb_config_descriptor *config, void *buf, unsigned length, const struct usb_descriptor_header **desc ) { ... /* then interface/endpoint/class/vendor/... */ len = usb_descriptor_fillbuf(USB_DT_CONFIG_SIZE + (u8*)buf, length - USB_DT_CONFIG_SIZE, desc); ... }USB Gadget驱动--组成(3)USB Gadget驱动--组成(3)setupstatic int zero_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) { struct zero_dev *dev = get_gadget_data (gadget); struct usb_request *req = dev->req; ... switch (ctrl->bRequest) { case USB_REQ_GET_DESCRIPTOR: ... case USB_REQ_SET_CONFIGURATION: ... case USB_REQ_GET_CONFIGURATION: ... case USB_REQ_SET_INTERFACE: ... case USB_REQ_GET_INTERFACE: ... /* respond with data transfer before status phase? */ if (value >= 0) { req->length = value; req->zero = value < w_length; value = usb_ep_queue (gadget->ep0, req, GFP_ATOMIC); if (value < 0) { DBG (dev, "ep_queue --> %d\n", value); req->status = 0; zero_setup_complete (gadget->ep0, req); } } /* device either stalls (value < 0) or reports success */ return value; }USB Gadget驱动--usb_requestUSB Gadget驱动--usb_requeststruct usb_request struct usb_request { void *buf; unsigned length; dma_addr_t dma; unsigned no_interrupt:1; unsigned zero:1; unsigned short_not_ok:1; void (*complete)(struct usb_ep *ep, struct usb_request *req); void *context; struct list_head list; int status; unsigned actual; }; API static inline struct usb_request * usb_ep_alloc_request (struct usb_ep *ep, gfp_t gfp_flags); static inline void usb_ep_free_request (struct usb_ep *ep, struct usb_request *req); static inline int usb_ep_queue (struct usb_ep *ep, struct usb_request *req, gfp_t gfp_flags); static inline int usb_ep_dequeue (struct usb_ep *ep, struct usb_request *req); USB Gadget驱动实例USB Gadget驱动实例zero gadget 串口gadget /* 注册USB gadget驱动和驱动. 570*/ 571static int __init gs_module_init(void) 572{ 573 int i; 574 int retval; 575 576 retval = usb_gadget_register_driver(&gs_gadget_driver); ... 600 retval = tty_register_driver(gs_tty_driver); ... 609 return 0; 610} file storageUSB OTG协议USB OTG协议OTG补充规范对USB的扩展 更具节能性的电源管理;允许设备以主机和外设两种形式工作 SRP协议 1. 为了节约电源延长电池的使用寿命,当总线上没有活动时,OTG主机将挂起总线电源VBUS。 2. B-device将先后执行数据线脉冲调制(data-line pul-sing)和VBUS脉冲调制(VBUS pulsing) 。 3. A-device检测到数据线脉冲调制或者VBUS脉冲调制后, 使能VBUS准备开始一个传输事务。 HNP协议 1. A-device在完成对B-device的使用后,可以通过查询B-device的 OTG性能描述符来判断是否支持HNP协议。如支持HNP,B-device将返回有效的OTG性能描述符,A-device 则产生一个set_feature命令(即HNP_Enable)来通知B-device可以在总线挂起的时候以主机方式工作,随后A-device挂起总线。 2. B-device通过上拉电阻(全速时)或者下拉电阻(高速时)拉低D+以示连接断开。随后,作为对B-device断开的响应,A- device使能它的数据线并开始以从机方式工作。完成这些转换后,B-device和A-device便各自以主机角色和外设角色使用总线。 3. 当B-device正常结束传输事务时便挂起VBUS使能其上拉电阻,重新以从机方式运行。A-device 检测到总线挂起后,发出一个连接断开信号并重新以主机方式工作。USB OTG驱动(1)USB OTG驱动(1)设备控制器新接口 struct usb_gadget { ... 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; ... }; /* used by external USB transceiver */ int usb_gadget_vbus_connect(struct usb_gadget *gadget); int usb_gadget_vbus_disconnect(struct usb_gadget *gadget); /* call this during SET_CONFIGURATION */ int usb_gadget_vbus_draw(struct usb_gadget *gadget, unsigned mA); /* these logically control the USB D+ pullup */ int usb_gadget_connect(struct usb_gadget *gadget); int usb_gadget_disconnect(struct usb_gadget *gadget); static inline int usb_gadget_wakeup (struct usb_gadget *gadget);USB OTG驱动(2)USB OTG驱动(2)Gadget驱动的修改 当gadget->is_otg 为真时,为每个配置提供一个OTG描述符 在SET_CONFIGURATION中通过“用户接口”(如printk、LED等) 报告 软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载 HNP可用 当suspend开始时,通过“用户接口” 报告HNP角色切换(B设备变为B主机,A设备变为A主机)的开始USB OTG驱动(3)USB OTG驱动(3)主机侧:USB core的更新 OTG 枚举和目标外设列表 struct usb_bus { ... u8 otg_port; /* 0, or index of OTG/HNP port */ unsigned is_b_host:1; /* true during some HNP roleswitches */ unsigned b_hnp_enable:1; /* OTG: did A-Host enable HNP? */ ... }; CONFIG_USB_SUSPEND /* selective suspend/resume for HNP */ extern int usb_suspend_device(struct usb_device *dev, u32 state); extern int usb_resume_device(struct usb_device *dev); 其他电源管理问 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 USB OTG驱动(4)USB OTG驱动(4)OTG收发器 struct otg_transceiver { struct device *dev; const char *label; u8 default_a; enum usb_otg_state state; struct usb_bus *host; struct usb_gadget *gadget; /* to pass extra port status to the root hub */ u16 port_status; u16 port_change; /* bind/unbind the host controller */ int (*set_host)(struct otg_transceiver *otg, struct usb_bus *host); /* bind/unbind the peripheral controller */ int (*set_peripheral)(struct otg_transceiver *otg, struct usb_gadget *gadget); /* effective for B devices, ignored for A-peripheral */ int (*set_power)(struct otg_transceiver *otg, unsigned mA); /* for B devices only: start session with A-Host */ int (*start_srp)(struct otg_transceiver *otg); /* start or continue HNP role switch */ int (*start_hnp)(struct otg_transceiver *otg); };华清远见Linux驱动课程华清远见Linux驱动课程嵌入式Linux驱动初级班 通过本课程的学习,学员可以掌握Linux下字符设备、块设备、网络设备的驱动程序开发,同时掌握嵌入式Linux的系统开发和分析 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 。嵌入式Linux驱动开发高级班 本课程以案例教学为主,系统地介绍Linux下有关FrameBuffer、MMC卡、USB设备的驱动程序开发。 嵌入式Linux驱动开发教材让我们一起讨论!让我们一起讨论!www.farsight.com.cn 谢谢!www.farsight.com.cn 谢谢!The success's road
本文档为【Linux USB设备驱动开发】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_958805
暂无简介~
格式:ppt
大小:1MB
软件:PowerPoint
页数:0
分类:互联网
上传时间:2011-10-17
浏览量:22