VxWorks下USB驱动总结1
1、USB设备
物理特征:4条电缆,电源线、地线、数据线、脉冲线;
速 度:低速1.5Mbps,全速12Mbps,高速480Mbps;
规范版本:1998年USB1.1,2000年USB2.0;
连 接:PCI总线<->USB控制器(OHCI/UHCI/EHCI)<->USB设备;
单个USB控制器最大连接个数:127;
距离限制:USB单条线缆长度不能超过5m,通过hub可延长至30m。
重要概念:主机-USB设备采用master-slave方式分工,所有通信都是主机发起的;在某一时刻,只有一个设备与主机通信。
一个USB物理设备可以抽象为一个或多个逻辑设备。
USB逻辑设备层次:逻辑设备->配置(configuration)->接口(interface)->端点(end point);
端点是一个地址标实,是驱动和设备数据交换的一个终点,类似于网络编程中的客户短套接字或者服务器端套接字。在USBD client和特定的设备endpoint之间的通道被称作管道(pipe),一个从驱动到设备的数据传输管道包括以下几个要素:
设备的端点(通过读取/设置配置、接口得到);
设备号(设备动态插入后由USBD分配);
传输方向(从设备到主机、或从主机到设备);
带宽要求;
延迟要求。
主机与USB间有4种传输方式:
控制(小批量数据、保证到达);
同步(大批量数据、定时传输、不能保证到达);
批量(大批量数据、保证到达);
中断(小批量数据、不定时产生、保证到达);
? 控制用于读取/设置USB设备,所有USB设备的端口0默认(或者说强制)给控制管道使用;
? 同步主要用时视频设备如摄像头定时产生的批量数据,允许在带宽不足的情况下丢弃部分数据包;
? 批量用于一次性的大批量数据传输;
? 中断用于异步数据入键盘(或鼠标)按下事件发生等。
系统为不同传输类型分配不同的可使用带宽。因此,控制管道必须占有10%的可用带宽,而批量管道不能达到USB的理想速率,实际中USB设备与主机的传输速率比理想速率低很多。
2、VxWorsk下USB协议栈
下图提供了一个USB主驱动栈结构的简单概括,共四层。

数据发送路线及格式:客户驱动(USB_IRP包)->USBD(URB包)->HCD(HRB包)。
>>>>在栈最底层的是硬件:USB主控制器(USB host controller),USB主控制器在嵌入式主机系统中控制USB,实现USB主机功能。目前,USB控制器主要有3类:
(1)(UHCI,universal host controller interface)通用的主控制器,由Intel最先设计并制定相应规范;
(2)(OHCI,open host controller interface)开放的主控制器,由Microsoft,C2ompaq和National Semicondtlctor最先设计并制定相应规范;
(3)(EHCI,enhanced host controller interface)增强的主控制器,该控制器支持USB2.O。
>>>>每一主控制器在其上都有相对应的主控制器驱动程序(HCD),这些设备驱动程序与底层的硬件相关,为上层提供统一的功能接口。相应的驱动分别在usbHcdOhciLib.c和usbHcdUhciLib.c中定义。
USB主机驱动(USBD)与底层硬件无关,通过HCD与底层控制器通信。USBD管理连接到主机上的每一个USB连接,并提供高层与USB设备通信的通道。除此之外,USB[)还自动对USB设备进行电源管理和分配带宽。在USB系统中,集线器(HUB)对USB系统的正常操作起到关键性作用,因此USBD直接对集线器进行控制。这就意味着USBD还具有控制USB设备和集线器动态插拔的能力。(USBD)是客户驱动和HCD之间的中介,接受客户发送来命令,发送给HCD,HCD在驱动硬件接受。USBD入口函数usbdCoreEntry(pURB_HEADER
pUrb),所有请求函数都先进入此函数,根据pUrb->function的值调用相应函数。
在主机栈的最顶层是USB设备驱动程序。设备驱动程序依赖USBD提供的通信通道,驱动连接到USB系统中的USB设备。
下图2显示了USB主驱动栈的各模块之间的功能联系。

通过图1/2的结构,可以看出USB主机栈的设计关键是USB主机驱动(USBD)的设计,USBD为USB设备驱动程序提供标准的USBD API;为主机控制器驱动提供HCDAPI。
一个用户设置interface例子(仅仅说明在执行一个操作的过程中Stack的数据流):
A:usbdInterfaceSet() 生成URB_INTERFACE_GET_SET结构的变量Urb,结构中第一个变量是URB_HEADER;
B:调用urbExecBlock(&Urb.header) USB消息队列??
C:调用usbdCoreEntry(pUrb) 进行消息派发;
D:由于pUrb->function=USBD_FNC_INTERFACE_SET,调用fncInterfaceSet(pUrb)->(USBD);
E:调用controlRequest()->(USBD)生成USB_IRP,USB_SETUP包;
F:调用usbdTransfer()->(USBD)生成URB_TRANSFER结构的变量Urb;
G:调用urbExecBlock(&Urb.header)->usbdCoreEntry(pUrb);
H:由于pUrb->function=USBD_FNC_TRANSFER,调用fncTransfer()->(USBD)生成USB_IRP包;
I:调用usbHcdIrpSubmit()->(HCD)生成HRB_IRP_SUBMIT结构hrb,
J:结构中第一个变量是HRB_HEADER,执行(*pNexus->hcdExecFunc) ((pVOID) &hrb); 这里HCD中也只有一个入口函数,在HCD注册时提供给系统,这里也就是hcdExecFunc所指向的函数。根据HCD类型选择注册usbHcdOhciExec()或者usbHcdUhciExec(),这两个函数都接受HRB数据,根据pHrb->function类型进行不同的处理。
上面例子中(*pNexus->hcdExecFunc) ((pVOID) &hrb);(在jx2410开发板采用ohciHCD)相当于执行usbHcdOhciExec((pVOID) &hrb)->(HCD),由于hrb->function=HCD_FNC_IRP_SUBMIT,调用fncIrpSubmit()->(HCD)在fncIrpSubmit里真正完成数据传送:
步骤包括:
(根据数据块个数)USER_FLUSH();
if (pPipe->busAddress == pHost->rootAddress)
rootIrpHandler() ;
else
busIrpHandler();
setIrpResult();
应用程序的关键在于发送合适的USB_IRP包,完成控制USB设备,获取数据的功能。
VxWorks下USB驱动总结1的更多相关文章
- VxWorks下USB驱动总结2
3:USBD驱动详解 这一部分将要描述USBD(USB Host Driver)的典型应用.例如初始化,client注册,动态连接注册,设备配置,数据传输,同时还探讨了USBD内部设计的关键特性.这部 ...
- 转: 嵌入式linux下usb驱动开发方法--看完少走弯路【转】
转自:http://blog.csdn.net/jimmy_1986/article/details/5838297 嵌入式linux下的usb属于所有驱动中相当复杂的一个子系统,要想将她彻底征服,至 ...
- 对于vxworks下硬盘驱动
1.曾经看到帖子说vxworks5.5下没有sata驱动,vxworks6.6下有,这样的说法恐怕不正确,由 于俺在5.5下也运用运用了sata硬盘,请注重这里俺只是说运用运用,没有说运用运用了sat ...
- Linux下USB驱动框架分析【转】
转自:http://blog.csdn.net/brucexu1978/article/details/17583407 版权声明:本文为博主原创文章,未经博主允许不得转载. http://www.c ...
- linux下usb驱动接口中端点介绍
端点 USB 通讯的最基本形式是通过一个称为端点的东西.一个USB端点只能向一个方向传输数据(从主机到设备(称为输出端点)或者从设备到主机(称为输入端点)).端点可被看作一个单向的管道. 一个 USB ...
- 八、USB驱动分析
学习目标:分析USB驱动源码结构. 一.Windows下USB驱动理论问题 1. 当usb设备接入PC时,右下角弹出"发现AAA",并弹出对话框,提示安装驱动程序.没有驱动程序,W ...
- Linux下 USB设备驱动分析(原创)
之前做过STM32的usb HID复合设备,闲来看看linux下USB设备驱动是怎么一回事, 参考资料基于韦东山JZ2440开发板,以下,有错误欢迎指出. 1.准备知识 1.1USB相关概念: USB ...
- Linux下usb设备驱动详解
USB驱动分为两块,一块是USB的bus驱动,这个东西,Linux内核已经做好了,我们可以不管,我们只需要了解它的功能.形象的说,USB的bus驱动相当于铺出一条路来,让所有的信息都可以通过这条USB ...
- Linux 下wifi 驱动开发(四)—— USB接口WiFi驱动浅析
源: Linux 下wifi 驱动开发(四)—— USB接口WiFi驱动浅析
随机推荐
- c# 类属性和方法
属性 public 类字段 就相当于c#里面暴露给外面的属性 类似nodejs的 module.exports 但是属性又不同于普通的字段,属性只是外部包装字段 没有自己的任何含量 类似退换后的方法. ...
- 基于Vue2写的一个有关美食项目
刚学Vue练习的一个项目 使用Vue2+vue-router+vuex+axios+webpack router使用了默认的hash模式 引入了高德地图和element-ui 项目地址点击这里 演示地 ...
- AutoDesk Forge 获取令牌认证
创建应用程序 在开始使用Forge Platform之前,您需要设置一个应用程序并获取您的客户端ID和密码. 步骤1:登录Dev Portal 去开发门户网站:https://developer.au ...
- BZOJ 3295: [Cqoi2011]动态逆序对 [CDQ分治]
RT 传送门 首先可以看成倒着插入,求逆序对数 每个数分配时间(注意每个数都要一个时间)$t$,$x$位置,$y$数值 $CDQ(l,r)$时归并排序$x$ 然后用$[l,mid]$的加入更新$[mi ...
- 存个emacs配置
emacs配置 (global-set-key [f9] 'compile-file) (global-set-key [f10] 'gud-gdb) (global-set-key (kbd &qu ...
- My GitHub
0.引言 利用python开发,借助Dlib库捕获摄像头中的人脸,进行实时特征点标定: 图1 工程效果示例(gif) 图2 工程效果示例(静态图片) (实现比较简单,代码量也比较少,适合入门或者兴趣学 ...
- Maven常用命令及在Eclipse中的应用
1.常用命令 mvn archetype:generate--构建项目 mvn clean--项目清理 mvn test--项目单元测试的编译 mvn compile--项目源代码的编译 mvn pa ...
- 聚类-K均值
数据来源:http://archive.ics.uci.edu/ml/datasets/seeds 15.26 14.84 0.871 5.763 3.312 2.221 5.22 Kama 14.8 ...
- dubbox系列【二】——dubbox admin环境搭建
1.环境 JDK7+ zookeeper 3.3.6 tomcat 7+ 2.搭建步骤 (1)安装zookeeper 单机模式:参考这里. 伪集群模式:参考这里. ①单机或伪集群模式均可. ②笔者使用 ...
- service不死之身
为了应用常驻后台,避免被第三方杀掉的方法 1)Service设置成START-STICKY kill 后会被重启(等待5秒左右),重传Intent,保持与重启前一样 2)通过startForegrou ...