VxWorks系统下大容量存储设备的主机控制器驱动实现方法与流程

文档序号:17220551发布日期:2019-03-27 11:54阅读:388来源:国知局
VxWorks系统下大容量存储设备的主机控制器驱动实现方法与流程

本发明属于嵌入式通信技术领域,具体涉及一种vxworks系统下大容量存储设备的主机控制器驱动实现方法。



背景技术:

通用串行总线(usb)是一种用于连接计算机与外围设备的串行接口标准,具有结构简单、配置灵活、即插即用、支持热插拔、可靠性高、成本低等优点。基于vxworks嵌入式操作系统完成usb接口主机控制器端的驱动设计和开发,能够很好的支持与usb外设的通信访问和控制。

目前vxworks嵌入式操作系统下提供的usb主机控制器驱动程序都是基于pci总线实现的,这些驱动程序不能直接应用于非pci总线架构的usb主机控制器上,需要完成驱动程序在非pci主机控制器上的移植工作,而且这些pci主机控制器驱动程序传输速率较慢或者不满足传输速率要求。此外,大多数非pci主机控制器驱动程序只能实现对低速和全速存储设备的支持,不支持大容量存储设备或不满足高速数据传输的要求。

为了能够在vxworks嵌入式操作系统下实现非pci主机控制器驱动程序的开发,使得该驱动程序能够同时支持低速、全速和高速三种传输速率的存储设备,需要提出一种vxworks系统下大容量存储设备的主机控制器驱动实现方法。



技术实现要素:

(一)要解决的技术问题

本发明要解决的技术问题是:如何设计一种非pci主机控制器驱动程序的实现方法,使得非pci主机控制器驱动程序能够同时支持低速、全速和高速三种传输速率的存储设备。

(二)技术方案

为了解决上述技术问题,本发明提供了一种vxworks系统下大容量存储设备的主机控制器驱动实现方法,包括以下步骤:

s1:将bsp中对pci总线的相关操作屏蔽掉,利用bsp取代配置空间,完成记录总线读写状态和数据结构改变操作;

s2:利用物理地址到虚拟地址的转换函数得到主机控制器初始化所用的寄存器基地址;把cpu地址映射为pci地址,将需要转换的地址值直接作为函数的返回值;修改主机控制器中断函数,使用vxworks提供的intconnect()函数直接进行中断挂接;

s3:利用主机控制器端口路由控制逻辑实现对低速、全速和高速三种传输速率的支持。

优选地,步骤s1具体为:

(1)修改主机处理器中的每一个pcii/o地址和内存地址的偏移量;

(2)修改主机控制器初始化部分,将usbpciclassfind()函数的第三个参数编程接口修改为0x80,表示非pci类型主机控制器,第五个参数驱动总线号指针指向usb_hcd_bus_info数据结构,第六个参数pci设备号和第七个参数pci功能号设置为null,其余参数不变;

(3)注释掉usbpciconfigheaderget()函数,手动配置pci配置头pcicfghdr,即设置寄存器基地址pcicfghdr.basereg[0]和中断向量号pcicfghdr.intline。

优选地,步骤s2具体为:

(1)在将hcd挂接到usbd的过程中,调用fncattach()函数时,所有连接到主机控制器的信息都存储在hcd_host类型的结构体中,主机控制器寄存器基地址就在该结构体中,通过调用物理地址到虚拟地址的转换函数cache_drv_phys_to_virt将物理地址转换成虚拟地址;

(2)在pci主机控制器中,调用usbmemtopci将虚拟地址转换成物理地址,而在非pci主机控制器中,直接使用虚拟地址而不用转换;

(3)在非pci主机控制器中将中断向量号与相应的中断服务程序直接关联,用vxworks系统提供的intconnect()函数直接注册,不用调用usbpciintconnect()中断函数。

优选地,当非pci控制器内包含一个ehci和一个或多个uhci,或包含一个ehci和一个或多个ohci时,一旦这些驱动被加载完成,ehci主机控制器接口函数fncattach()函数被usbd调用,ehci主机控制器被设置成所有端口的所有者,当有大容量存储设备接入时,usbd的roothub状态检测函数通过获取端口状态、复位,然后再次获取端口状态操作,首先调用ehci主机控制器的rootgetstatus()函数检测该设备类型,若检测到是高速设备,则保持对该端口的控制;若检测到不是高速设备,则放弃端口的控制权,然后调用uhci主机控制器或ohci主机控制器的rootgetstatus()函数检测设备类型,完成路由的切换;

在确定了大容量存储设备的类型后,调用usbdhcdattach(execfunc,&pcicfghdr,ptoken)函数将主机控制器驱动连接到usbd上。

优选地,usbdhcdattach(execfunc,&pcicfghdr,ptoken)函数中,execfunc参数的值根据主机控制器驱动类型ehci、ohci或uhci而定。

优选地,usbdhcdattach(execfunc,&pcicfghdr,ptoken)函数中,ptoken参数的值根据主机控制器驱动类型ehci、ohci或uhci而定。

(三)有益效果

本发明首先利用vxworks系统下的bsp取代pci配置空间,裁剪掉系统中调用pci总线的相关函数,实现对主机控制器的直接访问;然后将cpu地址映射为pci地址,利用物理地址到虚拟地址的转换函数得到主机控制器初始化所用的寄存器基地址,并修改主机控制器中断函数;最后,利用主机控制器端口路由控制逻辑将不同类型的hcd挂接到usbd上,实现对低速、全速和高速三种传输速率的支持。本发明提出的方法能够解决基于pci主机控制器传输速率较慢的问题,同时也为实现非pci主机控制器在vxworks下的驱动开发提供了较好的解决方案,提高了大容量存储设备的读写速度。

附图说明

图1是本发明的总体方法流程图;

图2是本发明中的usb2.0主机协议栈原理图;

图3是本发明中usb2.0主机控制器原理图。

具体实施方式

为使本发明的目的、内容、和优点更加清楚,下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。

针对vxworks下usb主机控制器驱动不能应用于非pci主机控制器,以及大多数pci主机控制器usb驱动传输速率较慢的问题,本发明提出了一种vxworks系统下大容量存储设备的主机控制器驱动实现方法。如图1所示,本发明提供的一种vxworks系统下大容量存储设备的主机控制器驱动实现方法,包括以下步骤:

s1:屏蔽pci相关函数

传统的pci主机控制器通过自身支持的pci接口读取命令,传输给usb硬件设备,并通过pci配置空间得到中断服务程序到中断行的挂接及解挂、主机控制器的基地址以及中断向量号。而由于非pci主机控制器没有配置空间的概念,因此需要将bsp中对pci总线的相关操作屏蔽掉,利用bsp取代配置空间,完成记录总线读写状态和数据结构改变等操作,即主要完成以下工作:

(1)修改主机处理器中的每一个pcii/o地址和内存地址的偏移量;

(2)修改主机控制器初始化部分,将usbpciclassfind()函数的第三个参数(编程接口)修改为0x80(表示非pci类型主机控制器),第五个参数(驱动总线号指针)指向usb_hcd_bus_info数据结构,第六个参数(pci设备号)和第七个参数(pci功能号)设置为null,其余参数不变;

(3)注释掉usbpciconfigheaderget()函数,手动配置pci配置头pcicfghdr,即设置pcicfghdr.basereg[0](寄存器基地址)和pcicfghdr.intline(中断向量号)。

s2:地址变换和中断函数挂接

本步骤中,利用物理地址到虚拟地址的转换函数得到主机控制器初始化所用的寄存器基地址;把cpu地址映射为pci地址,将需要转换的地址值直接作为函数的返回值;修改主机控制器中断函数,使用vxworks提供的intconnect()函数直接进行中断挂接。

具体为:

(1)在将hcd挂接到usbd的过程中,调用fncattach()函数时,所有连接到主机控制器的信息都存储在hcd_host类型的结构体中,主机控制器寄存器基地址就在该结构体中,通过调用物理地址到虚拟地址的转换函数cache_drv_phys_to_virt将物理地址转换成虚拟地址;

(2)在pci主机控制器中,调用usbmemtopci将虚拟地址转换成物理地址,而在非pci主机控制器中,直接使用虚拟地址而不用转换;

(3)在非pci主机控制器中将中断向量号与相应的中断服务程序直接关联,用vxworks系统提供的intconnect()函数直接注册,不用调用usbpciintconnect()中断函数。

s3:利用主机控制器端口路由控制逻辑实现对低速、全速和高速三种传输速率的支持

本步骤中,在ehcihcd被加载时,首先由ehci主机控制器接管所有端口,然后usbd通过获取端口状态、复位、再次获取端口状态的操作对存储设备类型进行识别,根据识别结果决定端口由哪个主机控制器控制,并通过usbdhcdattach()函数对不同类型的hcd进行连接,实现对低速、全速和高速三种传输速率的支持。

具体而言,ehci是为了支持usb2.0的高速模式而开发的主机控制器接口,它本身并不支持工作在低速和全速模式下的usb设备。如果大容量存储设备需要支持低速、全速和高速三种传输速率,必须有一个ehci驱动支持高速通信,同时还需要一个ohci驱动或者uhci驱动来处理主机控制器的低速与全速通信。usb2.0主机协议栈原理图如图2所示。

当非pci控制器内包含一个ehci和一个或多个uhci(或ohci)时,一旦这些驱动被加载完成,ehci主机控制器接口函数fncattach()函数被usbd调用,ehci主机控制器被设置成所有端口的所有者。当有大容量存储设备接入时,usbd的roothub状态检测函数通过获取端口状态、复位,然后再次获取端口状态操作,首先调用ehci主机控制器的rootgetstatus()函数检测该设备类型,若检测到是高速设备,则保持对该端口的控制;若检测到不是高速设备,则放弃端口的控制权,然后调用uhci主机控制器或ohci主机控制器的rootgetstatus()函数检测设备类型,完成路由的切换。usb2.0主机控制器原理图如图3所示。

在确定了大容量存储设备的类型后,调用usbdhcdattach(execfunc,&pcicfghdr,ptoken)函数将主机控制器驱动连接到usbd上。其中,execfunc和ptoken参数的值根据主机控制器驱动类型(ehci、ohci或uhci)而定。

以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和变形,这些改进和变形也应视为本发明的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1