USB驱动模型

一.基础知识:

1.usb发展:最开始 usb1.0:1.5Mbit/s  usb1.1:12Mb/s(full speed)   usb2.0:480Mb/s(high speed) usb3.0 4800Mb/s(super speed)

2.usb类型:标准A口 标准 B口(正方形口) mini(老式手机充电线)

micro(智能手机)

3.连接线:4线:两个电源线,两个数据线:数据通信采用差分通信:判断两个数据线D+线,D-线的电压差是否大于200Mv,大于200Mv则是1,否则是0。

4.系统拓扑结构:主机(主控制器),集线器(usb hub),设备。

5.主控制器:OHCI:非pc系统的usb芯片(嵌入式一般usb1.1)

UHCI:大多Inter和Viad等主板,usb1.1

EHCI:USB2.0 pc端一般,向下兼容。

二.通信协议:

1.设备逻辑结构:一个usb设备就对应一个设备描述符,一个设备中有多种模块(音频,视频,按键模块)搭配方式对应一个设备描述符有多种配置(模块的组合使用方式),每种组合模式中的中具体的模块叫做接口(模块接口),接口中有端点(也就是具体模块中的寄存器)

2.USB描述符:Usb设备内部包含一些固定格式数据(固定寄存器):设备描述符(18字节),配置描述符,接口描述符,端点描述符,字符串描述符。

3.数据通讯:基于传输,传输由事务构成,事务有包,包由域构成。

传输:中断(小数据量,鼠标),批量(u盘),同步,控制传输。

事务:in,out,setup事务

包:令牌煲(setup),数据包(data),握手包(ACK)和特殊包。

域:同步域(sync),标识域(pid),地址域(ADDR),端点域(ENDP),帧号域(FRAM),数据域(DATA),校验域(CRC)。

4.设备枚举:

作用:usb设备工作以前,第一件事就是枚举。让主机认识这种设备,并且为该设备准备资源,建立好主机和设备间的数据传递通道。

过程:(1).获取设备描述符 (2).复位 (3)设置地址

(4)再次获取设备描述符用来验证 (5)获取配置描述符

(6)获取接口,端点描述符 (7)获取字符串描述符

(8)为设备选择设备配置

5.软件架构:

(1)主机软件架构:usb主控制器<-usb主控制器驱动<-usb核心<-usb设备驱动

(1.1)配置主控制器驱动:通过make menuconfig 配置:Device Drivers->USB support->support for host->OHCI...主控制类型

(1.2)usb核心默认就有

(1.3)配置usb设备驱动:例如u盘需要配置 usb mass storage support:usb大容量支持

(1.4)其他配置:u盘特殊性:热插拔hot-pluggab配置好,文件系统支持配置好

(2)设备端软件按架构:usb控制器<-udc驱动<-gadget api<-gadget驱动(能够模拟成串口,网卡等)

(2.1)配置设备控制器驱动:Device Drivers->USB support->usb gadget support->usb设备控制器(udc驱动)

(2.2)gadget api自带

(2.3)gadget驱动配置:evice Drivers->USB support->usb gadget support->usb gadget drivers->需要使用usb模拟成那一类驱动的类型(串口,网口)

(2.4)将编译好的库拷贝到开发板加载好后连接好pc机与开发板,然后在pc机上安装好对应驱动

6.usb设备驱动:probe函数中有两个部分:初始化urb(请求)和输入型设备

通信数据流向-一次usb请求的发起(URB):usb驱动先发起请求给usb核心,usb核心发起请求给usb主控制器驱动,usb主控制器驱动将消息发送给usb主控制器,主控制器将读取请求通过总线发送给usb设备,usb设备再将设备信息发送给usb主控制器,流向主控制器驱动,流向usb核心,流向usb设备驱动。一次usb驱动请求完成(usb信息回传usb驱动是通过初始化urb中断函数中的参数实现,回调注册的参数)。

URB通讯模型:

  1. usb驱动创建usb_alloc_urb并初始化(初始化基于端点传输类型:(1.1)中断urb:usb_fill_int_urb:(1.2)批量urb:usb_fill_bulk_urb:(1.3)控制urb:usb_fill_control_urb:(1.4)等时urb:只能手动初始化)一个特定端点(usb设备中某个模块的端点)的urb,并提交给核心usb core
  2. usb_fill_int_urb中:有一个通信管道,这个管道根据传输类型申请的,中断URB类型的管道通过函数usb_rcvintpipe函数。
  3. Usb core 提交(usb_submit_urb)urb到usb主控制器驱动
  4. Usb主控制器驱动程序根据urb描述的信息访问usb设备
  5. 当访问usb设备结束(usb设备按照规定协议将传输报文上报)后,usb主控制器驱动程序通知usb设备驱动程序(通过URB中断初始化函数中的参数,函数回调)

   Usb 人机交互协议(HID协议):

        作用:人机交互的设备,如鼠标,键盘,游戏手柄等设备需要遵从由大厂规定的统一的通信协议。

7.usb下载线驱动

(1)首先注册注册usb驱动:usb_register:初始化usb驱动描述符

(2)usb驱动描述符中的probe函数:本来要去进行URB的设置,改成注册USB字符设备这种方法,里面集成了URB的初始化相关操作。usb_register_dev

(3)usb_register_dev函数参数类型usb_class_driver(usb字符设备驱动模型):usb_class_driver,这个模型中有文件操作函数集合(里面有用户对usb文件进行操作的函数集合,open,read,write等函数)

(4)数据发送函数write:将用户空间的数据转换成内核空间(open函数申请空间)数据,通过函数usb_bulk_msg发送设备,因为不清楚用户空间发送过来数据大小,需要进行判断,然后循环转换数据然后循环调用usb_bulk_msg发送数据

(5)usb_bulk_msg中参数-管道:通过函数usb_sndbulkpipe(块消息发送管道)获得

(6)usb_sndbulkpipe中参数-usb设备端点:通过usb驱动描述符中的probe函数回调传入的参数类型usb_interface中获取,因为usb_interface这个类型中端点比较多,需要循环访问这个变量其中的相关数组,通过函数usb_endpoint_is_buik_out来进行判断是否为块设备输出端点

(7)空间释放:在相应的关闭函数中进行空间释放

猜你喜欢

转载自blog.csdn.net/qq_43706825/article/details/103717736