usb设备驱动

  本章主要内容包含以下:USB总线介绍,USB协议分析,USB系统架构

一、USB总线介绍

1.1USB发展史

USB(Universal Serial Bus)通用串行总线,是一种外部总线标准用于规范电脑与外部设备的连接和通讯。USB是在1994年底由英特尔、康柏、IBM、Microsoft等多家公司联合提出的,自1996年推出后已成功替代串口和并口,成为当今个人电脑和大量智能设备的必配接口之一。

  1. USB 1.0出现在1996年的,速度只有1.5Mb/s1998年升级为USB 1.1,速度也提升到12Mb/s,称之为”full speed”
  2. USB2.0规范是由USB1.1规范演变而来的。它的传输速率480Mbps ”high speed”达到了480Mbps称之为”high speed”
  3. USB3.0提供了十倍于USB 2.0的传输速度和更高的节能效率,被称为”super speed”

二、USB硬件接口

2.1USB硬件接口主要包括:标准A口,标准B口,mini-usb口,micro-usb口

     

                        

2.2USB信号线

  USB接口有4根线,两根电源线,两根信号线。USB接口的输出电压和电流是:+5V 500mA

  USB电源:标有VCC,power,5v,5vSB字样。

  USB数据线:(正)DATA+,USBD+,PD-,USBDT+等字样。

  USB数据线:(负)DATA-,USB-,PD-,USBDT-等字样。

  地线:GND,ground

2.3USB拓扑结构

2.3.1系统拓扑结构

         

  对于每个USB系统来说,都有一个称为主机控制器的设备,该控制器和一个根Hub作为一个整体。这个根Hub下可以接多级的Hub,每个子Hub又可以接子Hub。每个USB设备作为一个节点接在不同级别的Hub上。 每条USB总线上最多可以接127个设备。

2.3.2USB主控制器规格

  OHCI:主要是非PC系统上的USB芯片

  UHCI:大多是Intel和Via主板上的USB控制器芯片。他们都是由USB1.1规格的。

  器芯片。他们都是由USB1.1规格的。

  EHCI是有Intel等几个厂商研发,兼容OHCI UHCI ,遵循USB2.0规范。

三、USB协议分析

  在USB设备的逻辑组织中,包含设备、配置、接口和端点4个层次。设备通常有一个或多个配置,配置通常有一个或多个接口,接口有零或多个端点。

3.1设备逻辑结构

  每个USB设备都可以包含一个或多个配置,不同的配置使设备表现出不同的功能组合,配置由多个接口组成。在USB议中,接口代表一个基本的功能,一个功能复杂的USB设备可以具有多个接口,而接口是端点的汇集

  一个USB播放器带有音频,视频功能,还有旋钮和按钮。
  配置1: 音频(接口)+旋钮(接口)
  配置2: 视频(接口)+旋钮(接口)
  频接口,视频接口,按钮接口,旋钮接口均需要一个驱动程序。

  USB设备中的唯一可寻址的部分是设备端点,端点的作用类似于寄存器。每个端点在设备内部有唯一的端点号,这个端点是在设备设计时给定的。主机和设备的通信最终都作用于设备上的各个端点。每个端点所支持的操作都是单向的,要么只读,要么只写。

3.1.1USB设备描述符

  当我们把USB设备如:USB鼠标)插到我们的PC时,主机能够自动识别出我们的USB设备类型。

在每一个USB设备内部,包含了固定格式的数据,通过这些数据,USB主机就可以获取USB设备的类型、生产厂商等信息。这些固定格式的数据,我们就称之为USB描述符。标准的USB设备有5种USB描述符:设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符。

  一个USB设备只有一个设备描述符,设备描述符长度为18个字节,这也是由USB协议所决定的。

  linux内核使用struct usb_device_descriptor来对应usb描述符中的设备描述符

struct usb_device_descriptor {
    __u8  bLength;描述符长度,固定为0x12
    __u8  bDescriptorType;设备描述符类型,固定为0x01
    __le16 bcdUSB;规范发布号。表示本设备能适用哪种协议,如2.0=0200
    __u8  bDeviceClass;类型代码
    __u8  bDeviceSubClass;子类型代码
    __u8  bDeviceProtocol;协议代码
    __u8  bMaxPacketSize0;端点0最大分组大小
    __le16 idVendor;供应商ID
    __le16 idProduct;产品ID,由厂家自行设置
    __le16 bcdDevice;设备出厂编码,由厂家自行设置
    __u8  iManufacturer;厂商描述符字符串索引,索引到对应的字符串描述符。为0表示没有。
    __u8  iProduct;产品描述符字符串索引
    __u8  iSerialNumber;设备序列号字符串索引
    __u8  bNumConfigurations;可能的配置数。
} __attribute__ ((packed));     按字节对齐

3.1.2配置描述符

bLength : 描述符长度,固定为0x09。

bDescriptorType : 配置描述符类型,固定为0x02。

wTotalLength : 返回整个数据的长度,指此配置返回的配置描述符,接口描述符以及端点描述符的全部大小。

bConfigurationValue : 作为SetConfiguration的一个参数选择配置值。

bNumInterfaces : 配置所支持的接口数,指该配置配备的接口数量,也表示该配置下接口描述符数量。

iConfiguration : 用于描述该配置字符串描述符的索引。

bmAttributes : 供电模式选择。Bit4-0保留,D7:总线供电,D6:自供电,D5:远程唤醒.

MaxPower : 总线供电的USB设备的最大消耗电流,以2mA为单位。

linux内核使用struct usb_config_descriptor来对应usb描述符中的配置描述符---->当然这也是有USB协议决定的。

struct usb_config_descriptor {
    __u8  bLength;
    __u8  bDescriptorType;
    __le16 wTotalLength;
    __u8  bNumInterfaces;
    __u8  bConfigurationValue;
    __u8  iConfiguration;
    __u8  bmAttributes;
    __u8  bMaxPower;
} __attribute__ ((packed));

3.1.3接口描述符

USB接口描述符长度为8个字节

bLength : 描述符长度,固定为0x09。

bDescriptorType : 接口描述符类型,固定为0x04。

bInterfaceNumber: 该接口的编号。

bAlternateSetting: 用于为上一个字段选择可供替换的设置。

bNumEndpoint : 使用的端点数目,端点0除外。

bInterfaceClass : 类型代码(由USB组织分配)。

bInterfaceSunClass : 子类型代码(由USB组织分配)。

bInterfaceProtocol : 议代码(由USB组织分配)。

iInterface : 字符串描述符的索引。

struct usb_interface_descriptor {
    __u8  bLength;
    __u8  bDescriptorType;
    __u8  bInterfaceNumber;
    __u8  bAlternateSetting;
    __u8  bNumEndpoints;接口包含的端点个数,不包含0号端点,它是控制端点。
    __u8  bInterfaceClass;
    __u8  bInterfaceSubClass;
    __u8  bInterfaceProtocol;
    __u8  iInterface;
} __attribute__ ((packed));

3.1.4端点描述符

USB端点描述符长度为7个字节。

  bLength : 描述符大小,固定为0x07。

  bDescriptorType : 接口描述符类型,固定为0x05。

  bEndpointType : USB设备的端点地址。Bit7,方向,对于控制端点可以忽略,1/0:IN/OUT。Bit6-4,保留。BIt3-0:端点号

  bmAttributes : 端点属性,Bit7-2,保留。BIt1-0:00控制,01同步,02批量,03中断。

  wMaxPacketSize : 本端点接收或发送的最大信息包大小。

  bInterval : 轮训数据传送端点的时间间隔.对于批量传送和控制传送的端点忽略.对于同步传送的端点,必须为1,对于中断传送的端点,范围为1-255。

struct usb_endpoint_descriptor

{
    __u8  bLength;
    __u8  bDescriptorType;
    __u8  bEndpointAddress;
    __u8  bmAttributes;
    __le16 wMaxPacketSize;
    __u8  bInterval;
    /* NOTE:  these two are _only_ in audio endpoints. */
    /* use USB_DT_ENDPOINT*_SIZE in bLength, not sizeof. */
    __u8  bRefresh;
    __u8  bSynchAddress;
} __attribute__ ((packed));

3.2USB数据通讯

  这里主要包含:通讯模型,传输,事物,包,域的内容。

  USB的数据通讯首先是基于传输(Transfer)的,传输的类型有:中传输、批量传输、同步传输、控制传输

3.2.1数据通讯-传输

3.2.2数据通讯-事务

  一次传输由一个或多个事务(transaction)构成,事务可分为:In事务,Out事务,Setup事务

3.2.3数据通讯-包

一个事务由一个或多个包(packet)构成,包可分为:令牌包(setup)、数据包(data)、握手包(ACK)和特殊包

3.2.4数据通讯-域

  一个包由多个域构成,域可分为:同步域(SYNC),标识域(PID),地址域(ADDR),端点域(ENDP),帧号域(FRAM),数据域(DATA),校验域(CRC)。

3.3USB设备枚举

  USB设备在正常工作以前, 第一件要做的事就是枚举。枚举是让主机认得这个USB设备, 并且为该设备准备资源,建立好主机和设备之间的数据传递通道。

  1. 获取设备描述符

  2. 复位

  3. 设置地址

  4. 再次获取设备描述符

  5. 获取配置描述符

  6. 获取接口、端点描述符

  7. 获取字符串描述符

  8. 选择设备配置

usb设备驱动描述,王明学learn的更多相关文章

  1. linux设备驱动概述,王明学learn

    linux设备驱动学习-1 本章节主要学习有操作系统的设备驱动和无操作系统设备驱动的区别,以及对操作系统和设备驱动关系的认识. 一.设备驱动的作用 对设备驱动最通俗的解释就是“驱使硬件设备行动” .设 ...

  2. USB设备驱动

    在Linux 内核中,使用usb_driver 结构体描述一个USB 设备驱动,usb_driver 结构体的定义如代码清单20.11 所示.代码清单20.11 usb_driver 结构体 stru ...

  3. USB设备驱动概述

    USB设备驱动 ·  )USB Hub:每个USBHost控制器都会自带一个USB Hub,被称为根(Root)Hub.这个根Hub可以接子(Sub)Hub,每个Hub上挂载USB设备.一般PC有8个 ...

  4. Linux下 USB设备驱动分析(原创)

    之前做过STM32的usb HID复合设备,闲来看看linux下USB设备驱动是怎么一回事, 参考资料基于韦东山JZ2440开发板,以下,有错误欢迎指出. 1.准备知识 1.1USB相关概念: USB ...

  5. Linux下usb设备驱动详解

    USB驱动分为两块,一块是USB的bus驱动,这个东西,Linux内核已经做好了,我们可以不管,我们只需要了解它的功能.形象的说,USB的bus驱动相当于铺出一条路来,让所有的信息都可以通过这条USB ...

  6. Linux USB驱动学习总结(二)---- USB设备驱动

    USB 设备驱动: 一.USB 描述符:(存在于USB 的E2PROM里面) 1.  设备描述符:struct usb_device_descriptor 2.  配置描述符:struct usb_c ...

  7. 嵌入式Linux驱动学习之路(二十)USB设备驱动

    USB在接入系统的时候,以0的设备ID和主机通信,然后由主机为其分配新的ID. 在主机端,D+和D-都是下拉接地的.而设备端的D-接上拉时,表明此设备为高速设备:12M/s. D+接上拉时则是全速设备 ...

  8. Linux usb子系统(二):USB设备驱动usb-skeleton.c

    usb驱动分为通过usbfs操作设备的用户空间驱动,内核空间的内核驱动.两者不能同时进行,否则容易引发对共享资源访问的问题,死锁!使用了内核驱动,就不能在usbfs里驱动该设备. 下面转载的一篇分析u ...

  9. USB系列之二:读取USB设备的描述符

    在前面的文章中,我们已经给出了USB协议的链接地址,从这篇文章起,我们会涉及到许多USB 1.1的内容,我们的指导思想是先从熟悉USB 1.1协议入手,先使用现成的HCD和USBD,直接面对客户端驱动 ...

随机推荐

  1. 使用Java数组实现双色球选号

    package com.hm.test; import java.util.Random; /** * 模拟双色球生成 * *1.从1到16中产生一个篮球的随机数 *2.从1到33中产生出6个红色的球 ...

  2. redis pub/sub 实战: 微信语音识别

    2015年5月22日 20:20:20 星期五 效果: 这边对微信说话,  浏览器端及时显示语音识别的文字 注意: 在连接socket.io时, 按下浏览器f12, 如果一直有请求不断的刷, 说明so ...

  3. 1.SpringMVC的简介和环境搭建

    SpringMVC的简介: SpringMVC 和 Struts一样是一个MVC框架,和Spring无缝连接,和struts2类似, Spring MVC属于SpringFrameWork的后续产品, ...

  4. Python 开发轻量级爬虫02

    Python 开发轻量级爬虫 (imooc总结02--爬虫简介) 爬虫简介 首先爬虫是什么?它是一段自动抓取互联网信息的程序. 什么意思呢? 互联网由各种各样的的网页组成,每一个网页都有对应的url, ...

  5. (译)利用ASP.NET加密和解密Web.config中连接字符串

    介绍 这篇文章我将介绍如何利用ASP.NET来加密和解密Web.config中连接字符串 背景描述 在以前的博客中,我写了许多关于介绍 Asp.net, Gridview, SQL Server, A ...

  6. 常用js学习

    http://www.cnblogs.com/qiantuwuliang/tag/js/

  7. 【leetcode】Convert Sorted List to Binary Search Tree (middle)

    Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...

  8. 【leetcode】Search in Rotated Sorted Array II(middle)☆

    Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed? Would this ...

  9. 【编程之美】2.5 寻找最大的k个数

    有若干个互不相等的无序的数,怎么选出其中最大的k个数. 我自己的方案:因为学过找第k大数的O(N)算法,所以第一反应就是找第K大的数.然后把所有大于等于第k大的数取出来. 写这个知道算法的代码都花了2 ...

  10. win7下安装openpyxl

    想使用python来操作Excel,看资料据说openpyxl非常好用,于是到https://pypi.python.org/pypi/openpyxl下载了安装包.下面就来说说安装步骤,也算是对自己 ...