新闻中心

EEPW首页>嵌入式系统>设计应用> VxWorks下的同类USB设备管理方法

VxWorks下的同类USB设备管理方法

作者: 时间:2013-10-08 来源:网络 收藏


  2.2设备列表设计

  为了方便对设备的管理,USB设备列表可采用双向链表结构,其作用是将所有USB设备的有关信息组织起来,从而实现对多个设备的链式管理。前面提到的设备描述符就是一个存储了设备信息的数据结构。而所有USB设备描述符都是以设备头数据结构开始的,这样,就可以很方便地将设备描述符组成一个链表形式的设备列表。通常链表的数据结构如下:


  图3所示是一个空设备列表,而非空设备列表则如图4所示。


  对于设备,通常程序只维护一张设备列表,在注册该USB设备驱动程序时,初始化设备列表为空,驱动程序只能被真正的注册一次,因此,设备列表也只初始化一次。当驱动程序中的回调函数检测到有设备动态接人时,系统会在创建设备、分配设备资源的同时将设备描述符加入到设备列表,而且只将其加入到设备列表的尾部。而在有设备动态移除时,驱动程序回调函数会捕获移除动作,并根据设备的标识遍历设备列表,以查找出移除的设备,然后将其描述符从设备列表中删除。遍历设备列表其实就是一个查找设备的过程。查找设备时,每一个设备都需要用唯一的一个标识来与其它设备区别,从而引出了设备的唯一标识问题。

  2.3 USB设备的标识问题

  同I/O系统标识设备一样,对于USB设备的标识。也可以采用设备名来标识。这样可以给用户一个直观的概念,而且便于记忆。利用设备头(USB_DEV_HDR)中的name指针域可以为每一个接入的设备起一个名字。这样,对于不同的设备,就可以用名字字符串来唯一区分,但这不利于快速访问设备,因为在每次查找设备的时候对于每一个设备链表节点都要进行一次字符串比较,这样便延长了查找设备的时间。针对USB设备及下USB协议栈的特点,充分利用USBD对USB设备的标识,在设计中可采用USBD_NODEjD来标识设备。在中的USB协议栈中。对每一个USB设备为其分配一个唯一的USBD_NODE_ID号。事实上,USBD并不关心设备与哪一个USB主控制器相连,也不关心物理设备的连接细节以及地址分配,USBD通常只是采用USBD_NODE_ID来定位设备。因此,基于USBD对USB设备的定位方法,在采用链表对USB设备进行管理时,也可以采用USBD_NODE_ID来唯一标识一个USB设备。在用该方法标识设备时,可将USBD_NODE_ID nodeld作为USB设备描述符结构体的一个成员,其设备描述符结构改造如下:


  由于USBD_NODE_ID是一个32位无符号整型数,因此,在查找设备时,可以用switch case语句来完成。

  2.4设备访问技术

  由于设备是独立于I/O系统的,因此不存在驱动程序列表和文件描述符表。设计时,可采用驱动程序直接向应用程序提供可访问设备的接口函数,以替代驱动程序列表,而采用USBD_NODE_ID数组来存放多个USB设备的标识,以替代文件描述符表,如:USBD_NODE_ID usbd_node_id[MAX_DEV_NUM]。

  对于设备,根据其Product ID的不同,可将其记为O、l、2……MAX_DEV_NUM号设备,并分别将其USBD_NODE_ID存放于数组的对应位置。这样,在访问设备时,就可利用设备号来代替文件描述符,例如在读取0号设备时,由其索引值0,就可得到其USBD_NODE_ID为USBD_NODE_ID usbd_node_id[O],再从设备列表中查找出nodeld为usbd_node_id[O]的设备结构体,就可最终得到设备资源。通过USBD_NODE_ID数组来管理多个设备的nodeld如图5所示。



评论


相关推荐

技术专区

关闭