USB设备的Bulk模式驱动程序设计
摘要 本文介绍了USB设备Bulk模式驱动程序的设计。该设计使用FIFO消息队列、信号量机制和定时器中断机制,可在不同的操作系统中实现。文中所用到的程序体系结构对于实现不同USB设备进行Bulk模式通讯是通用的。
  关键词 USBBulk模式;驱动设计
  引言
  通用串行总线(USB)是一种串行接口,具有自动配置能力和良好的兼容性,从而简化了计算机与外设的连接,被计算机外设硬件制造商广泛采纳。 USB总线标准由1.1版升级到2.0版后,传输率由12Mbps增加到了480Mbps,更适宜于高速数据传输。USB设备支持打印机、扫描仪、数码相机等外设时,由于这些外设与主机间传输的数据量大,要求驱动程序采用Bulk模式进行高速数据传输。
  USB设备驱动的整体结构
  USB设备驱动的整体结构包括如下五个主要部分:USB应用程序接口、USB设备驱动函数、USB中断服务程序、USB回调接口程序、USB标准事件处理程序。
 
USB应用程序接口
  USB应用程序接口主要功能是对USB驱动器进行软硬件初始化、打开端口、关闭端口、读端口、写端口和端口控制操作。当设备驱动器装入系统设备表时,I/O系统就调用该应用程序接口。
  USB应用程序接口的一个例程所包含的函数:
  ·USB_init( ) -- USB端口驱动函数的安装和初始化、硬件配置。
  ·USB_open( ) -- 打开USB端口。
  ·USB_close( ) -- 关闭USB端口。
  ·USB_read( ) -- USB端口进行读操作。
  ·USB_write( ) -- USB端口进行写操作。
嵌入式多线程编程
  ·USB_ioctl( ) -- USB设备进行I/O控制操作。
  USB设备驱动函数
  1USB_init()-- 初始化USB端口
  USB_init函数初始化特定USB端口驱动器,进行软硬件配置。
  初始化步骤如下:
  (1 USB设备驱动器安装到I/O系统设备表中。
  (2 获取USB控制器使用的中断号。
  (3 获取各端口所需的系统资源,包括内存、信号量和消息队列。
  (4 初始化USB驱动器数据结构与USB端口状态寄存器。
  (5 启动USB标准事件处理程序。
  (6 启用控制端口0USB中断最小支持集。
  2USB_open()-- 打开USB端口
  USB_open函数允许应用程序打开一个USB端口,选择DMA数据传输方式。
  执行打开调用的典型步骤如下:
  (1 如果不是默认的控制端口0,要检查端口状态是否为"CONFIGURED"
  (2 如果不允许多次打开,要确认端口还没有打开。
  (3 确认端口对当前选择的接口有效。
  (4 选择DMA传输,设置DMA控制器使用该端口的FIFO作为目的地址。
  (5 设置端口为打开状态。
  3USB_close()-- 关闭USB端口
  USB_close函数允许USB应用程序关闭一个端口,并关闭DMA通道。
  执行关闭调用的典型步骤为:
  (1 关闭DMA通道,放弃端口对DMA控制器的使用。
  (2 设置端口为关闭状态。
  4USB_read()-- USB端口进行读操作
  USB_read函数允许USB应用程序从输出端口或控制端口读取数据。
  调用读函数的典型步骤为:
  (1 设置端口号、类型和方向。
  (2 确认端口处于打开状态。
  (3 设置端口信号量,避免多次调用。
  (4 调用readDMA( ) 进行DMA写操作。函数内执行步骤为:
   (a) 启动DMA从端口接收FIFO的读操作,将数据从端口传送到内存。
   (b) 等待DMA完成中断。(DMA中断向端口消息队列发送一条消息表示数据传输完成。)
   (c) 重复进行(a)~(c)步骤直至接收到全部数据或USB主机结束传输。如果USB控制器检测到短包中断或零字节包,或者出现等待超时,则停止DMA传送,并转(d)步骤执行。
   (d) USB主机发送一个零字节包,完成控制状态步骤。
  (5 释放端口信号量。
  (6 返回接收到的字节数或错误信息。
  5USB_write()-- USB端口进行写操作
  USB_write函数允许USB应用程序写数据到输入端口或控制端口。
  执行写调用的典型步骤为:
  (1 确认端口号、类型和方向。
 
  (2 确认端口处于打开状态。
  (3 获取端口信号量,避免多次调用。
  (4 调用writeDMA( )进行DMA写操作。函数内执行步骤为:
   (a) DMA将内存数据传送到目标端口的FIFO,并等待DMA完成中断。
   (b) 若从接收FIFO接收到USB主机的一个零字节包,或者出现等待超时,则退出并返回传输的字节数。
   (c) 重复执行(a)~(c)步骤直至全部数据传输完毕时,转(d)步骤执行。
   (d) 强制向USB主机发送最后的零字节包或短包用来结束传输过程。
  (5 如果是控制端口,等待来自USB主机的零字节包,完成控制状态步骤。
  (6 释放端口信号量。
  (7 返回传输的字节数或错误信息。
  6USB_ioctl()-- USB设备进行I/O控制操作
  USB_ioctl函数设置端口状态寄存器并执行I/O端口控制功能。
  USB应用程序根据控制对象不同分别调用提供应用程序控制USB接口的能力的controlIoctl()epIoctl()函数。 controlIoctl()函数执行USB控制器整体I/O出控制功能。epIoctl()函数执行个别USB端口的I/O控制功能。。
  1) controlIoctl( ) -- 控制器控制函数
  controlIoctl()函数对USB控制器进行控制操作。执行I/O功能之前获取USB控制器信号量,避免多次调用影响正在传输数据的端口。完成I/O操作后释放信号量。
  USB控制器应支持的控制功能包括:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。