【驱动】11.USB子系统
【嵌入式八股】一、语言篇https://www.nowcoder.com/creation/manager/columnDetail/mwQPeM
【嵌入式八股】二、计算机基础篇https://www.nowcoder.com/creation/manager/columnDetail/Mg5Lym
【嵌入式八股】三、硬件篇https://www.nowcoder.com/creation/manager/columnDetail/MRVDlM
【嵌入式八股】四、嵌入式Linux篇(本专栏)https://www.nowcoder.com/creation/manager/columnDetail/MQ2bb0
USB子系统
硬件原理
看【硬件篇-接口协议】部分USB相关
应用编程
可以通过libusb访问USB设备,不需要USB设备端的驱动程序,需要移除原来的驱动程序。然后就可以直接访问USB控制器的驱动程序,使用open/read/write/ioctl/close这些接口来打开设备、收发数据、关闭设备。 libusb封装了更好用的函数,这些函数的使用可以分为5个步骤:
- 初始化
- 打开设备
- 移除原驱动/认领接口
- 传输
- 关闭设备
内核驱动
USB总线设备驱动
Gadget框架(可以把开发板作为USB从设备,通过OTG接口让其他Host读写数据)
基于Gadget驱动框架模拟一个USB设备时,endpoint的数据传输能力是底层的USB Device Controller驱动提供的,我们要做的就是:
- 提供各类设备描述符
- 使用底层USB Device Controller驱动程序提供的API函数,从endpoint得到数据、反馈数据
USB传输的核心是endpoint,使用endpoint可以收发数据。在endpoint之上,就可以模拟USB串口、USB触碰屏、USB摄像头。基于这个角度,Gadget框架可以分为两层:
- 底层endpoint操作
- 上层模拟各类USB设备
总体框架
总状态转换流程
面试介绍
从硬件原理、应用开发和内核驱动3个方面介绍Linux USB
-
首先是硬件原理
新接入的USB设备的默认编号是0,在未分配新编号前,PC使用0编号和它通信。然后给它分配一个编号。
USB 2.0协议支持3种速率:低速(Low Speed,1.5Mbps)、全速(Full Speed, 12Mbps)、高速(High Speed, 480Mbps)。
USB连接涉及Hub Port和USB设备,Hub端口的D+、D-都有15K的下拉电阻,平时为低电平。全速设备内部的D+有1.5K的上拉电阻,低速设备内部的D-有1.5K的上拉电阻,连接到Hub后会导致Hub的D+或D-电平变化,Hub根据变化的引脚分辨接进来的是全速设备还是低速设备。高速设备一开始也是作为全速设备被识别的。Hub端口复位然后会发送和接收一系列KJ信号(高速检测握手信号)监测一个新插入的USB设备能否工作于高速模式。
再说一下USB协议层数据格式:先发同步信号告诉设备采用的通信速率,再进行异步传输。一条线搞定传输,不过是差分线变成两条了。
-
SOP:用来表示包的起始
-
SYNC:用来同步
-
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
查阅整理上千份嵌入式面经,将相关资料汇集于此,主要包括: 0.简历面试 1.语言篇 2.计算机基础 3.硬件篇 4.嵌入式Linux【本专栏】 (建议PC端查看)