USB协议(二)

内容原创,未经本人同意请勿转载。联系本人:jianshu_kevin@126.com

PIPE

usb通信的最基本形式是通过USB设备里的endpoint,而主机和endpoit之间的数据传输就是通过pipe

通信方式

USB的所有通信都是由host发起的,总线采用轮询方式和设备进行通信

endpoint

端点是有方向的,主机到从机成为out端点,从机到主机成为in端点。从这个说明看出端点是单方向的。(除了0端点)

管道通信方式

pipe中的数据通信方式有两种,一种是stream一种是messagemessage要求进出进出方向必须要求同一个管道,默认就使用ep0作为message管道

传输方式

USB endpiont有四种类型,分别对应了不同的数据传输方式,分别为control transfers控制传输interrupt transfers中断传输Bluk Data transfers批量传输Isochronous Data Tranfers等时传输
控制传输通常用于配置设备,获取设备信息,发送命令到设备

逻辑设备

逻辑设备就是一系列端点的组合,逻辑设备与主机之间的通信发生在一个主机的缓冲区和设备的一个端点之间。

---------------------------
            host
---------------------------
   | buf | buf  |   buf |
---------------------------
    []      []      []
    []      []      []
    []      []      []------->pipe
    []      []      []
    []      []      []
---------------------------
{ |ep| }  {| ep|    |ep| }-->interface
---------------------------
        logic device
---------------------------

interface

一个逻辑设备可能包含若干个接口,每个接口包含1个或多个端点。每个接口表示一种功能。内核里一个接口对应一个驱动程序。例如usb扬声器就包含一个键盘接口和一个音频流接口

gadget

class协议

USB协议中除了定义一些通用软硬件电气特性,还包含各种各样的class协议,用来为不同的功能定义各自的标准接口和具体总线上的数据交互内容和格式。例如u盘的Mass storage class、通用数据交换CDC class

为何USB都在PCI设备中

访问设备文件时经常看到usb在pci目录中,这是因为通常usb的root hub包含在了pci设备中。

usbfs

usbfs提供了用户空间可以访问usb硬件设备的接口

设备描述符、配置描述符、接口描述符、端点描述符

协议里规定一个usb设备必须支持这四大描述符。字符串描述符是可选的

/* host-side wrapper for one interface setting's parsed descriptors */
struct usb_host_interface {
    struct usb_interface_descriptor desc; //接口描述符

    int extralen;
    unsigned char *extra;   /* Extra descriptors */ //其他描述符

    /* array of desc.bNumEndpoint endpoints associated with this
     * interface setting.  these will be in no particular order.
     */
    struct usb_host_endpoint *endpoint; //端点描述符

    char *string;       /* iInterface string, if present */ //用来保存从设备上读取出来的字符串描述符
};
/* USB_DT_INTERFACE: Interface descriptor */
struct usb_interface_descriptor {
    __u8  bLength;   //==9
    __u8  bDescriptorType; //==4

    __u8  bInterfaceNumber;
    __u8  bAlternateSetting;
    __u8  bNumEndpoints;
    __u8  bInterfaceClass;
    __u8  bInterfaceSubClass;
    __u8  bInterfaceProtocol;
    __u8  iInterface; //对应字符串描述符的索引值
} __attribute__ ((packed));


bDescriptorType Value
DEVICE 1
CONFIGURATION 2
STRING 3
INTERFACE 4
ENDPOINT 5
DEVICE_QUALIFIER 6
OHTER_SPEED_CONFIGURATION 7
INTERFACE_POWER 8
struct usb_host_endpoint {
    struct usb_endpoint_descriptor      desc;
    struct usb_ss_ep_comp_descriptor    ss_ep_comp;
    struct list_head        urb_list;
    void                *hcpriv;
    /****************提供给sysfs用的
    wy@am:/proc$ ls /sys/bus/usb/devices/usb1/ep_00/
        bEndpointAddress  bInterval  bLength  bmAttributes  direction  interval  power  type  uevent  wMaxPacketSize
    
    
    上面这个文件就是通过usb_create_ep_files创建的
    */
    struct ep_device        *ep_dev;    /* For sysfs info */

    unsigned char *extra;   /* Extra descriptors */
    int extralen;
    int enabled;
};


/* USB_DT_ENDPOINT: Endpoint descriptor */
struct usb_endpoint_descriptor {
    __u8  bLength; //==7/9
    __u8  bDescriptorType; //==5

    __u8  bEndpointAddress; //bit7 表示方向,bit0-3表示端点号
    /*bit1-0 表示传输类型,
       00  控制
       01  iosh( 等时)
       10  批量
       11  中断
    */   
    __u8  bmAttributes; 
    //最大长度
    __le16 wMaxPacketSize;
    __u8  bInterval;
///////////////////////////下面这两个字段只在audio设备中有
    /* NOTE:  these two are _only_ in audio endpoints. */
    /* use USB_DT_ENDPOINT*_SIZE in bLength, not sizeof. */
    __u8  bRefresh;
    __u8  bSynchAddress;
} __attribute__ ((packed));
//配置描述符
struct usb_config_descriptor {
    __u8  bLength;
    __u8  bDescriptorType;

    __le16 wTotalLength;
    __u8  bNumInterfaces;
    __u8  bConfigurationValue; //表明了正在被使用的USB配置,虽然USB设备可能包含多个配置,但是同一时刻只能又一个配置生效
    __u8  iConfiguration; //配置描述符的字符串描述索引值
    __u8  bmAttributes;
    __u8  bMaxPower;
} __attribute__ ((packed));

设置

一个接口包含多个设置,每个设置对应不同的描述符

class

每个接口都包含一个class,class下面有分subclass。usb协议里为每一种class、subclass、protocol定义了一个数值。没一个接口或者设备都属于一个class。

设备class和接口class有何区别?

USB设备号

单纯的USB主设备号有两个USB_MAJOR,USB_DEVICE_MAJOR。其中USB_DEVICE_MAJOR是为usbfs而生的。USB_MAJOR才是真正的USB设备主设备号,但是一般的USB设备都是模拟成其他的设备,比如USB键盘、硬盘等。这类设备和其他子系统关联,那么设备号就不再使用USB_MARJOR设备号了,属于哪个子系统就使用该子系统的设备号。例如USB硬盘的主设备号是8。这里的USB设备准确的说应该是USB接口。

挂起状态

协议里规定所有的USB设备都需要支持挂起,已达到省电的目的,在设备指定时间内(3ms)没有数据传输,就进入挂起状态。当收到一个non-idle信号,就会被唤醒。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • 端点 端点是一个USB设备唯一可以确认的部分,他是主机和设备之间的通信流的重点。每一个USB逻辑设备都包含了一个相...
    Joe_HUST阅读 1,597评论 0 1
  • (转)USB入门系列之一----基本知识luckygirl 发表于 2009-7-11 23:43:00USB 基...
    spfanlost阅读 1,664评论 0 2
  • Linux usb system(descriptor) 为了更好地描述USB设备的特征,USB提出了设备架构的概...
    Creator_Ly阅读 1,212评论 0 4
  • USB是通用串行总线(Universal Serial Bus)的缩写。在USB1.0和USB1.1版本中,只支持...
    WilliamChou阅读 21,194评论 0 14