usb_usbcleaner - CSDN
usb 订阅
USB,是英文Universal Serial Bus(通用串行总线)的缩写,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。是应用在PC领域的接口技术。 展开全文
USB,是英文Universal Serial Bus(通用串行总线)的缩写,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。是应用在PC领域的接口技术。
信息
外文名
Universal Serial Bus
外语缩写
USB
推出年代
1994
中文名
通用串行总线
应用领域
计算机领域的接口技术
usb简介
通用串行总线 (Universal Serial Bus,USB) 是一种新兴的并逐渐取代其他接口标准的数据通信方式,由 Intel、Compaq、Digital、IBM、Microsoft、NEC及Northern Telecom 等计算机公司和通信公司于1995年联合制定,并逐渐形成了行业标准。USB 总线作为一种高速串行总线,其极高的传输速度可以满足高速数据传输的应用环境要求,且该总线还兼有供电简单(可总线供电)、安装配置便捷(支持即插即用和热插拔)、 扩展端口简易(通过集线器最多可扩展127 个外设)、传输方式多样化(4 种传输模式),以及兼容良好(产品升级后向下兼容)等优点。 [1]  通用串行总线(universal serial bus,USB)自推出以来,已成功替代串口和并口,成为21世纪大量计算机和智能设备的标准扩展接口和必备接口之一,现已发展到USB 4.0版本。USB 具有传输速度快、使用方便、支持热插拔、连接灵活、独立供电等优点,可以连接键盘、鼠标、大容量存储设备等多种外设,该接口也被广泛用于智能 手机中。计算机等智能设备与外界数据的交互主要以网络和USB接口为主。 [2] 
收起全文
精华内容
参与话题
  • 通俗易懂的USB协议详解(转…

    万次阅读 多人点赞 2017-05-22 19:02:29
    原文地址:通俗易懂的USB协议详解(转载)作者: Branchesss 转自东海的博客http://6xudonghai.blog.163.com/blog/static/3364062920086253155137/ USB作为一种串行接口,应用日益广泛。如同每个工程设计人员...

    转自东海的博客http://6xudonghai.blog.163.com/blog/static/3364062920086253155137/

    USB作为一种串行接口,应用日益广泛。如同每个工程设计人员必须掌握I2C,RS232这些接口一样,我们也必须掌握usb.

    但是usb的接口协议实在有点费解,linux uhci驱动作者之一Alan Stern曾经就说过“The USB documentation 

    is downright evil. Most    of it is just crap, written by a committee. You're better off ignoring

     most of it ”。

    本文将从整体上介绍usb协议,包括usb host ,usb hub,usb function。希望能给读者一个总体上的了解。也

    因此,文章将分成相应的三部分讲解。

    一。usb function

    1。初识usb.usb是一种串行接口协议,它靠d+,d-两条数据线构成的差分线来进行数据传输,这让我们非常感兴

    它到底和我们通常熟悉两线rs232/485有何区别。了解这种区别有助于我们对usb作一个深入的了解。那么让

    我们回想一下到底一个两线rs232的数据是如何传送的,如图一:

    USB详解(转) - 东海 - 东海的博客

    在这里我们的重点在于,我们发现要在串行口传送数据一个最体码的要求恐怕就是:要知道数据传输何时开始,

    何时结束。即如何delimit.那么rs232怎么做的。显然,在idle(空闲)时,即无数据传送时,数据线处于高电

    平,等到有数据开始传送,发送方首先拉低数据线(start),表示数据传输开始,接受端也因为这个“start”信号

    始准备接受即将到来的数据,类似一次握手,随后,在两者之间的数据传送开始,结束后主方再次拉高数据

    线,表示结束传输,自此两者重新进入Idle状态。等待下一轮传送开始。

    了解了rs232,那么我们自然想到usb如何做到这个呢,既然是串行位流传输,也理所当然的解决这个问题。没错,

    Usb协议必然要解决这个问题,让我们作一个类似rs232的比较吧!类似于rs232,usb的传输桢如图二:

    USB详解(转) - 东海 - 东海的博客

    (这里我们暂时忽略这个传输所代表的意义)为了说明问题,我们对一些问题简化,我们定义这样几个状态:
    假设D+,D-分别表示usb信号线的电平信号。那么对于usb full speed function(high speed ,low speed是不

    同的),我们定义差分数据线上可能出现的四个状态:

    Data J state:D+=1,D-=0;
    Data K state:D+=0,D-=1;
    SE0:D+=D-=0;
    SE1:D+=D-=1;

    那么上面的图中,相应的也可表示为图三:

    USB详解(转) - 东海 - 东海的博客

    这个对usb full speed function来说,idle状态将处于Data J state,se0表示一桢结束。看这个图是不是很像

    我们熟悉的rs232。没错!!!他们确实很相似。在无数据传输时,它们都处于Idle状态,当要开始传输数据时,

    先发一个sync(同步信号,rs232为start,usb为一sync字节,见协议说明)信号进行“握手”,而后开始传输,

    当传输要结束时,发一stop信号(usb为一个se0状态表示要结束传输),最后又进入idle态等待新的传输。不过,

    你可能更加注意到,他们还是不同的。不同在于usb是按packet进行传输的,就是说它传输的最小单位是packet,

    而rs232是按字节传送的,也即它的最小传送单位是字节。既然是按pakcet传送,想想我们相较于rs232的按字节

    单位传输,我们可以得到哪些“好处”。想想看,pakcet的好处不就在于我们可以灵活的定义数据的传送格式,

    传送方式,从而可以适应各种各样的串行设备,这不就是所谓的“通用串行总线”吗?

    简介:从本节开始,我们将介绍usb的传输机制。这节先介绍usb现有传输方式的背景知识,做为对下节将要展开

    的四种传输类型,描述符,等相关知识的一个导引。

    2。usb传输。
    我们在上一节中了解到了usb的“packet”的感念,了解到了usb传送一个packet总是以sync开始,以eop结束,

    这个称为delimiter,即标记packet的始末。有了packet,我们就可以在usb总线上传输数据了。但是这还不够,

    比如数据传送方向,即传回usb主机还是传下usb从机,数据传送的地址,数据传送的类型(这些后面我们将会知

    道)这些信息在传输之前是必须搞清楚的,那么这个信息如何得知呢,看来这就需要我们定一套基于packet的

    “协议”了。主机与从机在传输中均遵循这套“协议”,那么这些问题就可以迎刃而解。事实上,usb的一次数

    据传输总是遵循这样的“协议”的:

    首先,主机发第1个packet给从机,声明数据传送方向,数据传输地址,数据传输类型。

    其次,主机发第2个至第n个packet载有实际数据
    最后,从机返回一个packet是一个ACK包,报告数据传输的结果,比如接受出错或成功等信息,这样主机

    就可以借此了解到这次传输情况,从而有可能来作出相应措施如决定是否重发

    这里我们考虑的是主机发数据给从机的情况,那么从机发数据给主机时,是不是也可以这样呢?当然可以,比如

    从机要发数据给主机时,也可以采取同主机类似的方式:

    首先,从机发第1个packet给主机,声明数据传送方向,数据传输地址,数据传输类型。
    其次,从机发第2个至第n个packet载有实际数据
    最后,主机返回一个packet是一个ACK包,报告数据传输的结果,比如接受出错或成功等信息,这样从机就可以

    借此了解到这次传输情况,从而有可能来作出相应措施如决定是否重发。

    基本上可以归结为一个“三段式”传输

    这里有人可能注意到了,对这样一个传输机制,从机和主机的功能将是一样的,因为这样的实现机制,从机

    可能在某一时刻是主机,某一时刻又可能是从机,因为他们要实现同样的功能。这样实现起来的复杂性也将是

    一样的。

    注:这里概念或许容易混淆,其实,我们这里的主机(master)和从机(slaver)是一个transceiver,即可收可发。

    相应的,在某一时刻,master在发数据,我们称其为transmitter,在接受时我们称为receiver.对slaver同样。

    我们可能还注意到了,usb这种按pakcet传输的方式在实现时已经很复杂了(至少比rs232要复杂多吧),至少我

    目前看来主从机功能一样这样的实现方式似乎还是可行,但是后面我们谈到usb host时将会了解到host的功

    能是如何的复杂,以至于让一个usb function 也带上如此的功能成本和实现复杂性将陡然上升。作为面向广范

    应用的usb,这是我们不允许的。我们期望的是一个使用usb 的udisk,使用usb的光驱,使用usb的耳麦等等这些

    东西不要因为usb而变得昂贵,复杂。

    正是因为这个原因,usb从机的传输发式便由上面的方式改成了下面的方式进行:

    首先,主机发第1个packet给从机,声明数据传送方向,数据传输地址,数据传输类型。
    其次,从机收到主机送来的第一个packet后,再发第2个至第n个packet载有实际数据
    最后,主机返回一个packet是一个ACK包,报告数据传输的结果,比如接受出错或成功等信息,这样从机

    就可以借此了解到这次传输情况,从而有可能来作出相应措施如决定是否重发。

    而对于usb 主机传输方式保持不变。


    对于这样的改变,我们马上就有疑问了:这个改变的传输方式是和未改变之前的等价吗。当然,不全等价。问题

    在哪里?仔细观察一下便知,两者区别在于第一个packet是由谁发起的。未改变之前,第一个packet总是由要传

    送数据的一方发起,而改变之后的第一个Packet总是由主机发起。这样,就变成如果从机要发送数据给主机时,

    总是由主机发起(第一个packet),然后从机开始传送。
    可能初次接触我们会感觉怪怪的,怎么从机要给主机发送数据前反而要主机先发packet给从机。  这样行吗?

    们要说这样是可以的,因为通常一次传输交互的产生,并非无来由的产生,这些都是由程序员控制的,控制usb

    时收,何时发,及发给谁!!!

    这里我们就注意到了,usb function(总是作为从机)的功能一下从原来与主机具有相同功能的tranceiver变成

    现在仅具发送(或接收)功能的transmitter(或Receiver)实现的复杂性及成本可想而知也就相应得减小了。

    简介:本节介绍usb full speed function的四种传输类型。

    上节中我们了解到了usb host 与usb function 之间采用的是一种“非对称”的传输,也就是说,无论usb接受

    据还是发送数据,都是由usb host首先发起。即传输的第一个packet总是由usb host发出的。这个packet将声

    本次即将进行的数据传输方向,数据传输地址和数据传输类型。

     

    控制传输(Control Transfers)

    : 或许你已经注意到了,一个usb host端口并不是仅仅支持一个Usb function.如图1,

    USB详解(转) - 东海 - 东海的博客

    通过usb hub,一个usb host端口可以连接usb鼠标,usb键盘,Usb写字板......。要连接这么多东西在同一个

    usb host上,我们通常会有一个基本问题,即usb host如何识别这些被连接在它的端口上的设备呢。正如通常的

    主从式通讯系统一样,如rs485多机通讯,我们通常是用一个特定的地址标志每一个从设备。对这里的usb,我们

    采用同样的方法,将为每个挂接在该usb host上的usb function指定一个特定地址,通过这个特定地址来识别

    每个usb function.看来这将是一个usb function在数据传输之前必须解决的问题--得到它的地址分配。

    这个“地址指定”的过程需要usb host通知usb function才能完成,这个交互过程就是一个控制式传输。通过

    这个“控制式传输”,usb host将指定地址给usb function ,以为即将进行的正式通讯做好准备工作。这里细心

    的读者可能已经注意到了,既然usb host总要分配地址给usb function才能进行正式的数据传输工作,那么

    usb host将如何与一个初始时未分配地址的usb function进行交互来分配地址呢。这里,是这样解决的:

    usb协议保留了一个“通用地址”0,usb host 通过这个地址0来和初始未分配地址的usb function进行通讯,进行一

    初始的准备工作,诸如这里的为它非配一个特定地址。后面我们就会了解到,usb除了配置地址外,还有一些

    其它参数需要事先主从双方达成共识。这些参数也都是通过控制式传输完成的。一个Usb 的控制式传输如图二:

    USB详解(转) - 东海 - 东海的博客

    一个Usb的控制式传输分为两个或三个阶段进行传输:setup stage,data stage(视情况而定),status stage。

     

    1. 首先是setup stage,联系上节所说的Usb传输模式,usb Host总是先发起第一个packet--这里它
      1. 首先发起setup,
      2. 之后发起以data0为起始的setup data,
      3. 最后usb function回应ack结束一次交互。
    2. 其次如果有data stage,类似的,还是按照上节说的usb传输模式,
        1. usb host总是先发起第一个Packet--Out(或in),
        2. 之后usb host(或usb function)发起以data1为起始的payload data,
        3. 最后Usb fuction(或usb host)回应ack结束一次交互。
      1. 如果数据未传完,继续data stage,同上继续。
    3. 最后是status stage,类似的,
      1. usb host首先发起第一个Packet--in(或out),
      2. 之后usb function(或usb host)发起以data1为起始的Null data(0长度),
      3. 最后Usb host(或usb function)回应ack结束一次交互。

     


    如此,整个控制式传输结束。 你或许有疑问,data stage为什么进行了多次而非一次完成?实际上,usb总是将

    一批大量的数据分成了许多小段来进行传输,称为一个pay load。这样传输的目的是容易对传输进行控制。既然

    一次大量的数据总是被分成一段一段来分次传输,那么这里就出现了一个需要事先确定的参数(wMaxPacketSize):即每次即这个小段有多大。这个参数如地址指派一样,正式传输之前需要事先达成共识。通过控制式传输,现在我们

    已经完成了usb function的地址指定等参数的设置工作,下一步可以进行正式的数据传输了。

    块传输(bulk Transactions

    我们终于等到usb function 配置完成,现在我们的任务是要传送一批数据,这里可以使用批量数据传输(bulk Transactions)。 一个批量传输总是按照如图所示方式进行,

    USB详解(转) - 东海 - 东海的博客

    1. 首先,usb host发起第一个Packet--in(或out),表示要开始数据传输了。
    2. 其次,usb function(或usb host)发起以data1(或data0)为起头的payload data,开始一次交互。
    3. 再其次,usb host(或Usb function)发起ack回应这次交互。 如果数据还为传完,继续上述过程,即:
      1. 首先,usb host再次发起一个Packet--in(或out),表示又要开始数据传输了。
      2. 其次,usb function(或usb host)发起以data0(或data1)为起头的payload data,开始又一次交互。
      3. 再次,usb host(或Usb function)发起ack回应这次交互。
      如此继续直至传输完成

    这里的疑问依然是为什么一次可能传完的数据为什么分成多次进行传输,原因在上次介绍控制式传输式已经说明。

    后面我们就会明白,为什么这样可以方便控制传输过程。 仔细看看控制式的data stage采用的传输方式,是否

    就是批量传输方式呢?!注意,每次payload data的“牵头人”(preamble)在轮番掉换,先是data1,接着data0,

    再是data1,......如此接替,只要有一次交互出现问题,这个接替规则就会被打破进而被Usb host识别而发现

    传输异常。所以这个交替的“牵头人”规则是可靠数据传输的所采取的措施之一。

     

    同步传输(Isochronous Transactions)和中断式传输(Interrupt Transactions

    在批量数据传输中,触发一次批量数据传输总是“被动”的,就是说需要数据传输时Usb host并不会主动发起

    传输,而是需要得到你的指令。当你告诉它:“一切ok,让我们开始吧!” 这时它才开始数据传输。这种方式

    显然在某些情况下并不适合。比如音视频流,你无法要求它听从你的“指挥”,让它等你发指令给usb host,

    然后开始一次传输。我们需要的是一种“及时”传输。一个好的方案就是设置一个timer,按照tick发起usb传输。

    这个tick通常以1ms(usb full speed)为最小单位。这时,可以设置为每次1ms tick出现,usb host“自动”发起一

    数据传输。那么这种方案具体如何来实现呢?看来最基本的要素便是一个发出tick的timer,而这个“timer”

    需要usb host和usb function(事实上还要包括usb hub)双方均能“看到”,从而协调工作,否则单方面的

    timer又有何意义?这个"timer"(或tick)在usb中使用一个特殊的packet实现,即是SOF。这个SOF由USB HOST 

    相当精确的以每1.00 ms ±0.0005 ms的时间周期发送给usb device,来在二者之间定时。从而usb function能

    “及时”的了解到“现在时刻”。 现在我们在usb host和usb function之间建立起了“对时”机制。那么接下

    看看刚才设想的“自动”传输如何实现。事实上,一旦usb host及usb function双方建立了一种时间机制,那

    这种“自动”传输是很容易实现的。usb 实现同步式传输或中断式传输总是以一种类似于批量数据传输的方式

    行的,唯一不同的是传输的触发不再是“被动”的,而是由SOF所建立的tick触发。

    1. 首先,时间到达,usb host发起第一个Packet--in(或out),表示要开始数据传输了。
    2. 其次,usb function(或usb host)发起以data1(或data0)为起头的payload data,开始一次交互。
    3. 再其次,如果是中断式传输,usb host(或Usb function)发起ack回应这次交互,如果是同步式传输,
    4. 该步跳过。

    如此重复上述步骤,即usb host等待下一个tick到达,并开始新一轮的交互。

    这里我们注意到了,同步式传输和中断式传输二者虽然都是时间触发,但是中断式传输需要ack应答,而相反,

    同步式传输不需要。这个最大的区别决定了同步式传输是一种非可靠传输,但是因此换来了更多的usb传输时间。

    也因此,同步式传输的 payload data(对应wMaxPacketSize )通常相较于其他传输方式比较大,因为它消掉了

    ack所占有数据传输时间。这里还有一个地方值得注意的是tick的设定,这个tick也是需要事先usb host 和

    usb function达成共识的参数之一。

    展开全文
  • USB详解

    千次阅读 2018-12-26 16:15:51
    基础知识一、背景二、发展三、优缺点四、要点五、补充参考 一、背景 二、发展 三、优缺点 四、要点 五、补充 参考

    一、背景

    为了规范电脑与外设之间的连接和通讯,1994年底,英特尔、康柏、IBM、Microsoft等多家公司联合提出了USB标准(Universal Serial Bus)[通用串行总线]。

    二、发展

    USB版本理论最大传输速率速率称号最大输出电流推出时间
    USB1.01.5Mbps(192KB/s)低速(Low-Speed)5V/500mA1996年1月
    USB1.112Mbps(1.5MB/s)全速(Full-Speed)5V/500mA1998年9月
    USB2.0480Mbps(60MB/s)高速(High-Speed)5V/500mA2000年4月
    USB3.05Gbps(500MB/s)超高速(Super-Speed)5V/500mA2008年11月 / 2013年12月
    USB 3.1Gen 210Gbps(1280MB/s)超高速+(Super-speed+)20V/5A2013年12月
    USB 3.220Gbps(2500MB/s)超高速++(Super-speed++)20V/5A2017年9月

    三、优缺点

    1、优点

    传输速度快、使用方便、支持热插拔、连接灵活、独立供电等

    2、缺点

    传输距离短、开发、调试难度大

    四、要点

    1、USB总线技术分支

    (1)USB总线系统的物理连接
    (2)USB的数据流模式
    (3)USB总线的逻辑结构
    (4)USB总线协议
    (5)USB固件设计及接口应用

    2、USB拓扑结构

    (1)图解
    在这里插入图片描述
    (2)介绍

    • 塔顶为USB主控制器和根集线器,下面接USB集线器,USB集线器可以将一个USB口拓展为多个USB口,多个USB又可以通过集线器进一步拓展。
    • USB协议中对集线器的层数是有限制的,USB1.1规定最多为4层,USb2.0对顶最多为6层。理论上,一个USB主控制器最多可接127个设备(协议规定每个USB设备具有7bit的地址,取值在0~127,其中0保留给未初始化的设备使用)
    • 一台机器可以接多个USB主控制器。

    五、补充

    1、带宽问题

    • 一台机器可以有多个USB主控制器,每个主控制器可以对应多个USB口。
    • 集线器只能扩展出更多USB接口,而不能扩展出更多的带宽。

    2、设备连接个数问题

    参照要点中拓扑结构图可知道,一台机器最多连接个数 = 主控制器(host)个数 x 127(理论上根集线器拓扑结构中可连接数目)

    参考

    1、《圈圈教你玩USB》 [第二版],作者 电脑圈圈
    2、USB百度百科
    3、[1] 李婧雯,彭苏,吴军. USB总线的结构及应用技术发展研究 [J]. 河南科技,2016,10:59-61.
    4、[2] 吕志强,薛亚楠,张宁,陆云. USB设备安全技术研究综述 [J]. 信息安全研究,2018,4(7): 639-645
    5、USB 3.2到底升级了哪些地方?

    展开全文
  • 端点(endpoint):端点是USB设备的唯一可识别部分,其是主机和设备之间的通信流的终点。它是一个USB设备或主机上的一个数据缓冲区,用来存放和发送USB的各种数据。每个USB逻辑设备由一组独立的端点组成。每个逻辑...

    端点(endpoint):端点是USB设备的唯一可识别部分,其是主机和设备之间的通信流的终点。它是一个USB设备或主机上的一个数据缓冲区,用来存放和发送USB的各种数据。每个USB逻辑设备由一组独立的端点组成。每个逻辑设备都有一个由系统在设备连接时分配的唯一地址。设备上的每个端点在设计时都会得到一个唯一的设备确定的标识符,称为端点号。每个端点都有一个设备确定的数据流方向。设备地址,端点号和方向的组合允许唯一地引用每个端点。每个端点都是一个单一连接,支持一个方向的数据流:输入(in)(从设备到主机)或输出(out)(从主机到设备)。端点具有确定端点和客户端软件之间所需传输服务类型的特征。每个端点都有一定的属性,包括传输方式、总线访问频率、带宽、端点号和数据包的最大容量。

    端点可以决定端点和客户端软件之间通讯所需要的传输服务类型。一个端点由一下内容来描述:

    • 总线访问频率/延时要求
    • 带宽要求
    • 端点号
    • 差错控制要求
    • 端点可以接受或传递的最大分组
    • 端点的传输类型
    • 对于同步端点而言,还要包括端点和主句之间的数据传输方向

    对齐进行配置之前,端点处于一种不确定的状态。所以只有在对其进行了配置工作之后,主机才能访问某个端点。

    端点0要求:所有的USB设备都要拥有端点0,该端点用于对一个逻辑设备进行初始化和进行一般的操作(对逻辑设备进行配置)。端点0提供了对设备配置信息的访问权限,通过它还允许访问一般的USB状态和控制操作。端点0支持控制传输,并且总是在设备接入和上电时就进行配置。

     

    管道(pipe):USB管道是设备上的端点与主机上的软件之间的关联。 管道表示通过内存缓冲区和设备上的端点在主机上的软件之间移动数据的能力。 有两种互斥的管道通信模式:

    • 流:通过管道传输的数据没有USB定义的结构
    • 消息:通过管道移动的数据具有一些USB定义的结构

    USB不会解释它通过管道传输的数据内容。 即使消息管道要求根据USB定义构造数据,USB也不会解释数据的内容。

     

    端点和管道的关系:

    主机和 endpoint之间的数据传输是通过 pipe。 endpoint 就是通信的发送或者接收点,你要发送数据,那你只要把数据发送到正确的端点那里就可以了。端点也是有方向的,从 usb 主机到设备称为out 端点,从设备到主机称为 in 端点。
    而管道,实际上只是为了让我们能够找到端点,就相当于我们日常说的邮编地址,比如一个国家,为了通信,我们必须给各个地方取名,完了给各条大大小小的路取名,比如你要揭发你们那里的官员腐败,你要去上访,你从某偏僻的小县城出发,要到北京来上访,那你的这个端点(endpoint)就是北京,而你得知道你来北京的路线,那这个从你们县城到北京的路线就算一条管道。有人好奇的问了,管道应该有两
    端吧,一个端点是北京,那另一个端点呢?答案是,这条管道有些特殊,就比如上访,我们只需要知道一端是北京,而另一端是哪里无所谓,因为不管你在哪里你都得到北京来上访。没听说过你在山西你可以上访,你要在宁夏还不能上访了,没这事对吧。严格来说,管道的
    另一端应该是 usb 主机,即前面说的那个 host。
     

    端点不但是有方向的,而且这个方向还是确定的,或者 in,或者 out,没有又是 in 又是 out的,鱼与熊掌是不可兼得的。有没有特殊
    的那,看你怎么去理解 0 号端点了,协议里规定了,所有的 USB 设备必须具有端点 0,它可以作为 in 端点,也可以作为 out 端点, USB 系统软件利用它来实现缺省的控制管道,从而控制设备。除了端点0,其余的端点在设备配置前,不能与主机通讯,只有向主机报告这些端点的特性并被激活后才能被激活。端点也是限量供应的,不是想有多少就有多少的,除了端点 0,低速设备最多只能拥有 2 个端点,高速设备也最多只能拥有 15 个 in 端点和 15 个 out 端点。这些端点在设备内部都有唯一的端点号,这个端点号是在设备设计时就已经指定的。
     

    接口

    接口和管道一样,是一个逻辑概念。一个Interface,可以理解为集成了键盘和鼠标的USB设备,里面就是两个interface,一个是键盘,另一个是鼠标。Interface之间通常是隔离的,互相不干扰。一个接口可以理解为一个功能。

    配置

    每个USB设备,可以有一个或多个配置(在probe期间,需要选择一种配置)。不同的配置体现出不同的组合接口。

    比如一个MP4设备,可以有按键,视屏,音频,旋钮四种接口。

    比如可以通过触摸屏调节音量,那个旋钮这个接口就可以取消,这样就组成了两种配置。

    配置1:按键(接口)、视屏(接口)、音频(接口)、旋钮(接口)

    配置2:按键(接口)、视屏(接口)、音频(接口)

    每个接口都需要实现响应的驱动程序。

     

     

    物理总线拓扑

    USB上的设备通过分层星形拓扑物理连接到主机。 USB连接点由称为集线器的特殊类USB设备提供。 集线器提供的附加连接点称为端口。 主机包括称为根集线器的嵌入式集线器。 主机通过根集线器提供一个或多个附着点。 为主机提供附加功能的USB设备称为功能。 为防止圆形附件,分层对USB的星形拓扑进行排序。

    可以将多个功能打包在一起,看起来是单个物理设备。 例如,键盘和轨迹球可以组合在一个包中。 在包装内部,各个功能永久地连接到集线器,它是连接到USB的内部集线器。 当多个功能与集线器组合在一个封装中时,它们被称为复合设备。集线器和连接到复合设备内集线器的每个功能都分配有自己的设备地址。 具有彼此独立控制的多个接口的设备被称为组合设备。 组合设备只有一个设备地址。 从主机的角度来看,一个复合设备与附加多个功能的独立集线器相同

    注意:协议中用两个单词分贝描述了复合设备和组合设备。其中,组合设备就是一个集线器下挂多个设备,但是只有一个设备地址。而复合设备虽然也是一个集线器下挂多个设备,每个设备都有自己的设备地址。

     

    复合设备

     

    组合设备

     

    实际上,USB设备应该被视为不同的功能。多个功能可以被封装在一起形成一个物理设备。

    复合设备其实就是几个设备通过一个USB Hub形成的单一设备,复合设备内的Hub和与Hub相连的各个功能会分配各自的设备地址。组合设备也就是具有多个接口的设备,每个接口代表一个独立的设备,但是组合设备只有一个设备地址。

    采用复合设备方法开发多功能USB设备时,其开发过程同开发两种不同类型的USB设备相同,开发难度较低。

     

    逻辑总线拓扑

    当设备在分层星形拓扑中物理连接到USB时,主机与每个逻辑设备进行通信,就像它直接连接到根端口一样。。 即使大多数主机/逻辑设备活动使用此逻辑透视图,主机仍会保持对物理拓扑的了解,以支持处理集线器的删除。 删除集线器后,必须从主机的逻辑拓扑视图中删除连接到集线器的所有设备。

     

    设备,配置,接口,端点的关系

    一个设备通常有一个或多个配置;
    一个配置通常有一个或多个接口;
    一个接口通常有一个或多个设置;
    一个接口有零或多个端点。

    需要注意的是,驱动是绑定到USB接口上,而不是整个设备。所以一个设备的某个配置要有多个接口,主机这边就要有多个驱动。

     

    最后,再次总结一下每个的主要作用。

    端点:端点是USB设备的唯一可识别部分,其是主机和设备之间的通信流的终点。是一个USB设备或主机上的一个数据缓冲区,用来存放和发送USB的各种数据。(逻辑上)

    接口:可以理解为一个功能。(物理功能)

    配置:对接口的组合,在连接期间选定是那种组合。(逻辑上)

     

     

    展开全文
  • USB协议基本知识

    万次阅读 多人点赞 2019-10-24 14:24:14
    USB 基本知识 USB的重要关键概念: 1、端点:位于USB设备或主机上的一个数据缓冲区,用来存放和发送USB的各种数据,每一个端点都有惟一的确定地址,有不同的传输特性(如输入端点、输出端点、配置端点、批量传输端点...

    USB 基本知识 
    USB的重要关键概念: 
    1、 端点:位于USB设备或主机上的一个数据缓冲区,用来存放和发送USB的各种数据,每一个端点都有惟一的确定地址,有不同的传输特性(如输入端点、输出端点、配置端点、批量传输端点) 
    2、 帧:时间概念,在USB中,一帧就是1MS,它是一个独立的单元,包含了一系列总线动作,USB将1帧分为好几份,每一份中是一个USB的传输动作。 
    3、upstream、downstream(上行、下行)设备到主机为上行,主机到设备为下行

    下面以一问一答的形式开始学习吧:

    问题一:USB的传输线结构是如何的呢?

    答案一:一条USB的传输线分别由地线、电源线、D+、D-四条线构成,D+和D-是差分输入线,它使用的是3.3V的电压(注意哦,与CMOS的 5V电平不同),而电源线和地线可向设备提供5V电压,最大电流为500MA

    问题二:数据是如何在USB传输线里面传送的

    答案二:数据在USB线里传送是由低位到高位发送的。

    问题三:USB的编码方案?

    答案三:USB采用不归零取反来传输数据,当传输线上的差分数据输入0时就取反,输入1时就保持原值,为了确保信号发送的准确性,当在USB总线上发送一个包时,传输设备就要进行位插入***作(即在数据流中每连续6个1后就插入一个0),从而强迫NRZI码发生变化。这个了解就行了,这些是由专门硬件处理的。

    问题四:USB的数据格式是怎么样的呢?

    答案四:和其他的一样,USB数据是由二进制数字串构成的,首先数字串构成域(有七种),域再构成包,包再构成事务(IN、OUT、SETUP),事务最后构成传输(中断传输、并行传输、批量传输和控制传输)。下面简单介绍一下域、包、事务、传输,请注意他们之间的关系。

    (一)域:是USB数据最小的单位,由若干位组成(至于是多少位由具体的域决定),域可分为七个类型:

    1、同步域(SYNC),八位,值固定为0000 0001,用于本地时钟与输入同步

    2、标识域(PID),由四位标识符+四位标识符反码构成,表明包的类型和格式,这是一个很重要的部分,这里可以计算出,USB的标识码有16种,具体分类请看问题五。

    3、地址域(ADDR):七位地址,代表了设备在主机上的地址,地址000 0000被命名为零地址,是任何一个设备第一次连接到主机时,在被主机配置、枚举前的默认地址,由此可以知道为什么一个USB主机只能接127个设备的原因。

    4、端点域(ENDP),四位,由此可知一个USB设备有的端点数量最大为16个。

    5、帧号域(FRAM),11位,每一个帧都有一个特定的帧号,帧号域最大容量0x800,对于同步传输有重要意义(同步传输为四种传输类型之一,请看下面)。

    6、数据域(DATA):长度为0~1023字节,在不同的传输类型中,数据域的长度各不相同,但必须为整数个字节的长度

    7、校验域(CRC):对令牌包和数据包(对于包的分类请看下面)中非PID域进行校验的一种方法,CRC校验在通讯中应用很泛,是一种很好的校验方法,至于具体的校验方法这里就不多说,请查阅相关资料,只须注意CRC码的除法是模2运算,不同于10进制中的除法。

    (二)包:由域构成的包有四种类型,分别是令牌包、数据包、握手包和特殊包,前面三种是重要的包,不同的包的域结构不同,介绍如下

    1、令牌包:可分为输入包、输出包、设置包和帧起始包(注意这里的输入包是用于设置输入命令的,输出包是用来设置输出命令的,而不是放据数的)

    其中输入包、输出包和设置包的格式都是一样的:

    SYNC+PID+ADDR+ENDP+CRC5(五位的校验码)

    帧起始包的格式:

    SYNC+PID+11位FRAM+CRC5(五位的校验码)

    2、数据包:分为DATA0包和DATA1包,当USB发送数据的时候,当一次发送的数据长度大于相应端点的容量时,就需要把数据包分为好几个包,分批发送,DATA0包和DATA1包交替发送,即如果第一个数据包是 DATA0,那第二个数据包就是DATA1。但也有例外情况,在同步传输中(四类传输类型中之一),所有的数据包都是为DATA0,格式如下:

    SYNC+PID+0~1023字节+CRC16

    3、握手包:结构最为简单的包,格式如下

    SYNC+PID

    USB的四种传输类型:

    1.  控制传输:

          控制传输是一种可靠的双向传输,一次控制传输可分为三个阶段。第一阶段为从HOST到Device的SETUP事务传输,这个阶段指定了此次控制传输的请求类型;

          第二阶段为数据阶段,也有些请求没有数据阶段;第三阶段为状态阶段,通过一次IN/OUT 传输表明请求是否成功完成。

          控制传输通过控制管道在应用软件和 Device 的控制端点之间进行,控制传输过程中传输的数据是有格式定义的,USB 设备或主机可根据格式定义解析获得的数据含义。

          其他三种传输类型都没有格式定义。

          控制传输对于最大包长度有固定的要求。对于高速设备该值为 64Byte;对于低速设备该值为 8;全速设备可以是 8或 16或 32或 64。

          最大包长度 表征了一个端点单次接收/发送数据的能力,实际上反应的是该端点对应的Buffer 的大小。Buffer 越大,单次可接收/发送的数据包越大,反之亦反。

          当通过一个端点进行数据传输时,  若数据的大小超过该端点的最大包长度时,需要将数据分成若干个数据包传输,并且要求除最后一个包外,所有的包长度均等于该最大包长度。

          这也就是说如果一个端点收到/发送了一个长度小于最大包长度的包,即意味着数据传输结束。

          控制传输在访问总线时也受到一些限制,如:

            a. 高速端点的控制传输不能占用超过 20%的微帧,全速和低速的则不能超过 10%。 
            b. 在一帧内如果有多余的未用时间,并且没有同步和中断传输,可以用来进行控制传输。

    2.  中断传输:

          中断传输是一种轮询的传输方式,是一种单向的传输,HOST通过固定的间隔对中断端点进行查询,若有数据传输或可以接收数据则返回数据或发送数据,否则返回NAK,表示尚未准备好。

          中断传输的延迟有保证,但并非实时传输,它是一种延迟有限的可靠传输,支持错误重传。 
          对于高速/全速/低速端点,最大包长度分别可以达到1024/64/8 Bytes。

          高速中断传输不得占用超过 80%的微帧时间,全速和低速不得超过 90%。

          中断端点的轮询间隔由在端点描述符中定义,全速端点的轮询间隔可以是1~255mS,低速端点为10~255mS,高速端点为(2interval-1)*125uS,其中 interval取 1到 16之间的值。

          除高速高带宽中断端点外,一个微帧内仅允许一次中断事务传输,高速高带宽端点最多可以在一个微帧内进行三次中断事务传输,传输高达 3072 字节的数据。

          所谓单向传输,并不是说该传输只支持一个方向的传输,而是指在某个端点上该传输仅支持一个方向,或输出,或输入。如果需要在两个方向上进行某种单向传输,需要占用两个端点,

          分别配置成不同的方向,可以拥有相同的端点编号。

    3.  批量传输:

          批量传输是一种可靠的单向传输,但延迟没有保证,它尽量利用可以利用的带宽来完成传输,适合数据量比较大的传输。

          低速 USB 设备不支持批量传输,高速批量端点的最大包长度为 512,全速批量端点的最大包长度可以为 8、16、32、64。

          批量传输在访问 USB 总线时,相对其他传输类型具有最低的优先级,USB HOST 总是优先安排其他类型的传输,当总线带宽有富余时才安排批量传输。

          高速的批量端点必须支持PING 操作,向主机报告端点的状态,NYET 表示否定应答,没有准备好接收下一个数据包,ACK 表示肯定应答,已经准备好接收下一个数据包。

    4.  同步传输:

          同步传输是一种实时的、不可靠的传输,不支持错误重发机制。只有高速和全速端点支持同步传输,高速同步端点的最大包长度为 1024,低速的为 1023。

          除高速高带宽同步端点外,一个微帧内仅允许一次同步事务传输,高速高带宽端点最多可以在一个微帧内进行三次同步事务传输,传输高达 3072 字节的数据。

          全速同步传输不得占用超过 80%的帧时间,高速同步传输不得占用超过 90%的微帧时间。 同步端点的访问也和中断端点一样,有固定的时间间隔限制。

          在主机控制器和 USB  HUB 之间还有另外一种传输——分离传输(Split  Transaction)它仅在主机控制器和 HUB之间执行,通过分离传输,可以允许全速/低速设备连接到高速主机。

          分离传输对于USB 设备来说是透明的、不可见的。

          分离传输:顾名思义就是把一次完整的事务传输分成两个事务传输来完成。其出发点是高速传输和全速/低速传输的速度不相等,如果使用一次完整的事务来传输,势必会造成比较长的等待时间,

          从而降低了高速 USB 总线的利用率。通过将一次传输分成两此,将令牌(和数据)的传输与响应数据(和握手)的传输分开,这样就可以在中间插入其他高速传输,从而提高总线的利用率。

    总结:USB的最小单元是“域”,由“域”构成了“包”,在由“包”构成了“事务”,最后由“事务”构成了“传输”,在应用层面,我们看到的只是传输,所以USB协议栈就需要完成传输以下的所有事情。这对标准的USB协议栈提出了最基本的要求。

    -------------------------------------------------------------------------------------------------------------------------------------

    一、USB硬件介绍
    1.1、概述

            一条USB传输线分别由地线、电源线、D+和D-四条线构成,D+和D-是差分输入线,它使用的是3.3V的电压(与CMOS的5V电平不同),而电源线和地线可向设备提供5V电压,最大电流为500mA(可以在编程中设置)。
            USB设备可以直接和HOST通信,或者通过Hub和Host通信。一个USB系统中仅有一个USB 主机,设备包括USB功能设备和USB HUB,最多支持127个设备。物理连接指的是USB传输线。在USB 2.0系统中要求使用屏蔽双绞线。
    1.2、USB HUB
            USB HUB提供了一种低成本、低复杂度的USB接口扩展方法。HUB的上行PORT面向HOST,下行PORT面向设备(HUB或功能设备)。在下行PORT上,HUB提供了设备连接检测和设备移除检测的能力,并给各下行PORT供电。HUB可以单独使能各下行PORT。不同PORT可以工作在不同的速度等级(高速/全速/低速)。
            如果USB设备通过集线器和Host通信,主机集线器监视着每个端口的信号电压,当有新设备接入时便可觉察。集线器端口的两根信号线的每一根都有15kΩ的下拉电阻,而每一个设备在D+都有一个1.5kΩ的上拉电阻。当用USB线将PC和设备接通后,设备的上拉电阻使信号线的电位升高,因此被主机集线器检测到。

    二、USB数据格式

            USB的重要关键字:

            端点(Endpoint):位于USB设备或主机上的一个数据缓冲区,是USB设备中可以进行数据收发的最小单元,支持单向或者双向的数据传输,用来存放和发送USB的各种数据,每一个端点都有惟一的确定地址,有不同的传输特性(如输入端点、输出端点、配置端点、批量传输端点)。设备支持端点的数量是有限制的,除默认端点外低速设备最多支持2组端点(2 个输入,2 个输出),高速和全速设备最多支持15组端点。

            帧:时间概念,在USB中,一帧就是1MS,它是一个独立的单元,包含了一系列总线动作,USB将1帧分为好几份,每一份是一个USB的传输动作。

            上行、下行:设备到主机为上行,主机到设备为下行。

    2.1、USB数据传输方法

            数据在USB线里传送是由低位到高位发送的。

            USB采用不归零取反来传输数据,当传输线上的差分数据输入0时就取反,输入1时就保持原值,为了确保信号发送的准确性,当在USB总线上发送一个包时,传输设备就要进行位插入操作(即在数据流中每连续6个1后就插入一个0),从而强迫NRZI码发生变化。这些是由专门硬件处理的。

    2.2、数据格式

            USB数据是由二进制数字串构成的,首先数字串构成域(有七种),域再构成包,包再构成事务(IN、OUT、SETUP),事务最后构成传输(中断传输、并行传输、批量传输和控制传输)。下面介绍一下域、包和事务。

    2.2.1、域
            域是USB数据最小的单位,由若干位组成(多少位由具体的域决定),域可分为七个类型:

            1、同步域(SYNC)
            所有的USB包都由SYNC开始,高速包的SYNC宽度为32bit,全速/低速包的SYNC段度为8bit。实际接收到的SYNC长度由于USB HUB的关系,可能会小于该值。八位的值固定为0000 0001,用于本地时钟与输入同步。

            2、标识域(PID)
            由四位标识符 + 四位标识符反码构成,表明包的类型和格式,这是一个很重要的部分,这里可以计算出,USB的标识码有16种。USB2.0使用了十六种标识码,标识码的作用是用来说明包的属性的,标识码是和包联系在一起的,标识码分别有以下十六种:

            令牌包 :

            0x01:输出(OUT)启动一个方向为主机到设备的传输,并包含了设备地址和标号。

            0x09:输入(IN) 启动一个方向为设备到主机的传输,并包含了设备地址和标号。

            0x05:帧起始(SOF)表示一个帧的开始,并且包含了相应的帧号。

            0x0d:设置(SETUP)启动一个控制传输,用于主机对设备的初始化。

            数据包 :

            0x03:偶数据包(DATA0)。

            0x0b:奇数据包(DATA1)。

            握手包:

            0x02:确认接收到无误的数据包(ACK)。

            0x0a:无效,接收(发送)端正在忙而无法接收(发送)信息。

            0x0e:错误,端点被禁止或不支持控制管道请求。

            特殊包0x0C前导,用于启动下行端口的低速设备的数据传输。

            3、地址域(ADDR):七位地址,代表了设备在主机上的地址,地址000 0000被命名为零地址,是任何设备第一次连接到主机时,在被主机配置、枚举前的默认地址,由此可以知道为什么一个USB主机只能接127个设备的原因。

            4、端点域(ENDP),四位,由此可知一个USB设备端点数量最大为16个。

            5、帧号域(FRAM),11位,每一个帧都有一个特定的帧号,帧号域最大容量0x800,对于同步传输有重要意义。

            6、数据域(DATA):长度为0~1023字节,在不同的传输类型中,数据域的长度各不相同,但必须为整数个字节的长度。

            7、校验域(CRC):对令牌包和数据包中非PID域进行校验的一种方法,CRC校验在通讯中应用很泛,是一种很好的校验方法,CRC码的除法是模2运算,不同于10进制中的除法。

    2.2.2、包
            USB数据包的格式如下:

            由域构成的包有四种类型,分别是令牌包、数据包、握手包和特殊包,前面三种是重要的包,不同包的域结构不同,介绍如下:         

            1、令牌包

            分为输入包、输出包、设置包和帧起始包(注意这里的输入包是用于设置输入命令的,输出包是用来设置输出命令的,而不是放数据的)其中输入包、输出包和设置包的格式都是一样的:

                                                   SYNC + PID + ADDR + ENDP + CRC5(五位的校验码)

            帧起始包的格式:

                                                   SYNC + PID + 11位FRAM + CRC5(五位的校验码)

            2、数据包

            分为DATA0包和DATA1包,当USB发送数据的时候,如果一次发送的数据长度大于相应端点的容量时,就需要把数据包分为好几个包,分批发送,DATA0包和DATA1包交替发送,即如果第一个数据包是DATA0,那第二个数据包就是DATA1。但也有例外情况,在同步传输中(四类传输类型中之一),所有的数据包都是为DATA0,格式如下:

                                                            SYNC + PID + 0~1023字节 + CRC16

            3、握手包
            结构最为简单的包,格式如下:

                                                                        SYNC + PID
            握手包包括 ACK、NAK、STALL以及NYET 四种,其中 ACK 表示肯定的应答,成功的数据传输。NAK 表示否定的应答,失败的数据传输,要求重新传输。STALL表示功能错误或端点被设置了STALL属性。NYET表示尚未准备好,要求等待。

    2.2.3、事务

            分别有IN、OUT和SETUP三大事务,每一种事务都由令牌包、数据包、握手包三个阶段构成,这里用阶段的意思是因为这些包的发送是有一定的时间先后顺序的,事务的三个阶段如下:

            1、令牌包阶段:启动一个输入、输出或设置的事务。

            2、数据包阶段:按输入、输出发送相应的数据。

            3、握手包阶段:返回数据接收情况,在同步传输的IN和OUT事务中没有这个阶段,这是比较特殊的。

            事务的三种类型如下(以下按三个阶段来说明一个事务):

            1、 IN事务:

            令牌包阶段——主机发送一个PID为IN的输入包给设备,通知设备要往主机发送数据;

            数据包阶段——设备根据情况会作出三种反应(要注意:数据包阶段也不总是传送数据的,根据传输情况还会提前进入握手包阶段)。

            1) 设备端点正常:设备往主机里面发出数据包(DATA0与DATA1交替);

            2) 设备正在忙:无法往主机发出数据包就发送NAK无效包,IN事务提前结束,到了下一个IN事务才继续;

            3) 相应设备端点被禁止:发送错误包STALL包,事务也就提前结束了,总线进入空闲状态。

            握手包阶段——主机正确接收到数据之后就会向设备发送ACK包。

            2、 OUT事务:

            令牌包阶段——主机发送一个PID为OUT的输出包给设备,通知设备要接收数据;

            数据包阶段——比较简单,就是主机会往设备送数据,DATA0与DATA1交替

            握手包阶段——设备根据情况会作出三种反应

            1) 设备端点接收正确,设备给主机返回ACK,通知主机可以发送新的数据,如果数据包发生了CRC校验错误,将不返回任何握手信息;

            2) 设备正在忙,无法给主机返回ACK,就发送NAK无效包,通知主机再次发送数据;

            3) 相应设备端点被禁止,发送错误包STALL包,事务提前结束,总线直接进入空闲状态。

            3、SETUT事务:

            令牌包阶段——主机发送一个PID为SETUP的输出包给设备,通知设备要接收数据;

            数据包阶段——比较简单,就是主机往设备送数据,注意,这里只有一个固定为8个字节的DATA0包,这8个字节的内容就是标准的USB设备请求命令,详见2.4。

            握手包阶段——设备接收到主机的命令信息后,返回ACK,此后总线进入空闲状态,并准备下一个传输(在SETUP事务后通常是一个IN或OUT事务构成的传输)。

    2.3、标准的USB设备请求命令

            标准的USB设备请求命令是用在控制传输中的“初始设置步骤”里的数据包阶段(即DATA0,由八个字节构成)。命令共有11个,大小都是8个字节,具有相同的结构,由5个字段构成(字段是标准请求命令的数据部分),结构如下(括号中的数字表示字节数,首字母bm,b,w分别表示位图、字节,双字节):

                        bmRequestType(1) + bRequest(1) + wvalue(2) + wIndex(2) + wLength(2)

            各字段的意义如下:

            1、bmRequestType:D7D6D5D4D3D2D1D0

            D7=0主机到设备

                =1设备到主机;

            D6D5=00标准请求命令

                =01 类请求命令

                =10用户定义的命令    

                =11保留值

            D4D3D2D1D0=00000 接收者为设备

                =00001 接收者为接口

                =00010 接收者为端点

                =00011 接收者为其他接收者

                =其他  其他值保留

            2、bRequest:请求命令代码,在标准的USB命令中,每一个命令都定义了编号,编号的值就为字段的值,编号与命令名称如下(要注意这里的命令代码要与其他字段结合使用,可以说命令代码是标准请求命令代码的核心,正是因为这些命令代码而决定了11个USB标准请求命令):

            0  GET_STATUS:用来返回特定接收者的状态;

            1  CLEAR_FEATURE:用来清除或禁止接收者的某些特性;

            2) 3  SET_FEATURE:用来启用或激活命令接收者的某些特性;

            5  SET_ADDRESS:用来给设备分配地址;

            6  GET_DEscriptOR:用于主机获取设备的特定描述符;

            7  SET_DEscriptOR:修改设备中有关的描述符,或者增加新的描述符;

            8  GET_CONFIGURATION:用于主机获取设备当前设备的配置值(注同上面的不同);

            9  SET_CONFIGURATION:用于主机指示设备采用的要求的配置;

            10  GET_INTERFACE:用于获取当前某个接口描述符编号;

            11  SET_INTERFACE:用于主机要求设备用某个描述符来描述接口;

     

            12 SYNCH_FRAME:用于设备设置和报告一个端点的同步帧;

           控制传输是USB的重心,而这11个命令是控制传输的重心,所以这11个命令是重中之重。
    2.4、描述符(Descriptor)

            Descriptor是一个完整的数据结构,可以通过C语言等编程实现,并存储在USB设备中,用于描述一个USB设备的所有属性,USB主机是通过一系列命令来要求设备发送这些信息的。它的作用就是给主机传递信息,从而让主机知道设备具有什么功能、属于哪一类设备、要占用多少带宽、使用哪类传输方式及数据量的大小,只有主机确定了这些信息之后,设备才能真正开始工作,所以描述符也是十分重要的部分,标准的描述符有5种,USB为这些描述符定义了编号:

            1——设备描述符

            2——配置描述符

            3——字符描述符

            4——接口描述符

            5——端点描述符

            上面的描述符之间有一定的关系,一个设备只有一个设备描述符,而一个设备描述符可以包含多个配置描述符,而一个配置描述符可以包含多个接口描述符,一个接口使用了几个端点,就有几个端点描述符。这些描述符是用一定的字段构成的,分别如下说明:

            1、设备描述符

    struct _DEVICE_DEscriptOR_STRUCT

    {

        BYTE bLength;          //设备描述符的字节数大小,为0x12

        BYTE bDescriptorType;  //描述符类型编号,为0x01

        WORD bcdUSB;           //USB版本号

        BYTE bDeviceClass;  //USB分配的设备类代码,0x01~0xfe为标准设备类,0xff为厂商自定义类型

                            //0x00不是在设备描述符中定义的,如HID

        BYTE bDeviceSubClass;   //usb分配的子类代码,同上,值由USB规定和分配的

        BYTE bDeviceProtocl;    //USB分配的设备协议代码,同上

        BYTE bMaxPacketSize0;   //端点0的最大包的大小

        WORD idVendor;          //厂商编号

        WORD idProduct;         //产品编号

        WORD bcdDevice;         //设备出厂编号

        BYTE iManufacturer;     //描述厂商字符串的索引

        BYTE iProduct;          //描述产品字符串的索引

        BYTE iSerialNumber;     //描述设备序列号字符串的索引

        BYTE bNumConfiguration; //可能的配置数量

    }

            2、配置描述符

    struct _CONFIGURATION_DEscriptOR_STRUCT

    {

        BYTE bLength;          //设备描述符的字节数大小,为0x12

        BYTE bDescriptorType;  //描述符类型编号,为0x01

        WORD wTotalLength;     //配置所返回的所有数量的大小

        BYTE bNumInterface;    //此配置所支持的接口数量

        BYTE bConfigurationVale;   //Set_Configuration命令需要的参数值

        BYTE iConfiguration;       //描述该配置的字符串的索引值

        BYTE bmAttribute;          //供电模式的选择

        BYTE MaxPower;             //设备从总线提取的最大电流

    }

            3、字符描述符

    struct _STRING_DEscriptOR_STRUCT

    {

        BYTE bLength;          //设备描述符的字节数大小,为0x12

        BYTE bDescriptorType;  //描述符类型编号,为0x01

        BYTE SomeDescriptor[36];          //UNICODE编码的字符串

    }

            4、接口描述符

    struct _INTERFACE_DEscriptOR_STRUCT

    {

        BYTE bLength;          //设备描述符的字节数大小,为0x12

        BYTE bDescriptorType;  //描述符类型编号,为0x01

        BYTE bInterfaceNunber; //接口的编号

        BYTE bAlternateSetting;//备用的接口描述符编号

        BYTE bNumEndpoints;    //该接口使用端点数,不包括端点0

        BYTE bInterfaceClass;  //接口类型

        BYTE bInterfaceSubClass;//接口子类型

        BYTE bInterfaceProtocol;//接口所遵循的协议

        BYTE iInterface;        //描述该接口的字符串索引值

    }

            5、端点描述符

    struct _ENDPOIN_DEscriptOR_STRUCT

    {

        BYTE bLength;          //设备描述符的字节数大小,为0x12

        BYTE bDescriptorType;  //描述符类型编号,为0x01

        BYTE bEndpointAddress; //端点地址及输入输出属性

        BYTE bmAttribute;      //端点的传输类型属性

        WORD wMaxPacketSize;   //端点收、发最大包的大小

        BYTE bInterval;        //主机查询端点的时间间隔

    }

    三、传输
            USB系统中的数据传输,宏观看是在HOST和USB功能设备之间进行。微观看是在应用软件的Buffer和USB功能设备的端点之间进行。一般来说端点都有Buffer,可以认为USB通讯就是应用软件Buffer和设备端点Buffer之间的数据交换,交换的通道称为管道。应用软件通过和设备之间的数据交换来完成设备控制和数据传输。通常需要多个管道来完成数据交换,因为同一管道只支持一种类型的数据传输。用在一起来对设备进行控制的若干管道称为设备的接口,这就是端点、管道和接口的关系。
            USB 采用“令牌包”-“数据包”-“握手包”的传输机制,在令牌包中指定数据包去向或者来源的设备地址和端点(Endpoint),从而保证了只有一个设备对被广播的数据包/令牌包作出响应。握手包表示了传输的成功与否。
            USB 采用轮询的广播机制传输数据,所有的传输都由主机发起,任何时刻整个 USB 体系内仅允许一个数据包的传输,即不同物理传输线上看到的数据包都是同一被广播的数据包。

            传输由OUT、IN和SETUP事务构成,传输有四种类型,中断传输、批量传输、同步传输、控制传输,其中中断传输和批量传输的结构一样,同步传输有最简单的结构,而控制传输是最重要的也是最复杂的传输。

     

    3.1、控制传输
            控制传输是一种可靠的双向传输,是最重要也是最复杂的,一次控制传输可分为构成(初始设置阶段、可选数据阶段、状态信息步骤),每一个阶段可以看成一个传输,也就是说控制传输其实是由三个传输构成的,在USB设备初次接到主机后,主机通过控制传输来交换信息、设备地址和读取设备的描述符,使得主机识别设备,并安装相应的驱动程序,这是每一个USB开发者都要关心的问题。
            第一阶段:从HOST到Device的SETUP事务传输,这个阶段指定了此次控制传输的请求类型。
            第二阶段:数据阶段,也有些请求没有数据阶段。
            第三阶段:状态阶段,通过一次IN/OUT传输表明请求是否成功完成。
            控制传输通过控制管道在应用软件和Device的控制端点之间进行,控制传输过程中传输的数据是有格式定义的,USB 设备或主机可根据格式定义解析获得的数据含义。其他三种传输类型都没有格式定义。控制传输对于最大包长度有固定的要求。对于高速设备该值为64Byte,对于低速设备该值为8,全速设备可以是8或16或32或64。
            最大包长度表征了一个端点单次接收/发送数据的能力,实际上反应的是该端点对应Buffer的大小。Buffer越大,单次可接收/发送的数据包越大,反之亦反。当通过一个端点进行数据传输时,若数据的大小超过该端点的最大包长度时,需要将数据分成若干个数据包传输。并保证除最后一个包外,所有的包长度均等于该最大包长度。这也就是说如果一个端点收到/发送了一个长度小于最大包长度的包,即意味着数据传输结束。
            控制传输在访问总线时也受到一些限制,如高速端点的控制传输不能占用超过 20%的微帧,全速和低速的则不能超过 10%。在一帧内如果有多余的未用时间,并且没有同步和中断传输,可以用来进行控制传输。


            控制传输(Transaction) 一次控制传输分为三(或两个)个阶段:建立(Setup)、数据(DATA)(可能没有)以及状态(Status)。每个阶段都由一次或多次(数据阶段)事务传输组成(Transaction)。
            上图为建立阶段的事务传输流程图。可以看出:
            与批量传输相比,在流程上并没有多大区别,区别只在于该事务传输发生的端点不一样、支持的最大包长度不一样、优先级不一样等这样一些对用户来说透明的东西。
            建立阶段过后,可能会有数据阶段,这个阶段将会通过一次或多次控制传输事务,完成数据的传输。同样也会采用PID翻转的机制。
            建立阶段,Device 只能返回ACK包,或者不返回任何包。
            最后是状态阶段,通过一次方向与前一次相反的控制事务传输来表明传输的成功与否。如果成功会返回一个长度为0的数据包,否则返回 NAK或STALL。下图为整个控制传输的示意图:

    3.2、中断传输
            中断传输是一种轮询的传输方式,是一种单向的传输。HOST通过固定的间隔对中断端点进行查询,若有数据传输或可以接收数据则返回数据或发送数据。否则返回NAK,表示尚未准备好。中断传输的延迟有保证,但并非实时传输,它是一种延迟有限的可靠传输,支持错误重传。对于高速/全速/低速端点,最大包长度分别可以达到1024/64/8 Bytes。 高速中断传输不得占用超过 80%的微帧时间,全速和低速不得超过90%。 中断端点的轮询间隔由在端点描述符中定义,全速端点的轮询间隔可以是1~255mS。低速端点为10~255mS,高速端点为(2interval-1)*125uS,其中 interval 取 1到 16 之间的值。
            除高速高带宽中断端点外,一个微帧内仅允许一次中断事务传输。高速高带宽端点最多可以在一个微帧内进行三次中断事务传输,传输高达 3072 字节的数据。
            所谓单向传输,并不是说该传输只支持一个方向的传输。而是指在某个端点上该传输仅支持一个方向,或输出、或输入。如果需要在两个方向上进行某种单向传输,需要占用两个端点,分别配置成不同的方向。可以拥有相同的端点编号。
            中断传输由OUT事务和IN事务构成,用于键盘、鼠标等HID设备的数据传输。
            中断传输在流程上除不支持PING之外,其他的跟批量传输是一样的。他们之间的区别也仅在于事务传输发生的端点不一样、支持的最大包长度不一样、优先级不一样等这样一些对用户来说透明的东西。
            主机在排定中断传输任务时,会根据对应中断端点描述符中指定的查询间隔发起中断传输。中断传输有较高的优先级,仅次于同步传输。同样中断传输也采用 PID 翻转的机制来保证收发端数据同步。
            下图为中断传输的流程图。

    3.3、批量传输
            批量传输由OUT事务和IN事务构成,是一种可靠的单向传输,但延迟没有保证,它尽量利用可以利用的带宽来完成传输,适合数据量比较大的传输。低速USB设备不支持批量传输,高速批量端点的最大包长度为512,全速批量端点的最大包长度可以为8、16、32、64。
            批量传输在访问USB总线时,相对其他传输类型具有最低的优先级,USB HOST总是优先安排其他类型的传输,当总线带宽有富余时才安排批量传输。高速的批量端点必须支持PING操作,向主机报告端点的状态。NYET表示否定应答,没有准备好接收下一个数据包,ACK 表示肯定应答,已经准备好接收下一个数据包。

            图中一个方框表示一个 Packet,灰色的包表示主机发出的包,白色的包表示Device发出的包。批量传输是可靠的传输,需要握手包来表明传输的结果。若数据量比较大,将采用多次批量事务传输来完成全部数据的传输,传输过程中数据包的PID按照 DATA0-DATA1-DATA0-...的方式翻转,以保证发送端和接收端的同步。若成功则将错误次数计数器清0,否则累加该计数器。USB允许连续3次以下的传输错误,会重试该传输。超过三次后,HOST 认为该端点功能错误(STALL),放弃该端点的传输任务。
            一次批量传输(Transfer)由 1 次到多次批量事务传输(Transaction)组成。
            翻转同步:发送端按照 DATA0-DATA1-DATA0-...的顺序发送数据包,只有成功的事务传输才会导致PID翻转,也就是说发送段只有在接收到ACK后才会翻转PID,发送下一个数据包,否则会重试本次事务传输。同样,若在接收端发现接收到的数据包不是按照此顺序翻转的,比如连续收到两个DATA0,那么接收端认为第二个DATA0是前一个DATA0的重传。

    3.4、同步传输

            同步传输是一种实时的、不可靠的传输,不支持错误重发机制。只有高速和全速端点支持同步传输,高速同步端点的最大包长度为1024,低速的为1023。由OUT事务和IN事务构成。有两个特殊地方,第一,在同步传输的IN和OUT事务中是没有返回包阶段的;第二,在数据包阶段所有的数据包都为DATA0。
            除高速高带宽同步端点外,一个微帧内仅允许一次同步事务传输,高速高带宽端点最多可以在一个微帧内进行三次同步事务传输,传输高达 3072 字节的数据。全速同步传输不得占用超过 80%的帧时间,高速同步传输不得占用超过90%的微帧时间。同步端点的访问也和中断端点一样,有固定的时间间隔限制。

            同步传输是不可靠的传输,所以它没有握手包,也不支持PID翻转。主机在排定事务传输时,同步传输有最高的优先级。

    3.5、分离传输(Split Transaction)
            分离传输是在主机控制器和USB HUB之间的传输,它仅在主机控制器和HUB之间执行,通过分离传输,可以允许全速/低速设备连接到高速主机。分离传输对于USB设备来说是透明的、不可见的。
            分离传输,顾名思义就是把一次完整的事务传输分成两个事务传输来完成。其出发点是高速传输和全速/低速传输的速度不相等,如果使用一次完整的事务来传输,势必会造成比较长的等待时间,从而降低了高速USB总线的利用率。通过将一次传输分成两次,将令牌(和数据)的传输与响应数据(和握手)的传输分开,这样就可以在中间插入其他高速传输,从而提高总线的利用率。
    3.6、总结

            包是USB总线数据传输的最小单位,不能被打断或干扰,否则会引发错误。若干个数据包组成一次事务传输,一次事务传输也不能打断,属于一次事务传输的几个包必须连续,不能跨帧完成。一次传输由一次到多次事务传输构成,可以跨帧完成。
    四、枚举

            USB设备连接到HOST时,HOST必须通过默认的控制管道对其进行枚举,完成获得其设备描述、进行地址分配、获得其配置描述、进行配置等操作后方可正常使用。USB设备的即插即用特性即依赖于此。

    4.1、枚举时USB的状态

            当USB设备插上主机时,主机就通过一系列的动作来对设备进行枚举配置(配置是属于枚举的一个态,态表示暂时的状态),这些态如下:

            1、接入态(Attached):设备接入主机后,主机通过检测信号线上的电平变化来发现设备的接入;

            2、供电态(Powered):就是给设备供电,分为设备接入时的默认供电值,配置阶段后的供电值(按数据中要求的最大值,可通过编程设置);

            3、缺省态(Default):USB在被配置之前,通过缺省地址0与主机进行通信;

            4、地址态(Address):经过了配置,USB设备被复位后,就可以按主机分配给它的唯一地址来与主机通信,这种状态就是地址态;

            5、配置态(Configured):通过各种标准的USB请求命令来获取设备的各种信息,并对设备的某些信息进行改变或设置。

            6、挂起态(Suspended):总线供电设备在3ms内没有总线操作,即USB总线处于空闲状态的话,该设备就要自动进入挂起状态,在进入挂起状态后,总的电流功耗不超过280uA。
            状态转移图如下所示:

     

           4.2、枚举过程

            1、用户将一个USB设备插入USB端口,主机为端口供电,设备此时处于上电状态。主机检测设备。集线器使用中断通道将事件报告给主机。

            2、主机发送Get_Port_Status(读端口状态)请求,以获取更多的设备信息。返回的消息告诉主机该设备是什么时候连接的。集线器检测设备是低速运行还是高速运行,并将此信息送给主机,这是对Get_Port_Status请求的响应。

            3、主机发送Set_Port_Feature(写端口状态)请求给集线器,要求它复位端口,请求集线器来重新设置端口。集线器使设备的USB数据线处于重启(RESET)状态至少10ms。

            4、主机使用Chirp K信号来了解全速设备是否支持高速运行。

            5、主机发送另一个Get_Port_Status请求,确定设备是否已经从复位状态退出。返回的数据有一位表示设备仍然处于重启状态。当集线器释放了重启状态,设备此时处于缺省状态,且已准备好在零端点通过缺省通道响应主机控制传输。缺省地址为00h,设备能从总线获取高达100mA的电流。
            6、集线器检测设备速度 

            集线器通过测定哪根信号线(D+或D-)在空闲时有更高的电压来检测设备是低速设备还是全速设备。全速和高速设备D+有上拉电阻,低速设备D-有上拉电阻。

            7、获取最大数据包长度
            主机向address 0发送Get_Device_Deor(读设备描述符)报文,以取得缺省控制管道所支持的最大数据包长度。并在有限的时间内等待USB设备的响应。该长度包含在设备描述符的bMaxPacketSize0字段中,其地址偏移量为7,所以这时主机只需读取该描述符的前8个字节。注意,主机一次只能枚举一个USB设备,所以同一时刻只能有一个USB设备使用缺省地址0。
            例:主机向设备发送一个八字节请求:80 06 00 01 00 00 40 00,设备接收到请求后产生一个中断,我们可以通过读中断寄存器知道中断源,并且可以加读最后状态寄存器来确定第一个接到的包是否为一个Setup包。当控制器处理程序判断出它是一个Get_descriptor请求时,把设备描述符的前16个字节发送到端点0缓冲区中。剩下的2个字节描述符第一次请求时不再发送。

            8、主机分配一个新的地址给设备

            主机通过发送一个Set_Address请求来分配一个唯一的地址给设备。设备读取这个请求,返回一个确认,并保存新的地址。从此开始所有通信都使用这个新地址。

            例:当主机收到正确的前16字节描述符后,会给设备分配一个地址,我的PC分配的地址为:0x03(这个要看你的机子当时的USB接口设备数目而定) Set_Address 请求所发送的数据为:00 05 03 00 00 00 00 00,其中的03就表示主机为设备分配的地址为0x03,在以后的通信里设备就只对0x03地址作出应答。当设备产生一个接收中断后,根据所分配的地址设置设备的地址寄存器相应位。

            9、主机向新地址重新发送Get_Device_Deor命令,此次读取其设备描述符的全部字段,以了解该设备的总体信息,如VID,PID。
            例:主机发送设备描述符标准请求Get_descriptor:80 06 00 01 00 00 12 00,此次将要求把18个字节全部发送完。所以主机要分两次来读取。第一次读取16个字节,第二次读取两个字节,最后主机发送0表示发送完毕的应答。

            10、主机向设备循环发送Get_Device_Configuration命令,要求USB设备回答,以读取全部配置信息。

            11、主机发送Get_Device_String命令,获得字符集描述(unicode),比如产商、产品描述、型号等等。此时主机将会弹出窗口,展示发现新设备的信息,产商、产品描述、型号等。

            根据Device_Deor和Device_Configuration应答,PC判断是否能够提供USB的Driver,一般win2k能提供几大类的设备,如游戏操作杆、存储、打印机、扫描仪等,操作就在后台运行。但是Win98却不可以,所以在此时将会弹出对话框,索要USB的Driver。

            12、主机分配并加载设备驱动程序,这时就可能作应用中的数据传输了。

            13、主机发送Set_Configuration(x)(写配置)命令请求为该设备选择一个合适的配置(x代表非0的配置值)。如果配置成功,USB设备进入“配置”状态,并可以和客户软件进行数据传输。此时,常规的USB完成了其必须进行的配置和连接工作,至此设备应当可以开始使用。不过,USB协议还提供了一些用户可选的协议,设备如果不应答,也不会出错,但是会影响到系统的功能。

            14、主机为复合设备接口分配驱动程序。如果集线器检测到有过流现象,或者主机要求集线器关闭电源,则USB总线切断设备供电电源。在这种情况下,设备与主机无法通信,但设备处于连接状态。   

            使用USB View 采集到的数据:

    Device Descriptor:
    bcdUSB:             0x0100
    bDeviceClass:         0xDC
    bDeviceSubClass:      0x00
    bDeviceProtocol:      0x00
    bMaxPacketSize0:      0x10 (16)
    idVendor:           0x0471
    idProduct:          0x0666
    bcdDevice:          0x0100
    iManufacturer:        0x00
    iProduct:             0x00
    iSerialNumber:        0x00
    bNumConfigurations:   0x01

    ConnectionStatus: DeviceConnected
    Current Config Value: 0x01
    Device Bus Speed:     Full
    Device Address:       0x02
    Open Pipes:              4

    Endpoint Descriptor:
    bEndpointAddress:     0x81
    Transfer Type:   Interrupt
    wMaxPacketSize:     0x0010 (16)
    bInterval:            0x0A

    Endpoint Descriptor:
    bEndpointAddress:     0x01
    Transfer Type:   Interrupt
    wMaxPacketSize:     0x0010 (16)
    bInterval:            0x0A

    Endpoint Descriptor:
    bEndpointAddress:     0x82
    Transfer Type:        Bulk
    wMaxPacketSize:     0x0040 (64)
    bInterval:            0x0A

    Endpoint Descriptor:
    bEndpointAddress:     0x02
    Transfer Type:        Bulk
    wMaxPacketSize:     0x0040 (64)
    bInterval:            0x0A

    4.3、USB枚举实例

            对2440的USB HOST进行初始化完毕(主要包括对符合OHCI规范的寄存器的初始化—总线复位、中断使能、清除中断标志、电源管理、内存指针寄存器的初始化,各种数据结构的初始化等),等待USB设备的插入,当2440检测到有设备插入,就要对设备进行枚举了。起始枚举就相当于主机和设备建立连接的过程(接头),Host向Device询问一些东西,Device将自身的设备类型,如何进行通信报告给Host,这样Host就知道怎么对Device进行操作了。

            枚举的过程实际上用到而且只用到了总线的“控制传输(Control Transfer)”。这种传输方式通常用于配置/命令/状态等情形,其中的设置操作setup和状态操作status过程的数据包具有USB协议定义的数据结构,因此,控制传输只能通过消息管道进行。

            一个完整的控制传输包括三个过程:

            1、建立连接。    
            2、数据过程(可选) 。        
            3、状态过程。

            建立连接的过程都是由Host发起,它开始于一个Setup令牌包,后面紧跟一个DATA0包。如果是控制输入传输,数据过程则为输入数据,若是控制输出传输,则数据过程是输出数据。

            数据过程的可选型是指设置过程需要指定数据长度,如果指定为0,则没有数据过程。状态过程跟在数据过程之后,状态过程恰好和数据过程的数据传输方向相反,因为此阶段主要是用来确认之前两阶段的所有数据都已经正确传输了。

           好了,下面就结合我的这个实例来看看枚举的详细过程:

            1、控制2440向U盘发送第一个Setup包,内容是80 06 00 01 00 00 08 00,其中最后的00 08表示得到DEVICE_DCESCRIPTOR的前8个字节,因为这个包的主要目的是要获得USB Device中端点0的最大包的大小(第8个字节),所以只需要8个字节就可以了。USB Device返回的设备标识符为12 01 10 01 00 00 00 40,下面我们需要把0x40记录下来,将其放到Endpoint Descriptor数据结构的DWORD0的MPS(bit16~bit32)块中去。
            2、接下来2440发送第二个Setup包,内容是00 05 01 00 00 00 00 00,这一次的作用是为USB设备分配地址。如果USB Device接收并接受了此地址设置包,会返回一个长度为0的数据包。主机接收到长度为0的状态包之后就会返回一个ACK给Device,Device再接收到这个ACK之后,就可以启用新地址了。这样Device就得到了一个唯一的设备地址,作为主机通信的唯一表示。

            3、发送第三个Setup包,内容是80 06 00 02 00 00 09 00,这次是为了获取配置描述符集合的大小,此位位于读回数据的第三个字节。U盘返回的数据为09 02 20 00 01 01 00 80 32,即描述符集合总大小为0x20。

            4、发送第四个Setup包,内容是80 06 00 02 00 00 09 00,和上次不同的仅仅是,这次要读回来的数据是整个配置描述符区域。U盘返回来的数据是09 02 20 00 01 01 00 80 32 09 04 00 00 02 08 06 50 00 07 05 82 02 40 00 00 07 05 02 02 40 00 00。这时候我们就可以知道该设备是什么类型的设备,支持什么样的操作了。

    上述这两个过程也有的程序就是直接读取0xff个字符大小,当然同样可以达到读回设备描述符集合的目的。

    至此,我们已经得到了所需要的设备信息,之后就可以对设备进行配置了。

            5、向设备发送第五个Setup包,数据为00 09 01 00 00 00 00 00,USB Device返回一个长度为0的数据包,表明数据正确接收。至此,USB枚举过程就完成了。初始设置步骤:就是一个由SET事务构成的传输

            可选数据步骤:就是一个由IN或OUT事务构成的传输,这个步骤是可选的,要看初始设置步骤有没有要求读/写数据(由SET事务的数据包阶段发送的标准请求命令决定)。

            状态信息步骤:这个步骤就是要获取状态信息,由IN或OUT事务构成的传输,但是要注意这里的IN和OUT事务和之前的INT和OUT事务有两点不同:

            1) 传输方向相反,通常IN表示设备往主机送数据,OUT表示主机往设备送数据;在这里,IN表示主机往设备送数据,而OUT表示设备往主机送数据,这是为了和可选数据步骤相结合;

            2) 在这个步骤里,数据包阶段的数据包都是0长度的,即SYNC+PID+CRC16。

    展开全文
  • Linux驱动之USB设备驱动

    千人学习 2018-10-22 21:38:06
    不管是USB设备还是USB接口,都会被注册到同一个bus上,也就是usb_bus_type,其之间的区别会在match函数中区分,之后再去绑定不同的driver。 当一个USB设备被插入的时候,USB设备驱动,也就是usb_generic_driver会跟...
  • USB设备开发流程

    千次阅读 2019-01-05 17:41:01
    USB设备的开发一般包括主机端(上位机)驱动程序的开发(如果您的USB设备符合某一标准设备类且主机端已经提供了此类设备的驱动程序的话,则可以省掉此步骤)和USB设备端驱动程序的开发,有时还可能包...
  • Windows下usb接口驱动技术

    千次阅读 2019-08-16 10:00:04
    一、USB概述 USB的英文全称为Universal Serial Bus,中文含义是通用串行总线,是由Conpaq、DEC、IBM、Inter、Microsoft、NEC和Northen Telecom等公司为简化PC与外设之间的互连而共同研究开发的一种免费的标准化连接...
  • USB通信接口介绍

    千次阅读 2018-11-09 10:55:15
    1. 概述 Usb = Universal Serial Bus全称通用串行总线,是一种支持热插拔的高速串行传输总线,使用差分信号来...由于USB是主从模式的结构,设备与设备之间、主机与主机之间不能互连,为解决这个问题,扩大USB的应用...
  • 从零开始学USB(十、USB的描述符)

    万次阅读 多人点赞 2019-01-04 23:38:25
    USB设备使用描述符报告其属性。描述符是具有定义格式的数据结构。每个描述符都以字节宽度字段开头,该字段包含描述符中的总字节数,后跟一个标识描述符类型的字节宽度字段。 使用描述符允许简单地存储各个配置的...
  • USBUSB的VID和PID

    万次阅读 2018-04-18 15:30:00
    1.USB定义,VID是什么,PID是什么,他们有什么用? USB(Universal Serial BUS,通用串行总线); VID(Vender ID供应商识别码)和PID(Product ID产品识别码); 每一个USB设备都有VID和PID; 其中,VID是由供应商向USB...
  • 1.USB协议简介

    万次阅读 多人点赞 2018-09-11 20:46:28
    最近学习usb相关的知识,一直感觉入不了门,看《linux那些事儿之我是usb》,对usb协议也不是很熟悉,没能坚持看下去,直到看了《圈圈教你玩usb》一书,把自己的兴趣立马提了起来,大牛圈圈用51单片机实现了usb鼠标...
  • USB具体通讯过程(含枚举过程)

    万次阅读 多人点赞 2018-07-16 10:45:03
    前言 现在刚开始接触USB的开发,零零散散学习了一些USB基础知识,但是却得不到连贯。在这个学习过程中首先困惑的就是USB通讯过程究竟是什么样子的,我觉得做一下简单的了解后记录下来,首先从USB整体结构基础来入手...
  • 最全USB 接口类型

    万次阅读 2017-10-07 16:11:44
    https://www.cablestogo.com/learning/connector-guides/usb总览USB A-TypeUSB B-TypeUSB C-TypeMicro-USB AMicro-USB BMicro-USB AB:前两个公头的母头USB Mini-b(5-pin)USB Mini-b(4-pin)USB 3.0 A-TypeUSB 3.0
  • USB 驱动框架

    万次阅读 2014-04-08 21:35:25
    一、USB驱动程序概观
  • 一键 为 Win7 安装盘 注入 USB 3.0驱动

    万次阅读 2016-03-30 16:45:25
    一键 为 Win7 安装盘 注入 USB 3.0驱动 以使得 可以通过USB 3.0 安装Win7 https://downloadcenter.intel.com/zh-cn/download/25476/Windows7-USB3-0Creator 只需要下载此软件(Windows7 USB3.0 Creator),选择 你...
  • USB Type A/B/C基本知识和各版本区别

    万次阅读 2016-11-25 18:53:40
    自从苹果不久前在新MacBook上破天荒的使用单一数据接口USB Type C以来,关于USB接口的讨论又逐渐热闹起来。在苹果新MacBook中整个机身只有一个数据接口(除去电源接口)USB Type C,这不禁让人疑惑单一接口是否能满足...
  • USB 公,母头接口

    万次阅读 2013-08-06 16:57:04
    今天在设计电路板的时候 需要使用USB接口 对USB接口引脚作下记录: USB-A 公头,引脚的次序如下图,有孔的那一面是正面。 母头如下: 公头和母头的原理图封装都可如下图: 母头的封装可如下: 最后来...
  • USB3.1 Gen1与Gen2有什么区别

    万次阅读 2018-07-10 09:21:52
    对于USB3.1大家应该都不陌生,这是当下最流行的USB接口标准,USB接口在经历了USB1.0、USB1.1、USB2.0以及USB3.0之后,迎来了当下最流行的USB3.1,这些标准的新旧交替下,USB接口的传输速率一直在提高,跟随着传输...
  • 摘要: USB3.0采用的双总线结构,在速率上已经达到4.8Gbps,所以称为Superspeed,在USB3.0的LOGO上显示为SS,由于接口变化太大,再加上把USB3.0协议集成到相关芯片组肯定也需要时间,所以USB3.0的普及应 ...
  • ...  十多年前,USB总线进入主流视野,提供了一个全新的存储方向,并用一个统一的标准把众多外设都...但是推广USB的组织有着特殊的取名技巧,让人捉摸不透:十多年后的今天,进化了三个大版本的USB标准,不光...
1 2 3 4 5 ... 20
收藏数 308,694
精华内容 123,477
关键字:

usb