linux usb 概述-硬件-原理-架构-驱动

时间:2024-05-21 22:21:21

                                                                              人生何其短,愿我们都能少走弯路。


1、USB基础知识

USB(Universal Serial Bus)全称通用串行总线,是一种支持热插拔的高速串行传输总线,使用差分信号来传输数据。由于USB是主从模式的结构,设备与设备之间、主机与主机之间不能互连,为解决这个问题,扩大USB的应用范围,出现了USB OTG(ON The Go)。

USB协议版本有USB1.0、USB1.1、USB2.0、USB3.1等


USB官网:

https://www.usb.org/documents?search=video&type%5B%5D=55&items_per_page=50

1.1、物理属性

1.1.1、物理接口

可以,图片几乎都上传失败了,emmm.

 

1.1.2、引脚定义

USB1.0&USB2.0:

 

USB3.0:

 

1.2、传输速度

USB1.0低速模式:1 .5Mb/s

USB1.1全速模式:12Mb/s

USB2.0 高速模式:480Mb/s 500mA

USB3.0 超高速模式: 5.0Gb/s 实际3.2Gb/s 900mA

 

1.3、连接模型

linux usb 概述-硬件-原理-架构-驱动

1.4、传输方式

USB,有四种的传输方式,控制(Control),同步(isochronous),中断(interrupt),大量(bulk)。

1.4.1、事务

在介绍USB传输类型之前,介绍一下USB事务。

事务一般由令牌包、数据包(可选)、握手包组成。

  • Token(令牌包):用来启动一个事务,总是由主机发送。

  • Data(数据包):可以从主机到设备,也可以由设备到主机,方向由令牌包决定。

  • Handshake(握手包):通常情况,数据的接收者发送握手包(ACK或者NAK)。

USB2.0 中除同步传输方式以外都是 Token + Data + Handshake 的方式,其中Data 是可选的。

1.4.2、控制传输

控制传输是双向传输,负责向USB设置一些控制信息,传送这种事务的管道是控制管道。控制传输分为三个过程:建立过程、数据过程(可选)、状态过程。

建立过程:

linux usb 概述-硬件-原理-架构-驱动

 

1.4.3、同步(isochronous)方式传输

同步传输提供了确定的带宽和间隔时间(latency),它被用于时间严格并具有较强容错性的流数据传输,或者用于要求恒定的数据传输率的即时应用中。

 

1.4.4、中断(interrupt)方式传输

中断方式传输主要用于定时查询设备是否有中断数据要传输设备的端点模式器的结构决定了它的查询频率,从1到255ms之间。主要用在数据量小,但对时间要求严格的场合。如人机接口设备(HID)中的鼠标、键盘、轨迹球等。

1.4.5、大量(bulk)传输

主要应用在数据大量传输传输和接受数据上,同时又没有带宽和间隔时间要求的情况下,要求保证传输。主要用在数据量大、对数据实时性要求不高的场合,例如USB打印机、扫描仪、大容量存储设备等等。

1.5、端点

USB 通讯的最基本形式是通过一个称为端点的东西。一个USB端点只能向一个方向传输数据(从主机到设备(称为输出端点)或者从设备到主机(称为输入端点))。端点可被看作一个单向的管道。

在USB设备组织结构中,从上到下分为设备(device)、配置(config)、接口(interface)和端点(endpoint)四个层次。USB设备程序绑定到接口上。 对于这四个层次的简单描述如下: 设备通常具有一个或多个的配置 配置经常具有一个或多个的接口 接口没有或具有一个以上的端点

 

  • 一个具体的端点只能工作在一种传输模式下。通常我们把工作在什么模式下的端点,叫做什么端点。如控制端点、批量端点、同步端点、中断端点。

  • 端点0是设备的默认控制端点,在设备上电后就存在并可以使用,在Set Config之前所有的传输都是通过端点0传输的。

  • 端点描述符中规定了端点所能支持的最大包长。

    • 控制传输:高速模式的最大包长固定为64个字节;全速模式可在8、16、32、64字节中选择;低速模式的最大包长固定为8个字节。

    • 批量传输:高速模式固定为512个字节;全速模式最大包长可在8、16、32、64字节中选择;低速模式不支持批量传输。

    • 同步传输:高速模式的最大包长上限为1024个字节;全速模式的最大包长上限为1023个字节;低速模式不支持同步传输。

    • 中断传输:告诉模式的最大包长上限为1024个字节;全速模式最大包长上限为64个字节;低速模式最大最大包长上限为8个字节。

2、USB 驱动

2.1、概述

USB分主从系统,由某引脚的电平决定。为了方便开发,USB定义了一套标准,只要USB设备支持相应的协议就可以直接使用。

USB相关的驱动代码位于内核代码中的:

kernel/msm-4.14/drivers/usb

2.1.1、USB软件架构

 

linux usb 概述-硬件-原理-架构-驱动

USB class driver : 负责USB从设备与主设备之间的通信。

USB core : 实现硬件无关,负责USB协议的处理、USB类驱动程序的交互。

HCD:Host controller driver,负责管理I / O请求和关联的设备资源、管理低级事务,例如URB

DCD: 执行端点操作,例如启用,禁用,入队,出队,刷新,暂停等 执行USB gadget 操作,例如VBUS处理,VBUS上拉,远程唤醒等。 充电器检测。

gadget core : USB设备模式驱动程序框架 支持多种配置,多种接口,复合设备 实现了与硬件无关的USB功能


2.2、USB core

代码位置位于:

/drivers/usb/core

通过定义一组宏、数据结构和函数来抽象出所有硬件或是设备具有依赖关系的部分。

USB core中主要有四个数据结构,分别是:

1.usb_device保存一个USB设备的信息,包括设备地址,设备描述符,配置描述符等。

2.usb_bus保存一个USB总线系统的信息,包括总线上设备地址信息,根集线器,带宽使用情况等。一个USB总线系统至少有一个主机控制器和一个根集线器,Linux系统支持多USB总线系统。

3.usb_driver保存客户驱动信息,包括驱动名称,以及驱动提供给USB内核使用的函数指针等。

4.URB(Universal Request Block)是进行USB通信的数据结构,USB core通过URB在USB设备类驱动和USB core、USB core和HCD间进行数据传输。

 

2.3、USB主机控制器驱动

主机控制器就是用来控制USB设备与CPU之间通信的。CPU要对设备做什么操作,会先通知主机控制器,而不是直接发送指令给USB设备。主机控制器接收到CPU的命令后,会去指挥USB设备完成相应的任务。

 

2.3.1、USB 拓扑

每个嵌入式的CPU芯片中一般都会集成一个或多个Host 控制器,每个Host控制器其实就是一个PCI设备,挂载在PCI总线上,在Linux系统中,驱动开发人员应该给Host 控制器提供驱动程序,Host 控制器用usb_hcd结构来表示。

每个USB Host控制器都会自带一个USB Hub,每个Hub上又可以挂载USB 设备。每个根USB Hub下可以直接或间接地连接127个设备。

2.3.2 、USB控制器类型

  • OHCI :(Open Host Controller Interface)是支持USB1.1的标准。

  • UHCI :(Universal Host Controller Interface),是Intel主导的对USB1.0、1.1的接口标准,与OHCI不兼容。

  • EHCI :(Enhanced Host Controller Interface),是Intel主导的USB2.0的接口标准。

  • xHCI :(eXtensible Host Controller Interface),是最新最火的USB3.0的接口标准。

  • musb : 位于内核代码中/drivers/usb/musb

2.3.3 、USB主机控制器驱动(HDC)

USB主机控制器必须由USB主机控制器驱动程序驱动才能运行。USB主机控制器驱动用hc_driver表示,在计算机系统中的每一个主机控制器都有一个对应的hc_driver结构体,该结构体定义在内核码:/include/linux/usb/hcd.h

device:

/driver/usb/dwc2   /*usb2.0*/
/driver/usb/dwc3   /*usb3.0 <host.c>*/

driver:

/drivers/usb/host/ehic.c    /*usb2.0*/
/drivers/usb/host/xhic.c    /*usb3.0*/

2.4、gadget

代码位于:

/drivers/usb/gadget
                    |
                    `-----function  /*gadget driver code*/
                    |
                    `-----udc      /*DCD code*/

 

3、查看device与driver是否绑定

cd /sys/bus/platform/devices/[device_name]
ls -l #看到如下类似内容
driver -> ../../../bus/platform/drivers/[device_name] #设备与驱动成功绑定