随笔
时间:2010-03-31 来源:donotgiveup
学习USB已经几次了,每次都半途而废。原因分析:
1 概念学习不扎实
http://wenku.baidu.com/view/b7174628915f804d2b16c1d0.html介绍了usb的常用的概念
2 没有自己去动手
应该选择一个容易模拟的环境,例如2440开发板上,你实现Linux下从设备。
或者在2440开发板上,使用ucos,实现从设备的功能。
关键:找到一个可用的例子。
如果有一个入门的例子,就好了。
网上搜索了一下,有很多2410的例子。
OHCI(open host controller interface)
在这个网址有《Linux设备驱动开发乡街》的电子版(http://book.51cto.com/art/200803/66929.htm)
USB数据格式
域(七种)=>包=>事务(IN,OUT,SETUP)=>传输(控制、中断、批量、并行/分时)
==域==
1 同步域(SYNC) 0000 0001 用于本地时钟与输入同步
2 标志域(PID) 4位标识符和4位标识符反码构成,表明包的类型和格式,可见有16种包
3 地址域(ADDR) 七位地址,代表了设备在主机上的地址,0000 0000是零地址,是任何设备被主机配置,
枚举之前的默认地址,由此可知usb只能连接127个设备
4 端点域(ENDP) 4位,由此可知一个USB设备的端点最大为16个
5 帧号域(FRAM) 11位,2^11为2K,共0x800,。对于同步传输很重要。
6 数据域(DATA) 长度为0~1023字节
7 校验域(CRC) 对令牌包和数据包中非PID域进行校验的一种方法
==包==
令牌包
输入包|输出包|设置包
SYNC+PID+ADDR+ENP+CRC5
帧起始包
SYNC+PID+FRAM+CRC5
数据包
DATA0和DATA1包,两个包是交替的。同步传输除外,在同步传输中,所有的数据包都是DATA0包。
SYNC+PID+CRC16
握手包
SYNC+PID
==事务==
每一个事务都是由令牌包,数据包,握手包3个阶段组成。
令牌包:启动一个输入,输出或设置的事务
数据包:按输入,输出发送相应的数据
握手包:返回数据接收情况。在同步传输的IN和OUT事务中没有这个阶段。这是比较特殊的。
IN事务
令牌包阶段:
主机发送一个PID为IN的输入包给设备,通知设备要往主机发送数据。
数据包阶段:
设备会根据情况作出3种反应
1)设备端点正常,设备向主机发送数据包(DATA0和DATA1交替)
2)设备正在忙,无法向主机发送数据包,就发送NAK无效包。
IN事务提前结束,到下一个IN事务才继续。
3)相应设备端点被禁止,发送错误包STALL包,事务也就提前结束了,总线进入空闲状态。
握手包阶段:
主机正确接收到数据包之后就会像设备就会向ACK数据包。
OUT事务
令牌包阶段:
主机发送一个PID为OUT的输出包给设备,通知设备准备接收数据。
数据包阶段:
比较简单,就是主机向设备发送数据,DATA0和DATA1交替。
握手包阶段:
设备会根据情况作出3种反应
1)设备端点接收正确,设备向主机发送ACK,通知主机可以发送新的数据。
如果发生了CRC校验错误,就不会返回任何握手包。
2)设备正在忙,无法往主机发送数据,就发送NAK数据包,通知主机再次发送数据。
3)相应设备端点被禁止,发送错误包STALL,事务提前结束,总线直接进入空闲状态。
SETUP事务
令牌包阶段:
主机发送一个PID为SETUP的输出包给设备,通知设备准备接收数据。
数据包阶段:
比较简单,就是主机向设备发送数据,注意,这里只有一个固定为8个字节的DATA0包,这8个字节
就是标准的USB设备请求命令(共有11条)。
握手包阶段:
设备接收到主机的命令信息后,返回ACK,此后总线进入空闲状态,并准备下一个传输。
(在SETUP事务之后通常是一个IN或OUT事务构成的传输)
==传输==
传输有IN,OUT,SETUP这三种事务组成,共有4种类型。
中断传输 批量传输 同步传输 控制传输
中断传输和批量传输的结构一样,同步传输有罪简单的结构,而控制传输是最重要的也是最复杂的传输
1 中断传输
由IN事务和OUT事务构成,用于键盘,鼠标等HID设备的数据传输中。
2 批量传输
由IN事务和OUT事务构成,用于大容量数据传输,没有固定的传输速率,也不占用带宽-当总线忙时,USB会优先进行其它类型的数据传输,而暂时停止批量传输。
3 同步传输
由OUT事务和IN事务构成,有两个特殊的地方,第一,在同步传输的IN和OUT事务中是没有握手包阶段的。第二,在数据包阶段所有的数据包都为DATA0
4 控制传输
最重要也是最复杂的传输。
控制传输由3个阶段构成(初始设置阶段,可选数据阶段,状态信息步骤),每一个阶段
看成一个传输,也就是说控制传输其实是由3个传输组成的。
USB设备初次接到主机之后,主机通过控制传输来交换信息,设备地址和读取设备的描述符,使得主机识别设备,并安装相应的驱动程序,这是每一个USB开发者都关心的问题。
1 初始设置步骤:就是一个有SETUP事务构成的传输
2 可选数据步骤:就是一个由IN或OUT事务构成的传输,这个步骤是可选的,要看初始设置步骤有没有要求读/写数据(由SETUP事务数据包阶段发送的标准请求命令决定)
3 状态信息步骤:顾名思义,这个步骤就是要获取状态信息,由IN或OUT事务构成的传输,但是要注意这里的IN和OUT事务和之前有两点不同:
1)传输方向相反,通常IN表示设备往主机发送数据,OUT表示主机向设备发送数据,在这里,恰恰相反。
2)在这个步骤里,数据包阶段的数据包都是0长度的,及SYNC+PID+CRC16。
(思考:这些传输模式在实际操作中应如何通过什么方式去设置?)
相关阅读 更多 +