USB驱动开发之端点,管道和接口,信息流动
2019-07-12 13:18发布
生成海报
转自:
http://blog.csdn.net/xxxluozhen/article/details/5023578
在USB开发当中这三个概念容易混淆,对于真实环境中的USB操作,端点、管道和接口更是不可忽略的,该三者关系如图2-6-1;
端点、在这里特指USB物理端点,在NXP LPC2478
USB中最多有32个物理端点,从0到31每一种端点都有其固定的传输方式(I/OUT),其中IN是指HUB向HOST发送数据,OUT是指HOST向HUB发送数据。
管道、是一种端点的逻辑概念,说白了就是逻辑端点,是人性的为USB物理端点进行分组,两个为一组,其中一端点为IN类型,另一种为OUT类型。故NXP
LPC2478中可以分为16组逻辑端点,从0到15。
接口、是设备的一种描述符之一,同时也是端点的集合,用于开启且保存端点。
USB定义了四种数据传输方式(控制、批量、中断、等时)。它们的不同之处有:单个事务能携带的数据量(下一段将解释术语“事务”transaction)、能否保证特定的周期或延迟,能否自动校正错误。每种传输方式对应特定类型的端点。实际上,给定类型的端点(控制、批量、中断、等时)总是使用对应类型的传输。
端点除了传输类型外还有其它几个属性。其中一个属性是单一事务中端点能够提供或消耗的最大数据量。控制和批量端点必须指定某个离散值,而中断和等时端点能指定少于或等于最大值的任何值。端点的另一个属性是传输方向,输入(数据从设备到主控制器)或输出(数据从主控制器到设备)。最后,每个端点都有一个端点号,其中包含输入输出方向,作为端点的地址使用。
当主控制器要求设备执行某些多少有些规则的功能时,USB使用一个轮检(polling)协议。当一个设备需要向主控制器发送数据时,主控制器必须注意到并且向要发送数据的设备发出一个请求使其发送数据。即USB设备不用传统方式中断主计算机,而是提供中断端点,主机周期轮检中断端点。
当客户程序通过USB管道发送或接收数据时,它首先调用Win32
API,调用最终将使function的驱动程序收到一个IRP。而驱动程序的工作就是把客户的请求引导到有正确端点的管道上。它把请求提交到总线驱动程序,总线驱动程序再把请求分解成多个事务(transaction),然后这些事务被送往总线。总线上的信息流以每毫秒一帧数据的形式流动。总线驱动程序必须安排好多个事务以使它们能被装入同一帧中,图2-6-1 显示了这个过程。
在USB中,事务由一个或多个阶段(phase)组成。阶段有令牌(token)、数据(data)、握手(ack)三种类型。根据不同的类型,事务有一个令牌阶段、一个可选的数据阶段、和一个可选的握手阶段组成,如图2-6-2 所示。在令牌阶段,主控制器向所有已配置的设备广播该令牌包。令牌包中含有设备地址,通常还有端点号,仅有被寻址的设备才会处理事务;当事务寻址设备时,任何设备都不读写总线。在数据阶段,数据被放到总线上。对于输出事务,主机把数据放到总线上,而被寻址的设备消耗这些数据。对于输入事务,情况相反,设备把数据放到总线上由主机消耗。在握手阶段,由设备或主机把握手包放到总线上,包中含有状态信息。当设备发出握手包时,ACK包指出成功地接收了信息,NAK包指出忙并且不试图接收信息,STALL包指出事务被正确接收但在逻辑上无效。当主机发送握手包时,它仅能发送ACK包。
没有发出握手包的事务就代表“在这个事务中出现了一个传输错误”。正在等待握手包的一方应认为缺少握手包可能是发生了错误并重试刚才的事务。
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮