您的位置:软件 > 开发者网络 > 技术跟踪 > Windows编程 > 正文
USB设备的Bulk模式驱动程序设计
[文章信息]
作者:莫北健
时间:2005-01-20
出处:计算机信息技术
责任编辑:方舟
[文章导读]
本文介绍了USB设备Bulk模式驱动程序的设计,该设计使用FIFO消息队列、信号量机制和定时器中断机制
advertisement
热点推荐
· 迷你迅雷给IE下载加足马力
· 《大话李白》主题曲 Flash
· Windows操作系统小技巧荟萃(上)
· 新浪UC2005使用技巧四则
· Google 2秒钟搜索100G硬盘
[正文]

1 2  下一页

  摘要 本文介绍了USB设备Bulk模式驱动程序的设计。该设计使用FIFO消息队列、信号量机制和定时器中断机制,可在不同的操作系统中实现。文中所用到的程序体系结构对于实现不同USB设备进行Bulk模式通讯是通用的。

  关键词 USB;Bulk模式;驱动设计

  引言

  通用串行总线(USB)是一种串行接口,具有自动配置能力和良好的兼容性,从而简化了计算机与外设的连接,被计算机外设硬件制造商广泛采纳。USB总线标准由1.1版升级到2.0版后,传输率由12Mbps增加到了480Mbps,更适宜于高速数据传输。USB设备支持打印机、扫描仪、数码相机等外设时,由于这些外设与主机间传输的数据量大,要求驱动程序采用Bulk模式进行高速数据传输。

  USB设备驱动的整体结构

  USB设备驱动的整体结构包括如下五个主要部分:USB应用程序接口、USB设备驱动函数、USB中断服务程序、USB回调接口程序、USB标准事件处理程序。


图1 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端口消息队列等待超时。


1 2  下一页

发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容焦点新闻
  • 虚拟设备驱动程序的设计与实现
  • Windows下多线程编程技术及其实现
  • 开发WDM型USB设备驱动程序
  • WDM设备驱动程序开发平台
  • Win2k驱动程序设计之硬件
  • Win2000驱动程序设计初步
  • 寄出钱易趣说没收到 网上购物“优惠”遭质疑
  • 内地C2C网站集体对接海外 扩展两岸三地市场
  • 企业信息化时代的新兴职业:客户关系管理师
  • 诺基亚光辉岂止区区15年 CEO奥利拉不信邪
  • CN域名注册价格大跳水 将与.COM域名持平
  • 中国将制定首个国家信息化战略 年底前发布
  • 04年中国企业十大新闻揭晓 联想收购列第一
  • 跨国公司在华兴独资浪潮 欧盟与日本打头阵
  • Advertisement

    天极无线


    奇妙科幻|美好风光|清风车影|漫画卡通|星座生肖|明星写真|动物世界
    老鼠爱大米
    挥着翅膀的女孩
    女人味
    栀子花开
    白月光
    刚刚好
    江南
    快乐崇拜
    亲爱的你怎么不在我身边
    小薇
    2002年的第一场雪
    有多少爱可以重来
    我的地盘
    七里香
    情人
     
    老鼠爱大米 老板电话
    冲动的惩罚 七里香
    我不是黄蓉 女生撒娇
    盛夏的果实 坚持到底
    孤单北半球 眉飞色舞
    挪威的森林 可爱女人
    最浪漫的事 老板电话

    CSEEK搜索