USB设备的Bulk模式驱动程序设计

USB设备的Bulk模式驱动程序设计

 

  引言

  通用串行总线(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设备驱动函数
  1、USB_init()-- 初始化USB端口
  USB_init函数初始化特定USB端口驱动器,进行软硬件配置。
  初始化步骤如下:
  (1) 将USB设备驱动器安装到I/O系统设备表中。
  (2) 获取USB控制器使用的中断号。
  (3) 获取各端口所需的系统资源,包括内存、信号量和消息队列。
  (4) 初始化USB驱动器数据结构与USB端口状态寄存器。
  (5) 启动USB标准事件处理程序。
  (6) 启用控制端口0和USB中断最小支持集。
  2、USB_open()-- 打开USB端口

  USB_open函数允许应用程序打开一个USB端口,选择DMA数据传输方式。

  执行打开调用的典型步骤如下:

  (1) 如果不是默认的控制端口0,要检查端口状态是否为"CONFIGURED"。

  (2) 如果不允许多次打开,要确认端口还没有打开。

  (3) 确认端口对当前选择的接口有效。

  (4) 选择DMA传输,设置DMA控制器使用该端口的FIFO作为目的地址。

  (5) 设置端口为打开状态。

  3、USB_close()-- 关闭USB端口

  USB_close函数允许USB应用程序关闭一个端口,并关闭DMA通道。

  执行关闭调用的典型步骤为:

  (1) 关闭DMA通道,放弃端口对DMA控制器的使用。

  (2) 设置端口为关闭状态。

  4、USB_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) 返回接收到的字节数或错误信息。

  5、USB_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) 返回传输的字节数或错误信息。

  6、USB_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控制器应支持的控制功能包括:

  ·支持远程唤醒功能。

  ·设置USB端口进入/退出挂起状态。

  ·复位USB端口。

  ·设置USB控制器消息队列等待超时。

  ·为DMA选择端口FIFO。

  ·允许/禁止可选中断。

  ·读取帧时间戳起始位。

  ·进行枚举测试。

  ·返回接口、备用接口和当前USB端口配置状态。

  2) epIoctl() -- 端口控制函数

  epIoctl()函数对端口进行控制操作。执行I/O功能之前获取USB控制器信号量,避免多次调用影响正在传输数据的端口。完成I/O操作后释放信号量。

  端口应支持的控制功能包括:

  (1) 获得USB端口状态。

  (2) 设置USB端口进入/退出阻塞状态。

  (3) 设置USB端口消息队列等待超时。

 

  USB中断服务程序

  USB控制器产生单一中断,多个端口共享。每个端口产生ACK、NACK/ERROR中断。输出端口产生接收零字节包或短包中断。控制端口0接收设置包时产生中断。USB控制器产生USB事件中断,如帧起始(SOF)、挂起、恢复和复位。

  USB中断服务程序执行下列步骤:

  (1) 识别发生了USB中断的类型。

  (2) 清除中断产生的条件。

  (3) 读USB状态寄存器,获取当前配置、接口或帧起始时间戳状态信息。

  (4) 向USB控制器消息队列或回调函数的接收消息队列发送一条消息。

  USB标准事件处理程序

  USB驱动器初始化后,启动USB标准事件处理程序负责处理枚举过程和异步USB事件。

  事件处理程序使用控制端口0,直到完成枚举过程。当USB应用程序处于非活动状态时,除控制端口0以外端口均不可访问。事件处理程序在端口0上执行控制操作,响应USB标准请求,并负责通知USB应用程序枚举完成和接口活动状态,USB事件通过回调接口传递到USB外设应用程序。当对USB端口枚举操作完成,USB应用程序就可打开并使用USB端口。

  处理一个USB任务的执行过程为:

  (1) 读取USB控制器消息队列。

  (2) 如果接收到设置包,则调用标准请求处理函数。

  (3) 如果接收到事件,则调用USB事件处理函数。

  (4) 确定当前状态和有效配置/接口。

  (5) 更新USB控制器和端口数据结构。

  (6) 重复(1)~(5)步骤。

  USB回调接口程序

  回调应用程序接口是向应用程序提供反馈信息的一种接口,包括向应用程序通知USB事件的消息,如复位、配置改变、接口改变、挂起、恢复和帧起始。使用USB的应用程序要以下列方式回应这些消息:

  (1) 复位 关闭端口,等待枚举测试。

  (2) 配置改变 关闭端口,按新配置打开端口。

  (3) 接口改变 关闭端口,从新接口打开端口。

  (4) 挂起 进入低功耗模式。

  (5) 恢复 退出低功耗模式。

  (6) 帧起始 执行应用程序规定的处理。

  总结

  本文提供了进行USB端口Bulk模式驱动程序设计的过程,实现在USB接口设备与Host主机之间进行高速数据传输,对于嵌入式环境以及windows多线程环境下的USB设备的高速数据传输同样适用

时间: 2024-11-27 15:19:11

USB设备的Bulk模式驱动程序设计的相关文章

win7电脑连接USB设备总是提示安装驱动失败怎么办?

  USB设备,也就是咱们win7 64位旗舰版下载系统的外接设备,这种设备其实咱们日常操作中是使用的十分频繁的,例如咱们的U盘.移动硬盘.外接的光驱,还有打印机等等,这些都属于是USB设备,也是咱们日常操作比较频繁的一些设备.一般来说,咱们在win7旗舰版电脑中使用USB设备是很简单的,只要直接插在win7旗舰版电脑的USB接口就可以,但是最近,却有使用win7旗舰版电脑的用户咨询说,自己的USB设备插上之后出现了安装驱动失败的提示,那么这个问题咱们要如何解决呢?下面,小编就来详细的介绍一下吧

USB设备驱动概述

USB设备驱动 ·  17.1 USB总线协议 ·  17.1.1 USB设备简介 ·  17.1.2 USB连接拓扑结构 ·  17.1.3 USB通信的流程 ·  17.1.4 USB四种传输模式 ·  17.2.1 观察USB设备的工具 ·  17.2.2 USB设备请求 ·  17.2.3 设备描述符 ·  17.2.4 配置描述符 ·  17.2.5 接口描述符 ·  17.2.6 端点描述符 ·  17.3.1 功能驱动与物理总线驱动 ·  17.3.2 构造USB请求包 ·  17

电脑无法识别usb设备怎么办

现在我们应用USB设备越来越多,而出现的问题也没少,软件硬件方面的问题也随着而来,那我们来分析下USB设备和故障解决. 1.前置USB线接错.当主板上的USB线和机箱上的前置USB 接口对应相接时把正负接反就会发生这类故障,这也是相当危险的,因为正负接反很可能会使得USB设备烧毁.所以尽量采用机箱后置的USB接口,也少用延长线.也可能是断口有问题,换个USB端口看下. 2.USB接口电压不足.当把移动硬盘接在前置USB口上时就有可能发生系统无法识别出设备的故障.原因是移动硬盘功率比较大要求电压相

无法识别usb设备怎么办

usb设备越来越普遍,几乎所有的设备都有usb化的趋势,如打印机.摄像头.mp3.mp4.阅读机,但很多时候,我们使用usb设备却不是那么的顺利.经常出现"无法识别的usb设备"的提示,那么为什么会出现此提示,如何解决呢 步骤/方法 前置USB线接错.当主板上的USB线和机箱上的前置USB 接口对应相接时把正负接反就会发生这类故障,这也是相当危险的,因为正负接反很可能会使得USB设备烧毁.所以尽量采用机箱后置的USB接口,也少用延长线.也可能是断口有问题,换个USB端口看下. USB接

电脑显示无法识别usb设备怎么办

usb设备越来越普遍,几乎所有的设备都有usb化的趋势,如打印机.摄像头.mp3.mp4.阅读机,但很多时候,我们使用usb设备却不是那么的顺利.经常出现"无法识别的usb设备"的提示,那么为什么会出现此提示,如何解决呢? usb无法识别主要是以下几个思路出发,首先如果是初次在一台电脑上,当出现usb无法识别的时候,需要做的是分析清楚到底是usb设备产品的问题还是电脑或线路的问题以及是否存在驱动问题.当以前使用过该usb设备,现在不可以用的话,驱动问题就可以简单的排除掉. 例如,有一台

电脑usb提示无法识别的usb设备怎么办

  电脑usb提示无法识别的usb设备怎么办?usb接口设备在我们生活中非常普遍,不如我们常见的USB鼠标,usb键盘,usb音箱,usbU盘等等,但使用usb设备也会伴随着各种各样的问题发生,如常见的usb无法识别,将usb设备接入电脑,电脑无法识别usb设备或者提示有"无法识别的usb设备",今天围绕这2个常见的usb无法识别故障,编辑结合自己的理论与实践经验介绍下usb无法识别或工作不正常的解决办法. usb无法识别我们主要是以下几个思路出发,首先如果您是初次在一台电脑上,当出现

c#-和USB设备通信该怎么做呢???

问题描述 和USB设备通信该怎么做呢??? 如题,我已经获取到了设备的路径,并且createfile成功拿到了句柄,更加厉害的是我通过bushod已经弄清楚了设备和主机之间的通信协议格式:这些东西我都有了,但是我不知道怎么给设备发送信息怎么控制设备:求各位大神解答解答,我试过单纯的writefile并不能达到我的目的.求教有累死经验的大神,话说我面对的是赛默飞世尔的一台价值两百W的设备,现在头都大了 解决方案 usb设备是用来做什么的,厂商应该提供了驱动程序和开发手册了吧,手册中应该有接口吧,比

visual studio-wdk8.1+vs2013中使用winusb模版开发usb设备驱动

问题描述 wdk8.1+vs2013中使用winusb模版开发usb设备驱动 新人一只,本身是做硬件的,现在要编写硬件(USB设备)的驱动,然后想使用winusb进行快速的驱动开发.在使用winusb之前,使用了libusb-win32下的inf工具进行inf文件的生成和安装,通过bus hound可以看到枚举,并进行的bulk in/out测试(自带的send command).目标pc是64位的win7旗舰版. 现在状况是vs2013新建了winusb模版工程,其中drivers packa

驱动人生如何解决USB设备驱动

  图1 驱动人生2009正式版安装界面 插入语:小编为了让大家更直观的看到,驱动人生秒杀USB设备驱动的全过程,不得己用驱动人生卸载了自己的USB设备驱动,可怜小编一篇苦心,希望对大家有所帮助. 图2 驱动人生2009正式版的操作界面 点击上面的驱动更新,我们就可以看到图3 图3 驱动人生2009正式版驱动更新功能界面 点击"刷新信息""开始更新",正常情况下10秒之内就可以解决USB设备驱动的下载安装问题了.最终结果如下图 注意了:解决完USB设备的驱动问题,大