linux系统usb协议分析,Linux USB驱动分析(一)----USB2.0协议分析

本文介绍了Linux环境下USB2.0协议的基础知识,包括USB硬件结构、USB HUB的功能以及USB数据传输的方法。USB硬件由电源线、地线、D+和D-四条线构成,支持高速、全速和低速设备连接。USB数据传输通过端点进行,每个端点有独立地址和传输特性。USB数据格式由同步域、标识域等组成,通过不归零取反编码确保传输准确性。此外,文章还提到了USB的数据传输方法,包括位插入操作和数据包结构。
摘要由CSDN通过智能技术生成

Linux USB驱动分析(一)----USB2.0协议分析

一、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前导,用于启动下行端口的低速设备的数据传输。

来源: http://lib.csdn.net/article/linux/37796

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值