VxWorks下USB驱动总结1

简介: <div id="cnblogs_post_body"> <p align="left"><span style="color:#3c3c3c"><span style="font-family:Times New Roman; font-size:24px">1、USB设备</span></span></p> <p align="left"><span style="color:#3

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主驱动栈结构的简单概括,共四层。

2011年12月13日 - midget - Midget Gem 的博客

数据发送路线及格式:客户驱动(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主驱动栈的各模块之间的功能联系。


2011年12月13日 - midget - Midget Gem 的博客

    通过图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设备,获取数据的功能。

相关文章
|
3月前
|
Linux 程序员
Linux系统中驱动之设备树的platform驱动实现
Linux系统中驱动之设备树的platform驱动实现
44 0
|
7月前
|
Linux
使用Linux内核里的spi屏驱动-fbtft
使用Linux内核里的spi屏驱动-fbtft
521 0
|
数据采集 Shell 芯片
vxworks的pci设备驱动调试
vxworks的pci设备驱动调试
595 0
vxworks的pci设备驱动调试
|
XML 芯片 数据格式
可编程 USB 转串口适配器开发板芯片的驱动文件
芯片驱动文件的结构较为简单,分为芯片说明、描述部分和测试指令部分,芯片描述部分包括作者信息、芯片说明、数据手册名称等,按照实际情况修改即可,下面重点说明测试指令部分。
可编程 USB 转串口适配器开发板芯片的驱动文件
|
XML 芯片 数据格式
可编程 USB 转串口适配器开发板芯片驱动文件说明
芯片选择下拉框内列出的每一个备选芯片的驱动文件和数据手册位于S2STool 工具文件夹中的chips 文件夹内,每一个芯片需要 1 个驱动文件和 1 个数据手册文件,用户可自行打开编辑,或者创建新的芯片驱动文件。 芯片驱动文件为 xml 格式,需要手工修改或者创建,芯片数据手册一般来自于网络,下载后复制到 chips 文件夹内即可。
可编程 USB 转串口适配器开发板芯片驱动文件说明