如果你平时写的是应用层代码,但偶尔需要排查 USB 设备枚举失败、内核驱动不工作,或者想弄明白 Android 的 USB 框架到底怎么接上 Linux 原生栈,那这个资料包能帮你把「协议」和「代码」之间那条断掉的线接起来。它不是教你调一个 usb 命令,而是让你理解 USB 2.0 在 Linux 里从控制器到设备驱动的完整路径。

它解决什么问题

很多嵌入式或驱动开发者面对 USB 时的困境是:能照着写一个简单的字符设备驱动,但一旦遇到端点(endpoint)、传输类型(transfer)、设备状态切换就发懵。更常见的是,你手上有一块 Android 板子,想搞清楚为什么 U 盘挂载失败,或者想写一个 USB 配件驱动,却不知道 Linux 的 usbcore 和 Android 的 usb gadget 各管哪一段。

这个资料包的核心是:从 USB 2.0 协议规范入手,把最关键的几个抽象概念讲清楚——端点、管道、传输类型、设备状态,然后直接落到 Linux 内核的 USB 子系统和 Android 的 USB 实现上。它不追求覆盖所有协议细节,而是挑出写驱动时必须理解的那部分,让你知道「协议里的说法」在代码里对应什么结构体、什么函数。

适合什么基础,建议先看哪几块

适合已经写过 C 语言、对 Linux 设备驱动有基本概念(比如知道 file_operations、platform_driver)的人。如果你完全没碰过内核,直接看协议部分会有点吃力,但可以先跳过状态机细节,把注意力放在传输类型和端点概念上。如果你只做过应用层,建议先看前四节,把「什么是控制传输、批量传输、中断传输」弄明白,再去看 Linux 框架,否则代码里一堆 urb 和 completion 会让你晕。

资料包的顺序是合理的:前两节讲基本概念和状态,第三节讲数据传输,第四节开始进入协议实现,第五、六节讲 OTG、Android USB 和 Linux 原生框架。我的建议是:如果你目标是写 Linux 驱动,重点看第一、三、四节,第六节可以扫一眼;如果你目标是 Android 侧,那第五、六节必须精读,但前提是前三节的概念已经清楚。不要一开始就啃第六节,那里面全是框架结构,没有协议基础会非常痛苦。

学完能独立做什么,资料怎么配合练习

学完之后,你能独立做这些事:看懂 Linux 内核里 usb_driver 的 probe 流程,知道在什么时机处理端点;能根据设备的描述符判断它需要哪种传输方式;能写出一个简单的 USB 驱动骨架,并理解 urb 的提交和回调;在 Android 系统里,能区分是 gadget 层的问题还是 host 层的问题,知道该去 logcat 还是 dmesg 找线索。

资料本身是讲解型的,没有配套代码工程。所以练习方式建议:边看边对照内核源码。比如讲端点时,打开 include/linux/usb.h 看 struct usb_host_endpoint;讲传输时,看 drivers/usb/core/urb.c 里的 usb_submit_urb。不要只看视频,视频里提到的函数名和结构体,去源码里找一遍,再自己写一个小的 USB 设备驱动(比如读取一个 USB 鼠标的 HID 报告),这样才算真正消化。对于 Android 部分,最好有一块能跑 adb 的开发板,一边看框架讲解,一边用 dmesg 观察枚举过程,把理论对到实际日志上。

总的来说,这个资料包适合那些已经入了驱动开发的门、但被 USB 协议卡住的人。它不教你从零写驱动,而是帮你补上协议这块短板。如果你只想快速调通一个设备,可以只看第三、四节;如果你想长期做 USB 相关开发,那建议按顺序完整过一遍,并且把内核源码放在手边随时翻。

课程目录

课程目录6 集
  • 1 overview和基本概念,端点、pipe、transfer (30:23).mp4
  • 2 基本概念(transfer、小结、设备状态) (20:29).mp4
  • 3 数据传输 (27:10).mp4
  • 4 数据传输、协议实现 (32:17).mp4
  • 5 OTG、android usb和linux原生usb框架 (27:29).mp4
  • 6 android usb和linux原生usb框架 (35:29).mp4