- UID
- 872238
|
1.2 USB 驱动程序设计
μC/OS-II 提供了多任务实时操作系统的内核。在应用这个操作系统时候,用户通常需要自己编写基于μC/OS-II 的外围器件驱动程序,以使外围器件能在操作系统的协调下更好的为用户服务。为了使软件可移植性强,易维护,采用分层的方法编写USB 的驱动程序。综合考虑USB 协议、USB 硬件接线、μC/OS-II的结构来进行分层,下表所列为USB 驱动程序分层结构。
1.2.1 USB 硬件抽象层。
USB 硬件抽象层的主要任务是对USB 模块的相关硬件进行配置,是USB 驱动程序的最底层与具体硬件相关的一层。主要完成的任务:初始化USB 设备控制器为系统配置USB 时钟控制器,选择信号映射端口(在LPC 系列中只有LPC2378 有此功能),配置电源;配置USB 设备控制器中断,此系统禁止了同步传输帧中断,使端点处于低优先级中断;以及配置软件控制接连、断开和重新连接USB 功能的相关寄存器。
1.2.2 USB 命令接口层。
USB 命令接口层是在USB 硬件的角度来描述USB 的具体功能是独立于操作系统之外的,也是协议层和驱动层实现的基础。USB 命令接口层函数基本是和具体的USB 寄存器相关的,通过操作寄存器完成相应的功能。
1.2.3 USB 协议层。
USB 协议层主要由 Descriptor.c 和Chap_9.c 文件组成。在Descriptor.c 定义了各描述符,是在USB 硬件的基础上描述此读卡器的USB 模块,分别为:设备描述符、配置描述符、接口描述符和端点描述符。这些描述符也是上位机枚举、识别读卡器USB 模块的媒介。而Chap_9.c 就是上位机枚举读卡器USB 模块时USB 模块回馈上位机的具体实现,其中大部分函数都是依赖于USB 命令接口层。
1.2.4 USB 驱动层。
USB 驱动层是属于USB 驱动程序中最上层的是与μC/OS-II 系统联系最紧密的一层。在其他各层的基础上从系统的角度描述了USB 通信功能,是与操作系统和应用程序直接联系的一层。包括系统启动时初始化USB 硬件的接口以及等待接收主机枚举过程发送的SETUP 包等函数的接口。其中USB 端点的读写函数USB_ReadPort(INT8U endp, INT32U eppsize,INT8U buffnums, CTRL_USB *pUsb, INT32U len,INT8U *recbuff, INT16U timeout) 和USB_WritePort(INT8U endp, INT32U eppsize, INT8Ubuffnums, CTRL_USB *pUsb, INT8U *sendbuff,INT32U len, INT16U timeout)实现了接收上位机的请求和将处理结果返回给上位机。
以读函数为例描述USB 接收上位机请求的过程,由函数原型的最后一个参数timeout 可知,读过程是一种阻塞性的操作,在此系统中是以信号量的方式来实现阻塞型的读操作的。在参数检测无误时调用USB_WaitEpReady(pUsb, timeout)以获取该端点对应信号量,若获取失败则此端点无数据可读。当上位机发送数据到相应的端点时会产生中断,中断处理程序会判断哪个端点产生了中断,然后发送此端点所对应的信号量,这样USB_WaitEpReady(pUsb, timeout)就可以获得信号量完成读操作,否则程序会等待timeout时间,如果在timeout 时间内依然获取信号量失败那程序就出错返回。若读取长度大于端点缓冲区的长度的话则一次只能读取端点缓冲区长度数,分多次读取,直到读取规定长度为止。写端点函数发送过程和读端点函数接收过程实现流程大体相似,其中最大的区别就是中断产生的时机不同,接收过程是在数据到达相应端点缓冲区时产生中断,而发送过程是将数据写到相应端点缓冲区之后才产生中断。这样在将数据发往相应缓冲区后再调用USB_WaitEpReady(pUsb,timeout),若在此函数中成功获得信号量则说明发生成功。 |
|