【驱动】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个步骤:

  • 初始化
  • 打开设备
  • 移除原驱动/认领接口
  • 传输
  • 关闭设备

alt

内核驱动

USB总线设备驱动

alt

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设备

alt

总体框架

总状态转换流程

alt

alt

面试介绍

从硬件原理、应用开发和内核驱动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%内容,订阅专栏后可继续查看/也可单篇购买

【嵌入式八股】嵌入式Linux 文章被收录于专栏

查阅整理上千份嵌入式面经,将相关资料汇集于此,主要包括: 0.简历面试 1.语言篇 2.计算机基础 3.硬件篇 4.嵌入式Linux【本专栏】 (建议PC端查看)

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务