USB 设备

interface描述符,就是设置描述符,这个描述符的其中一项叫做bInterfaceNumber,指的就是这个设置是属于哪 个接口。比如一个接口包含2个设置,那么就会有2个interface描述符,两个描述符里的bInterfaceNumber设置都为0,但是第一个设 置的bAlternateSetting为0, 第二个设置的bAlternateSetting为1。这样就区分开来了。
 
假如一共有5个设置,2个接口。这5个设置,2个属于接口1, 3个属于接口2.
则就会有2个struct usb_interface,第一个usb_interface里的altsetting有2个,第二个有3个。
协议里规定,接口的默认设置总是0号设置。
 
endpoint描述符,它是属于设置的,每个设置都会有endpoint描述符,也就是每个接口的设置都表示一种功能,既然是实现了功 能,那就必须通过endpoint来传输数据,那到底是用到了几个endpoint呢?每个endpoint的属性是?所以每个接口的设置里就会有 endpoint的描述符。
 
endpoint有个特性,要么只能input,要么只能output,但是也有一个特殊的endpoint,就是endpoint 0,每个USB设备都有这么一个endpoint0,除此endpoint,其他都只能单工的。而且每个endpoint每次传输的大小也不一样,所以就 有了这么个endpoint描述符来对其进行描述。
 

端点:

端点位于USB 外设内部,所有通信数据的来源或目的都基于这些端点,是一个可寻址的FIFO。

每个USB 外设有一个唯一的地址,可能包含最多十六个端点。主机通过发出器件地址和每次数据传输的端点号,向一个具体端点(FIFO)发送数据。

每个端点的地址为0 到15,一个端点地址对应一个方向。所以,端点2-IN 与端点2-OUT 完全不同。 每个器件有一个默认的双向控制端点0,因此不存在端点0-IN 和端点0-OUT。


在一个USB设备中会有很多endpoint,最多有16个。而我用的S5PV210处理器中有 16个,分别为EP0 – EP15。一个EP本质上讲是FIFO,也就是一段缓冲区,我们可以这样理解一个USB OTG设备就是有很多个缓冲区的集合。

虽然有16个端点,但是我们通常只会用到3个。比较常用的做法是EP0用做传输配置和控制信息,EP1做IN_EP,EP2做OUT_EP。

IN_EP的作用是用于把数据从Host传到Device中。而OUT_EP的作用是用于把数据从Device传送到Host中。即他们分别用做发送和接收。


USB四种传输模式

控制传输、批量传输、中断传输、同步传输

USB 有上述四种传输类型。枚举期间外设告诉主机每个端点支持哪种传输类型。

USB设备驱动向USB控制器驱动请求的每次传输被称为一个事务(Transaction),

事务有四种类型:Bulk Transaction、Control Transaction、Interrupt Transaction和Isochronous Transaction

数据包包含部分:

每次事务都会分解成若干个数据包在USB总线上传输。每次传输必须历经两个或三个部分,第一部分——USB控制器向USB设备发出命令,

第二部分——USB控制器和USB设备之间传递读写请求,其方向主要看第一部分的命令是读还是写,第二部分有时候可以没有。

第三部分——握手信号。

批量(Bulk)传输事务

作用:主要应用在数据大量数据传输和接受数据上同时又没有带宽和间隔时间要求的情况下;

特点:要求保证传输。打印机和扫描仪属于这种类型这种类型的设备

适合于传输非常慢和大量被延迟的传输,可以等到所有其它类型的数据的传输完成之后再传输和接收数据。

批量数据传输分三个阶段:

第一部分——令牌阶段。

Host端发出一个Bulk的令牌请求。

如果令牌是IN请求 ,则是从Device到Host的请求;

如果令牌是OUT请求,则是从Host到Device端的请求。

第二部分——传送数据的阶段。

根据先前请求的令牌的类型,数据传输有可能是IN方向,也有可能是OUT方向。传输数据的时候用DATA0和DATA1令牌携带着数据交替传送。

数据传输格式DATA1和DATA0,这两个是重复数据,确保在1数据丢失时0可以补上,不至于数据丢失。

第三部分——握手阶段。

如果数据是IN 方向,握手信号应该是Host端发出;

如果数据是OUT方向,握手信号应该是Device端发出。

握手信号可以为ACK, 表示正常响应,

NAK, 表示没有正确传送。

STALL,表示出现主机不可预知的错误。


控制(Control)传输

作用:USB系统软件用来主要进行查询配置和给USB设备发送通用的命令;

特点:控制传输是双向传输,数据量通常较小;数据传送是无损性的。

数据宽度:控制传输方式可以包括8、16、32和64字节的数据,这依赖于设备和传输速度。

控制传输典型地用在主计算机和USB外设之间的端点0(EP0)之间的传输

控制传输也分为三个阶段,即令牌阶段、数据传送阶段、握手阶段

中断(Interrupt)传输事务

作用:主要用于定时查询设备是否有中断数据要传输;

特点:设备的端点模式器的结构决定了它的查询频率从1到255ms之间。

典型的应用在少量的分散的不可预测数据的传输键盘操纵杆和鼠标就属于这一类型

(数据量很小)

中断方式传输是单向的并且对于host 来说只有输入(IN)的方式

在中断事务中,也分为三个阶段,即令牌阶段、数据传输阶段、握手阶段

同步(Isochronous)传输事务

作用:用于时间严格并具有较强容错性的流数据传输,或者用于要求恒定的数据传输率的即时应用中。例如执行即时通话的网络电话。

特点:保证传输的同步性。保证每秒有固定的传输量。

(与Bulk传输不同)同步传输允许有一定的误码率。(这样符合视频会议等传输的需求,因为视频会议首先要保证实时性,在一定条件下,允许有一定的误码率。)

同步传输事务有只有两个阶段,即令牌阶段、数据阶段,因为不关心数据的正确性,故没有握手阶段,

 

  • 查看USB设备汇总信息

[root@zcwyou ~]# lsusb

linux安装lsusb

 

  • 查看USB详细信息

[root@zcwyou ~]# lsusb -v

linux安装lsusb

  • 树状输出信息

[root@zcwyou ~]# lsusb -t

linux安装lsusb

列出指定设备信息

 root@Widora32:~#  lsusb -D /dev/bus/usb/001/003
Device: ID 05a3:9310 ARC International  
 Device Descriptor:
   bLength                18
   bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass          239 Miscellaneous Device
  bDeviceSubClass         2 ?
  bDeviceProtocol         1 Interface Association
  bMaxPacketSize0        64
  idVendor           0x05a3 ARC International   
  idProduct          0x9310
  bcdDevice            0.00
  iManufacturer           2 HD Camera Manufacturer
  iProduct                1 USB 2.0 Camera
  iSerial                 0
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength          963
   ...

 

在设备开发中,常用到基于USB的虚拟串口,此类接口在linux平台上被枚举为ttyUSB设备。

当有多个ttyUSB设备时,常常导致分不清是哪个功能接口。

  其实还是可以很容易分出来的,在sysfs中通过以下步骤查看可以轻而易举的搞得一清二楚。

  查看sys目录,会看到bus子目录

/#: ls /sys
block     class     devices   firmware  kernel    pmu       zte
bus       dev       dwc_usb   fs        module    power
1.
2.
3.
  查看bus子目录,会有USB子目录

/#: ls /sys/bus
clocksource  i2c          rpmsg_zx29   serio        usb
cpu          platform     scsi         spi          usb-serial
1.
2.
3.
  查看USB子目录,会有devices和drivers子目录

/ # ls sys/bus/usb
devices            drivers_autoprobe  uevent
drivers            drivers_probe
1.
2.
3.
  在devices目录下,即是所有的USB设备

/ # ls sys/bus/usb/devices
1-0:1.0  1-1      1-1:1.0  1-1:1.1  1-1:1.2  1-1:1.3  1-1:1.4  1-1:1.6  usb1
1.
2.
  任选一个查看,比如选择1-1:1.2,可以看到该设备的诸多属性

/ # ls sys/bus/usb/devices/1-1:1.2
bAlternateSetting     driver                subsystem
bInterfaceClass       ep_03                 supports_autosuspend
bInterfaceNumber      ep_83                 ttyUSB0
bInterfaceProtocol    interface             uevent
bInterfaceSubClass    modalias
bNumEndpoints         power
1.
2.
3.
4.
5.
6.
7.
  同时可以看到,它所对应的ttyUSB设备是ttyUSB0,但是这个是哪个接口,是什么功能呢?

其实1-1:1.2这个名字已经表明了是接口2,但是对于普通人来说很难去记,还是进一步查看确认一下才好。查看接口号:

 bInterfaceNumber代表接口号,可以看到是02

/ # cat sys/bus/usb/devices/1-1:1.2/bInterfaceNumber
02
1.
2.
查看对应的功能接口描述,interface代表功能接口描述,可以看到是USB-AT,表明是AT口

/ # cat sys/bus/usb/devices/1-1:1.2/interface
USB-AT
1.
2.
由此可知,ttyUSB0对应的是AT口。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章