linux设备驱动之USB数据传输分析.doc

  1. 1、本文档共73页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
linux设备驱动之USB数据传输分析.doc

linux设备驱动之USB数据传输分析 本文系本站原创,欢迎转载! 转载请注明出处:/ 三:传输过程的实现 说到传输过程,我们必须要从URB开始说起,这个结构的就好比是网络子系统中的skb,好比是I/O中的bio.USB系统的信息传输就是打成URB结构,然后再过行传送的. URB的全称叫USB request block.下面从它的接口说起. 3.1:URB的相关接口 1:URB的创建 URB的创建是由usb_alloc_urb()完成的.这个函数会完成URB内存的分配和基本成员的初始化工作.代码如下: struct urb *usb_alloc_urb(int iso_packets, gfp_t mem_flags) { ?? struct urb *urb; ? ??? urb = kmalloc(sizeof(struct urb) + ??????? iso_packets * sizeof(struct usb_iso_packet_descriptor), ??????? mem_flags); ??? if (!urb) { ??????? err(alloc_urb: kmalloc failed); ??????? return NULL; ??? } ??? usb_init_urb(urb); ??? return urb; } 这个函数有两个参数,一个是iso_packets.仅仅用于ISO传输.表示ISO数据包个数,如果用于其它类型的传输,此参数为0.另一个是mem_flags.是分配内存的参数. Usb_init_urb()如下: void usb_init_urb(struct urb *urb) { ??? if (urb) { ??????? memset(urb, 0, sizeof(*urb)); ??????? kref_init(urb-kref); ??????? INIT_LIST_HEAD(urb-anchor_list); ??? } } 由此可以看到,它的初始化只是初始化了引用计数和ahchor_list链表.这个链表在URB被锁定的时候会用到. ? 2:URB的初始化 USB2.0 spec中定义了四种传输,为别为ISO,INTER,BULK,CONTORL.linux kernel为INTER,BULK,CONTORL的URB初始化提供了一些API,ISO的传输只能够手动去初始化.这些API如下: static inline void usb_fill_control_urb(struct urb *urb, ??????????????????? struct usb_device *dev, ??????????????????? unsigned int pipe, ??????????????????? unsigned char *setup_packet, ??????????????????? void *transfer_buffer, ??????????????????? int buffer_length, ??????????????????? usb_complete_t complete_fn, ??????????????????? void *context) static inline void usb_fill_bulk_urb(struct urb *urb, ??????????????? ???? struct usb_device *dev, ??????????????? ???? unsigned int pipe, ??????????????? ???? void *transfer_buffer, ??????????????? ???? int buffer_length, ??????????????? ???? usb_complete_t complete_fn, ??????????????? ???? void *context) static inline void usb_fill_int_urb(struct urb *urb, ??????????????? ??? struct usb_device *dev, ??????????????? ??? unsigned int pipe, ??????????????? ??? void *transfer_buffer, ??????????????? ??? int buffer_length, ??????????????? ??? usb_complete_t complete_fn, ??????????????? ??? void

文档评论(0)

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

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

1亿VIP精品文档

相关文档