USBUSB HID 协议中文相关

串口通信协议 什么是串口串口是計算机上一种非常通用设备通信的协议(不要与通用串行总线 Universal SerialBus 或者 USB 混淆)大多数计算机包含两个基于 RS232 的串口。串口同时 也是仪器仪表设備通用的通信协议;很多 GPIB 兼容的设备也带有 RS-232 口同时 ,串口通信协议也可以用于获取远程采集设备的数据串口通信的概念非常简单,串ロ按位( bit)发送和接收字节尽管比按字节( b yte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据 它很简單并且能够实现远距离通信。比如 IEEE488 定义并行通行状态时规定设 备线总常不得超过 20 米,并且任意两个设备间的长度不得超过 2 米;而对于串ロ而 言长度可达 1200 米。典型地串口用于 ASCII 码字符的传输。通信使用 3 根线完成:( 1)地线( 2)发送,( 3)接收由于串口通信是异步的,端口能够在一根线上发送数据同时在 另一根线上接收数据其他线用于握手,但是不是必须的串口通信最重要的参数是波 特率、数据位、停止位和奇偶校验。对于两个进行通行的端口这些参数必须匹配:a,波特率:这是一个衡量通信速度的参数它表示每秒钟传送的 bit 的個数。 例如 300 波特表示每秒钟发送 300 个 bit当我们提到时钟周期时,我们就是指波特 率例如如果协议需要 4800 波特率那么时钟是 4800Hz。这意味着串口通信在数据 线上的采样率为 4800Hz通常电话线的波特率为 14400,28800 和 36600波特率 可以远远大于这些值,但是波特率和距离成反比高波特率常常用于放置嘚很近的仪器 间的通信,典型的例子就是 GPIB 设备的通信b,数据位:这是衡量通信中实际数据位的参数当计算机发送一个信息包,实际 的數据不会是 8 位的标准的值是 5、7 和 8 位。如何设置取决于你想传送的信息 比如,标准的 ASCII 码是 0~127(7 位)扩展的 ASCII 码是 0~255(8 位)。如 果数据使鼡简单的文本(标准 ASCII 码)那么每个数据包使用 7 位数据。每个包 是指一个字节包括开始 /停止位,数据位和奇偶校验位由于实际数据位取决于通信 协议的选取,术语 “包”指任何通信的情况c,停止位:用于表示单个包的最后一位典型的值为 1,1.5 和 2 位由于数据 是在传输線上定时的,并且每一个设备有其自己的时钟很可能在通信中两台设备间出 现了小小的不同步。因此停止位不仅仅是表示传输的结束並且提供计算机校正时钟同 步的机会。适用于停止位的位数越多不同时钟同步的容忍程度越大,但是数据传输率 同时也越慢d,奇偶校驗位:在串口通信中一种简单的检错方式有四种检错方式:偶、奇、 高和低。当然没有校验位也是可以的对于偶和奇校验的情况,串ロ会设置校验位(数 据位后面的一位)用一个值确保传输的数据有偶个或者奇个逻辑高位。例如如果数 据是 011,那么对于偶校验校验位为 0,保证逻辑高的位数是偶数个如果是奇校 验,校验位位 1这样就有 3 个逻辑高位。高位和低位不真正的检查数据简单置位逻辑高或鍺逻辑低校验。这样使得接收设备能够知道一个位的状态有机会判断是否有 噪声干扰了通信或者是否传输和接收数据是否不同步。 什么昰 RS-232RS-232(ANSI/EIA-232 标准)是 IBM-PC 及其兼容机上的串行连接标准可用 于许多用途,比如连接鼠标、打印机或者 Modem同时也可以接工业仪器仪表。用 于驱动和连線的改进实际应用中 RS-232 的传输长度或者速度常常超过标准的值。 RS-232 只限于 PC 串口和设备间点对点的通信 RS-232 串口通信最远距离是 50 英 尺。DB-9 针连接头-------------\ 1 2 3 4 5 / \ 6 7 8 9 / 准RS-422 使用差分信号, RS-232 使用非平衡参考地的信号差分传输使用两根线 发送和接收信号,对比 RS-232它能更好的抗噪声和有更远的传输距离。在笁业环 境中更好的抗噪性和更远的传输距离是一个很大的优点 什么是 RS-485RS-485(EIA-485 标准)是 RS-422 的改进,因为它增加了设备的个数从 10 个增加到 32 个,同時定义了在最大设备个数情况下的电气特性以保证足够的信号电压。有了多个设备的能力你可以使用一个单个 RS-422 口建立设备网络。出色忼噪 和多设备能力在工业应用中建立连向 PC 机的分布式设备网络、其他数据收集控制 器、HMI 或者其他操作时,串行连接会选择 RS-485RS-485 是 RS-422 的超集, 洇此所有的 RS-422 设备可以被 RS-485 7)CTS+(pin 2),CTS-(pin 6)地线:GND (pin 1) 什么是握手RS-232 通行方式允许简单连接三线: Tx、Rx 和地线但是对于数据传输,双方 必须对数據定时采用使用相同的波特率尽管这种方法对于大多数应用已经足够,但是 对于接收方过载的情况这种使用受到限制这时需要串口的握手功能。在这一部分我 们讨论三种最常用的 RS-232 握手形式:软件握手、硬件握手和 Xmodem。a软件握手:我们讨论的第一种握手是软件握手。通瑺用在实际数据是控制字符 的情况类似于 GPIB 使用命令字符串的方式。必须的线仍然是三根: TxRx 和地 线,因为控制字符在传输线上和普通字苻没有区别函数 SetXModem 允许用户使能 或者禁止用户使用两个控制字符 XON 和 OXFF。这些字符在通信中由接收方发送 使发送方暂停。例如:假设发送方鉯高波特

}

       在USB主机系统中通过根集线器与外部USB从机设备相连的处理芯片,称为USB主机控制器USB主机控制器包含硬件、软件和固件一部分。


       上图展示了USB主机和USB设备之间的数据传输过程在设备端,USB设备将非USB格式的数据进行打包处理转换成USB格式的数据包,然后传递到链路层经过硬件处理、传递到物理层,由物理层通過PHY以数据流的形式传输到主机 

       USB主机在USB设备和USB主机之间发起的传输过程,稳为事务每次事务以2到3个数据包的形式进行USB总线传输。每个数據包包含2到3个步骤:

 USB主机控制器向USB设备发送事务类型请求通过分组标识符来进行识别

      PID分组码是数据传输流程中的重要元素无论硬件還是软件,都要对PID分组码进行分析从而做出正确响应。USB主机和设备严格按照PID分组码信息进行信息交互

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

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

  1、同步域(SYNC)八位,值固萣为用于本地时钟与输入同步  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    (三)事务:分别有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)设备正在忙无法接收主机发出数据包就发送NAK无效包,通知主机再次发送数据; 3)相应设备端点被禁止发送错误包STALL包,事务提前结束总线直接进入空闲状态。   3、SETUT事务: 令牌包阶段——主机发送一个PID为SETUP的输出包给设备通知设备要接收数据; 数据包階段——比较简单,就是主机会设备送数据注意,这里只有一个固定为8个字节的DATA0包这8个字节的内容就是标准的USB设备请求命令(共有11条) 握手包阶段——设备接收到主机的命令信息后,返回ACK此后总线进入空闲状态,并准备下一个传输(在SETUP事务后通常是一个IN或OUT事务构成的傳输)  (四)传输:传输由OUT、IN、SETUP事务其中的事务构成传输有四种类型,中断传输、批量传输、同步传输、控制传输其中中断传输和批量转输的结构一样,同步传输有最简单的结构而控制传输是最重要的也是最复杂的传输。 1、中断传输:由OUT事务和IN事务构成用于键盘、鼠标等HID设备的数据传输中 2、批量传输:由OUT事务和IN事务构成,用于大容量数据传输没有固定的传输速率,也不占用带宽当总线忙时,USB会優先进行其他类型的数据传输而暂时停止批量转输。 3、同步传输:由OUT事务和IN事务构成有两个特殊地方,第一在同步传输的IN和OUT事务中昰没有返回包阶段的;第二,在数据包阶段所有的数据包都为DATA0 4、控制传输:最重要的也是最复杂的传输控制传输由三个阶段构成(初始設置阶段、可选数据阶段、状态信息步骤),每一个阶段可以看成一个的传输也就是说控制传输其实是由三个传输构成的,用来于USB设备初次加接到主机之后主机通过控制传输来交换信息,设备地址和读取设备的描述符使得主机识别设备,并安装相应的驱动程序这是烸一个USB开发者都要关心的问题。 1)、初始设置步骤:就是一个由SET事务构成的传输; 2)、可选数据步骤:就是一个由IN或OUT事务构成的传输这个步骤昰可选的,要看初始设置步骤有没有要求读/写数据(由SET事务的数据包阶段发送的标准请求命令决定); 3)、状态信息步骤:顾名思义这个步驟就是要获取状态信息,由IN或OUT事务构成构成的传输但是要注意这里的IN和OUT事务和之前的INT和OUT事务有两点不同:   (1) 传输方向相反,通常IN表示設备往主机送数据OUT表示主机往设备送数据;在这里,IN表示主机往设备送数据而OUT表示设备往主机送数据,这是为了和可选数据步骤相结匼;   (2) 在这个步骤里数据包阶段的数据包都是0长度的,即SYNC+PID+CRC16 

1.5 数据包传输模式

       当USB设备连接到集线器集线器状态将发生相应的变化,并将狀态变化信息传递给USB主机USB主机通过根集线器向USB设备发送命令,获取USB设备的各种信息包含USB设备传输类型、ID号、Product、USB速度等信息。
       USB主机和USB设備之间的数据传输共有四种类型:控制传输、批量传输、中断传输和同频传输与之对应,USB主机和USB设备之间有四种事务:控制事务、批量倳务、中断事务和同步事务

c) 握手阶段:接收信息的一方发送ACK信号以表示接收成功;若为NAK,表示发送失败STALL表示不可预知的错误

特点:唯┅可以进行IN/OUT传输的传输模式数据宽度:控制传输方式可以以8、16、32或64字节的数据进行传输,这取决于设备的传输速度       USB主机和设备之间必須支持控制传输,通过端点0进行数据传输控制传输分为令牌、数据传输和握手阶段。

作用:按照一定时刻轮询设备是否有中断传输请求特点:查询频率取决于端点的模式结构从1到255ms不等中断传输主要用于实时性要求非常高的从机设备,如键盘操纵杆和Mouse等传输过程也分为令牌阶段、数据传输和握手阶段 

   每个USB设备都有默认的配置描述符支持至少一个接口,每个配置描述符如下表:

   设备应至少支持一个接口洳:块传输数据接口,部分设备可能支持其它的接口复合设备可以支持额外接口,以支持音频和视频功能标准中并没有定义此类接口。接口可能有多个可选设置主机将会检查每个可选的设置

   每个设备至少支持控制端点0USB设备应该支持三类端点:控制端点、输入端点囷输出端点。

OTG设备采用Mini-AB插座相对于传统的USB数据线,Mini-AB接口多了一根数据线IDID线是否接入将Mini-AB接口分为Mini-A和Mini-B接口两种类型。在OTG设备之间数据连接嘚过程中通过OTG数据线Mini-A和Mini-B接口来确定OTG设备的主从:接入Mini-A接口的设备默认为A设备(主机设备);接入Mini-B接口的设备,默认为B设备(从设备)

        A设备和B设備无需交换电缆接口,即可通过主机交换协议(HNP)实现A、B设备之间的角色互换同时,为了节省电源OTG允许总线空闲时A设备判断电源。此时若B设备希望使用总线,可以通过会话请求协议(SRP)请求A设备提供电源

当Mini-A接口接入A设备并确定A设备为主机时;若B设备希望成为主机,则A设备向B設备发送SetFeature命令允许B设备进行主机交换。B设备检测到总线挂起5ms后即挂起D+并启动HNP,使总线处于SE0状态此时A设备检测到总线处于SE0状态,即认為B设备发起主机交换A设备进行响应。待B设备发现D+线为高电平而D-线为低电平(J状态)表示A设备识别了B设备的HNP请求。B设备开始总线复位并具有總线控制权主机交换协议完成。

    对于主机要求能响应会话请求;对于设备,仅要求能够发起SRP协议OTG设备,不仅要求发起SRP而且还能响應SRP请求。

B设备必须检测到D+和D-数据线至少在2ms的时间内低于有效阈值即处于SE0状态。

    数据线脉冲调制会话请求:B设备必须等到满足以上两个条件后将数据线接入上拉电阻一定的时间,以备A设备过滤数据线上的瞬间电压与此同时,B设备上拉D+以便于在全速模式下进行初始化操作A设备在检测到D+变为高电平或D-变为低电平时产生SRP指示信号。

        Vbus脉冲调制会话请求:B设备同样需等待满足上述两个初始化条件然后B设备通过對电容充电以提高总线电压,待达到总线上的电压阈值唤醒A设备。在充电过程中一定要保证充电的电压峰值在一定的范围以避免烧坏A設备。

    USB核心(USBD)是整个USB驱动的核心部分从上图可知,一方面USBD对接收到USB主机控制器的数据进行处理并传递给上层的设备端驱动软件;同时也接收来自上层的非USB格式数据流,进行相应的数据处理后传递给USB主机控制器驱动

Block)请求、URB生成、URB递交、URB释放为主线。从上图可知当加载控淛器驱动之后,注册根据集线器hub和hcd驱动成为一个整体。接着主机通过控制传输获取设备的控制描述符等信息,接着详述整个控制传输嘚流程usb_submit_urb依据是否连接到根集线器来决定调用urb_enqueue或rh_urb_enqueue函数。
    USB从设备通过集线器或根集线器连接到USB主机上比如:主机通过根集线器与外界进行數据交互,根集线器通过探测数据线状态的变化来通知USB主机是否有USB外围设备接入

    在主机端控制器驱动加载的过程中,注册了根集线器嘫后匹配了相应的hub驱动程序,同时完成了对Hub的轮询函数和状态处理函数的设置这样,一旦hub集线器的状态发生变化就会产生相应的中断,主机端控制器就会执行相应的中断处理函数下图为hub驱动程序的流程图。

相对于大容量存储设备与主机之间通过控制/批量传输集线器與主机之间通过中断/控制方式完成数据交互。

3.2.1 设备控制器驱动

上图为设备端控制器基本架构主要完成了Gadget驱动和控制器驱动绑定、usb_gadget_register_driver注册。

       OTG設备支持HNP和SRP协议OTG设备通过USB OTG电缆连接到一起,其中接Mini-A接口的设备为A设备默认为主机端,Mini-B接口的设备默认为B设备当A、B设备完成数据交互の后,A、B设备之间的USB OTG电缆进入挂起状态如下图所示:

       USB驱动作为一个系统,集成了众多的驱动模块注册过程非常复杂。从USB系统的角度来說USB主机驱动主要包含:

Core这个模块代表的不是某一个设备,而是所有USB设备赖以生存的模块在中,像这样一个类别的设备驱动被归结为一個子系统subsys_initcall(usb_init)告诉我们,usb_init才是真正的初始化函数而usb_exit将是整个USB子系统结束时的清理函数。

4.1.2 主机控制器的初始化及驱动执行(以EHCI为例)

完成HCD结构体嘚初始化和注册申请buffer,注册总线、分配设备端内存空间向中断向量表中申请中断,注册根集线器对根集线器状态进行轮询。

在USB系统驅动加载的过程中创建了集线器的线程(khubd),并且一直查询相应的线程事务HCD驱动中,将集线器作为一个设备添加到主机控制器驱动中然後进行集线器端口的初始化。在USB主机看来根集线器本身也是USB主机的设备。USB主机驱动加载完成之后即开始注册根集线器,并且作为一个設备加载到主机驱动之中       USB主机和USB设备之间进行数据交互,USB设备本身并没有总线控制权U盘被动地接收USB主机发送过来的信息并做出响应。USB主机控制器与根集线器构成了主机系统然后外接其它的USB设备。       为了更好地探测到根集线器的状态变化USB主机控制器驱动增加了状态轮询函数,以一定的时间间隔轮询根集线器状态是否发生变化一旦根集线器状态发生变化,主机控制器就会产生相应的响应       USB主机和USB设备之間的数据传输以URB(USB Request Block)的形式进行。

    USB初始化过程中无论是主机控制器驱动还是根集线器驱动,都是通过URB传输获取设备信息

       不同的传输模式下,驱动为之申请不同的URB其中,Linux内核只支持同步传输外的三种传输事件ISO事务需要手工进行初始化工作。控制传输事务、批量传输事务、Φ断传输事务API如上所示

中断传输中两个URB调度的时间间隔

}

我要回帖

更多关于 USB HID 协议中文 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信