Chinaunix首页 | 论坛 | 博客
  • 博客访问: 127319
  • 博文数量: 17
  • 博客积分: 285
  • 博客等级: 二等列兵
  • 技术积分: 200
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-30 16:27
文章分类

全部博文(17)

文章存档

2016年(1)

2015年(2)

2014年(1)

2013年(2)

2012年(11)

我的朋友

分类: Android平台

2015-06-03 13:16:43

一、 usb 理论:
    1. usb host 最多支持128个地址,其中0地址是不能分配的,用于枚举。所以最多支持127个设备。其中usb host最多支持7层(包括root 和最底的device)。
    2. usb 采用令牌包,握手包,数据包的机制。
        令牌包:指定包的去向或者来源的设备地址和端点。
        数据包:包括sync,数据以及eop。其中数据部分是以8bit的pid开始的(pid指定包的类型共16种,令牌包就指
pid为in/out/setup的pid的包)
        握手包:表示成功与否。
    3. 端点:端点是usb设备中可以进行数据收发的最小单位,支持单向和双向数据传输,在usb低速设备中除默认端点最多再支持两组端点(2 in, 2 out),在高速设备中最多支持15组
    4. 管道:管道是host和device端点之间数据传输的模型,我认为就像水管一样。共有两种不同的管道:无格式的流管道和有格式的信息管道,是不是很像socket里面的报文一样呢。任何usb一旦上电就会有一个默认的管道信息管道, 即默认控制管道。用于host获取设备的描述,配置,状态等。但是我有点不明白这些信息是从哪儿来的???
    5. 四种传输协议:
        控制传输:顾名思义就是用于控制的,主要用与在连接时对设备进行枚举。
        中断传输:这个是不能顾名思义的,这个中断传输与传统意义上的中断是不一样的:这个还是由host发起,只是host会轮询查看是否有数据要发送。(小数据量,可靠,如键盘,游戏柄)
        批量传输:对延迟要求比较宽松,且可靠,如u盘;
        同步传输:这个对延迟宽松且对可靠性也比较宽松,如摄像头,usb音响。

二、通信
    usb 设备和host通信都是通过管道,而且所有的传输都是由host发起,在默认控制管道接受以下三种请求:
    1. 标准请求:一共11个请求:设备描述,设备地址,设备配置等。
    2. 类(class)请求:如hub类,大容量存储类
    3. 厂商请求:
三、usb规范
     1. usb采用little edian 字节序,先传输最低位。采用编码。
     2. 所以的usb数据都是以sync开始,高速包的sync为32bit,全速低速为8bit。

     3. usb数据包格式:
    
    
    a. pid包含了包的类型,包括令牌包,数据,握手包以及特殊包。
    b. 对于令牌包来说pid之后是7bit的地址和4bit的端点号。令牌包没有数据域,以5位crc校验和结束。sof是一种特殊的令牌包,pid后是11bit的帧编号。
    c. 数据包:在pid之后直接跟数据,数据域长度n字节(N < 1024),后面接16bit的校验和
    d. 握手包:只有pid域(包括ack,nak,stall, nyet) stall:错误或者端点属性设置成了stall; nyet:未准备好。
    e. 分离传输:

    4. 事务传输
    a. 批量传输:顾名思义就是一次由多次批量事务传输组成。按我的理解应该不是一次传输多个包,而是事务,比如host需要数据in和out,此为同时传输in和out事务。
    b. 控制传输:一次控制传输分为三个或者两个阶段:建立setup, 数据data(可能没有)、状态status
    c. 中断传输:与批量传输类似,但是端点号,优先级不同,而且没有ping功能
    d. 同步传输: 同步传输没有可靠性,所以不支持pid翻转以及ack


    未完待续。











            
阅读(1766) | 评论(0) | 转发(0) |
0

上一篇:recovery

下一篇:spin lock

给主人留下些什么吧!~~