vxWorks中USB驱动栈-1

原创 2011年09月11日 09:44:16

    USB模块可以分为多端口主机(MPH)模块和双角色(DR)模块,它们都能够连接一个或者二个外部端口,这些模块和外部端口总称为USB接口。Mpc8379的USB模块采用的是DR,它的寄存器和数据结构均基于Intel的EHCI(Enhanced Host Controller Interface Specification for Universal Serial Bus),DR模块可以充当USB总线上的主机、外设、以及支持便携式On-The-Go(OTG))可协商主机/外设。

    DR模块有三个基本操作模式:主机(Host)、设备和OTG。可以把DR模块配置成使用UTMI、ULPI 或者FS/LS串行收发器中的任何一种PHY接口。由于引脚的限制,UTMI接口只能用在设备操作模式。值得注意的是,设备模式下的DR模块不支持LS操作。8377使用的phy芯片smsc3300的接口为ULPI(UTMI + Low Pin Interface)。

    风河USB为通用串行总线提供USB传输初始化(USB hosts)和允许vxWorks目标作为USB外设的支持,USB hosts(又叫USB host stack)和USB外设(又叫USB peripheral stack)都遵循USB 2.0规约。Host Stack使vxWorks可以使用USB设备,而Peripheral Stack允许Windows机器将vxWorks板当做一个USB设备。这里先介绍Host,下图为USB Host驱动栈结构:

    USB Host Stack驱动包括USB驱动(USBD)、主机控制驱动(HCD)、hub驱动和class驱动。风河为标准接口协议EHCI、UHCI、OHCI提供HCD驱动,另外,还为USB控制器提供了root hub diver,为各种USB外设提供class driver合集。其中,USBD是硬件独立的,它提供了驱动栈上层(包括USB class drivers)与USB总线的通讯通道,还负责电源管理、USB带宽管理、动态挂载/释放USB设备等功能。下图为vxWorks中所体现的USB Host Stack组成图:

 

 

    这里从上往下来理解,usbTool是风河提供的USB测试工具包,从使用usbTool的过程可知,USB在初始化时的步骤如下:

1、先执行usbInit初始化USB2的Host Stack,源码如下:

STATUS usbInit (void)
{
	if (!usbdInitByKernel)
		{
			/* 为USB驱动设置内存空间(默认2M)*/
			ossPartSizeSet(USB_MEM_PART_SIZE);

      /* 初始化USB2 Host Stack,主要初始化USBD2.0层的全局变量*/
      if (usbdInit() == OK)
      	{
      		usbdInitByKernel = TRUE;
#ifdef DEBUG_ANNOUNCE_USB
          printf("USB2 Host Stack Initialized\n");
#endif
/*注册USB Hub Class驱动到USB Host驱动栈,以及初始化USB1.1转换层*/
      if ((usrUsbHubInit() != OK) || (usbdTranslationInit() != OK))
      	{
      		return ERROR;
      		}
      		}
      }
  else
  	{
  		printf("USB2 Host Stack Already Initialized\n");
  	}
  	return OK;
}

2、然后执行usbdInitialize初始化USBD,该函数在系统调用其他USBD函数前必须执行一次以上,有一个公用计数器guUSBDInited ,Initialize函数时会加1,ShutDown时会减1,大于0时表示初识化完成,注意:由于usbdInitialize可以嵌套执行,所以在执行计数器操作时,必须要遵循互斥访问规则。它用于准备访问URBs所需的USBD和传送单元。oss为O/S-independent services,用于保护互斥信号量。Host Stack的USBD2.0和Hub class模块的源码可以参考这两个目录:

installDir/target/src/hwif/usbinstallDir/target/src/hwif/busCtlr/usb/hub

3、再初始化EHCI、OHCI、UHCI控制器,在usbTool中,这个过程叫做Attach,用于初始化hcd并注册到vxBus。先后调用usbxhcdInit和vxbUsbxhciRegister两个函数,前者的使用过程实际上就是调用usbHstHCDRegister,将HCD注册到USBD中,这里涉及到一个结构体USBHST_HC_DRIVER,它包含了HCD的函数指针,在HCD初始化时会将它传给USBD,后者利用这些指针和HCD进行通信。该结构体定义如下:

typedef struct usbhst_hc_driver
    {
    /* 用于此HCD的总线数目 */
    UINT8       uNumberOfBus;
   /* 结构体vxbBusTypeInfo保存总线信息 */  
   struct vxbBusTypeInfo        * pUsbHcdBusType;
   /*下面均为函数指针*/
    /* 从frame number Reg中获取num*/
    USBHST_STATUS   (*getFrameNumber)  (UINT8   uBusIndex,
                                        UINT16 *puFrameNumber);

    /* 设置frame位宽 */
    USBHST_STATUS   (*setBitRate)      (UINT8   uBusIndex,
                                        BOOL    bIncrement,
                                        UINT32 *puCurrentFrameWidth);

    /* 判断总线带宽是否足够支持接口设置的改动 */
    USBHST_STATUS   (*isBandwidthAvailable)
                                           (UINT8   uBusIndex,
                                            UINT8   uDeviceAddress,
                                            UINT8   uDeviceSpeed,
                                            UCHAR  *pCurrentDescriptor,
                                            UCHAR  *pNewDescriptor);

    /* 为特定USB endpoint解析并创建pipe */
    USBHST_STATUS   (*createPipe)      (UINT8   uBusIndex,
                                        UINT8   uDeviceAddress,
                                        UINT8   uDeviceSpeed,
                                        UCHAR  *pEndPointDescriptor,
                                        UINT16  uHighSpeedHubInfo,
                                        UINT32 *puPipeHandle);

    /* 修改默认pipe属性(address 0,endpoint 0) */
    USBHST_STATUS   (*modifyDefaultPipe)
                                           (UINT8   uBusIndex,
                                            UINT32  uDefaultPipeHandle,
                                            UINT8   uDeviceSpeed,
                                            UINT8   uMaxPacketSize,
                                            UINT16   uHighSpeedHubInfo);

    /* 删除pipe */
    USBHST_STATUS   (*deletePipe)      (UINT8   uBusIndex,
                                        UINT32  uPipeHandle);

    /* pipe上的请求pending  */
    USBHST_STATUS   (*isRequestPending)(UINT8   uBusIndex,
                                        UINT32  uPipeHandle);

    /* 提交请求到endpoint,URB:USB Request Block  */
    USBHST_STATUS   (*submitURB)       (UINT8          uBusIndex,
                                        UINT32         uPipeHandle,
                                        pUSBHST_URB    pURB);

    USBHST_STATUS   (*cancelURB)       (UINT8          uBusIndex,
                                        UINT32         uPipeHandle,
                                        pUSBHST_URB    pURB);

  /* 以下两个用于处理split transaction时出现的错误 */
    USBHST_STATUS (*clearTTRequestComplete)(UINT8         uRelativeBusIndex,
                                            void *         pContext,
                                            USBHST_STATUS nStatus);
    /* Function pointer to submit the status of the reset TT request */
    USBHST_STATUS (*resetTTRequestComplete)(UINT8         uRelativeBusIndex,
                                            void *         pContext,
                                            USBHST_STATUS nStatus);
} USBHST_HC_DRIVER, *pUSBHST_HC_DRIVER;

后者则分析意义不大,全部都是调用vxbDevRegister注册到vxBus上。

    至于这些驱动,风河已经编译好了(郁闷,还是只能看代码学习),见目录installDir/target/src/hwif/busCtrl/usb/hcd,三种接口都分开放置了,尽管一次只能使用一种接口,但风河允许同时添加多个接口驱动,从而加强了产品的兼容性。到这里需要注意,添加usbTool就不能添加其他任何Init函数,否则会编译出错。

    若不是有usbTool,将组件完全包含后,系统若要使用USBD2.0接口,需要在vxWorks启动时经历4步初始化过程:

1、根据选择的组件将USB host控制器注册到vxBus。该过程是vxBus发现控制器设备并执行特定的vxBus初始化操作,调用函数为vxbUsbControllerRegister,

2、执行USBD入口函数usbdInit,

3、执行usbHubInit初始化hub class Drivers;

4、执行usbHcdInit将特定的HCD注册到USBD。

    上图中还有个OSAL,该组件用于为vxWorks关于host Stack的操作系统服务提供一个抽象、简化的视图。它包含了进程管理、互斥量、内存调度以及系统时间等,在usbd中,就是ossLib库。需要注意,在编写USB驱动时,需要有大部分精力是放在互斥访问和内存调度上的。

浅谈USB驱动架构

去年,老师让我分析基于HD3系统芯片的WindowsCE USB驱动的可行性。USB驱动非常庞大,多个软件层次相互交错,以及各种协议,USB系统对于一般人很难理解,我对其也只是理解一个大概,下面,我对...
  • u014276460
  • u014276460
  • 2015年08月05日 14:32
  • 1287

学习windows驱动(设备对象设备栈)

IO相关的操作是围绕设备对象进行的。设备对象分下几类:1、功能设备对象(FDO): 功能驱动为设备创建一个FDO,在设备栈里它位于物理设备(PDO)的上层。2、物理设备对象(PDO): 总线驱动创建P...
  • mofabang
  • mofabang
  • 2015年10月28日 10:50
  • 915

vxWorks中USB驱动栈-2

接上篇文章 介绍完了Host,再来看下Peripheral驱动栈,下图为Peripheral驱动栈的结构图:     风河USB Peripheral驱动栈中,位于底层的是目标控制器TC,它是P...
  • JuanA1
  • JuanA1
  • 2011年09月13日 22:36
  • 5201

VxWorks下USB驱动总结2

3:USBD驱动详解 这一部分将要描述USBD(USB Host Driver)的典型应用。例如初始化,client注册,动态连接注册,设备配置,数据传输,同时还探讨了USBD内部设计的关键特性。...
  • mao0514
  • mao0514
  • 2014年03月12日 09:38
  • 2480

Tornado2.2.1(vxworks5.5.1)编译USB及安装USB2.2新版本

当前使用的版本是Tornado2.2.1(vxworks5.5.1),创建一个基于PENTIUM的工程,发现USB相关的都是不可用的(斜体): 首先安装platform_usb22更新(这个更新在网...
  • dijkstar
  • dijkstar
  • 2013年03月31日 12:18
  • 3098

VxWorks下的USB驱动程序原理与分析

转自:http://203.208.39.132/search?q=cache:4LVM04akD3QJ:www.eefocus.com/article/08-06/2203512090642O2f5...
  • qingfengtsing
  • qingfengtsing
  • 2012年03月28日 11:13
  • 3065

VxWorks下USB驱动总结1

1、USB设备 物理特征:4条电缆,电源线、地线、数据线、脉冲线; 速 度:低速1.5Mbps,全速12Mbps,高速480Mbps; 规范版本:1998年USB1.1,2000年USB2.0;...
  • mao0514
  • mao0514
  • 2014年03月12日 09:37
  • 1915

vxworks的堆和栈

vxworks的堆和栈区别 系统内存池 系统内存池用于动态内存的分配(如malloc())、任务的堆栈和控制块及VxWorks运行时需要的内存。这部分内存有VxWorks管理,开销位于目标板上。...
  • zyboy2000
  • zyboy2000
  • 2013年12月29日 16:38
  • 3126

vxWorks内核解读四--中断

接下来我们讨论一下Wind内核的中断处理模块,中断是操作系统内核设计中非常重要的部分。由于周期性和非周期性任务的按时执行都离不开中断,并且大多数实时任务的调度都是由中断引发的,中断管理对于实时系统来说...
  • u010383937
  • u010383937
  • 2017年05月16日 11:00
  • 649

vxWorks中对时间的精确统计2

wasuke大虾确实很严谨。争辩也没有关系呀,论坛本来就是通过讨论,达到相互学习,共同成长的目的嘛。 不过我对于你提出的一些观点有一些不解。下面做一些分析。 把tick设置成1ms再用ti...
  • bbs598598
  • bbs598598
  • 2013年03月14日 21:12
  • 4056
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:vxWorks中USB驱动栈-1
举报原因:
原因补充:

(最多只允许输入30个字)