1. 学习目标
- 理解 USB 总线工作原理
理解 USB 通信结构:
Host
Device
Hub
Endpoint
- 理解 Linux USB 子系统架构
理解 USB 驱动结构:
User Space
│
▼
USB Core
│
▼
USB Driver
│
▼
USB Device
- 理解 USB 核心结构
掌握核心对象:
usb_device
usb_interface
usb_driver
- 理解 USB 枚举流程
理解 Linux 如何识别 USB 设备:
Device Plug
Device Enumeration
Driver Match
Probe
- 能编写简单 USB 驱动
掌握API:
usb_register
usb_alloc_urb
usb_submit_urb
2. USB 总线简介
USB 是一种:
主从结构通信总线
系统结构:
USB Host
│
▼
USB Hub
│
▼
USB Device
例如:
键盘
鼠标
U盘
摄像头
WiFi
3. USB 通信结构
USB 通信通过:
Endpoint
进行。
设备结构:
Device
│
▼
Configuration
│
▼
Interface
│
▼
Endpoint
Endpoint 类型
USB Endpoint 类型
Control
Bulk
Interrupt
Isochronous
用途:
Control 控制传输
Bulk 大数据传输
Interrupt 小数据快速传输
Isochronous 实时数据
4. Linux USB 子系统架构
Linux USB 子系统结构:
User Space
│
▼
USB Core
│
▼
USB Driver
│
▼
USB Host Controller
│
▼
USB Device
例如:
xhci
ehci
uhci
5. USB 核心结构
USB 驱动核心对象:
usb_device
usb_interface
usb_driver
6. usb_device
usb_deive 表示:
USB 设备
结构:
struct usb_device
{
struct device dev;
};
表示:
USB 硬件设备
7. usb_interface
USB 设备可以有多个:
Interface
例如:
USB 摄像头
├─ 视频接口
└─ 控制接口
结构:
struct usb_interface
{
struct usb_host_interface *altsetting;
};
8. usb_driver
usb_driver 表示:
USB 设备驱动
结构:
struct usb_driver
{
const char *name;
int (*probe)(struct usb_interface *,
const struct usb_device_id *);
void (*disconnect)(struct usb_interface *);
};
核心函数:
probe
discoonnect
9. USB 驱动匹配机制
USB 驱动通过:
VID
PID
匹配设备。
例如:
Vendor ID
product ID
驱动定义:
static const struct usb_device_id id_table[] =
{
{ USB_DEVICE(0x1234,0x5678) },
{ }
};
10. USB 驱动注册流程
USB 驱动基本流程:
定义 usb_driver
│
usb_register
│
USB Core
│
设备匹配
│
probe()
流程图:
USB Device Plug
│
▼
USB Core
│
▼
Match Driver
│
▼
Probe
11. USB 数据传输
USB 数据传输使用:
URB
URB 表示:
USB Request Block
结构:
struct urb
{
struct usb_device *dev;
void *transfer_buffer;
};
URB 传输流程
Driver
│
▼
usb_alloc_urb
│
▼
usb_submit_urb
│
▼
USB Controller
12. USB 驱动示例
简单 USB 驱动:
static int my_probe(struct usb_interface *interface,
const struct usb_device_id *id)
{
printk("USB device connected\n");
return 0;
}
static void my_disconnect(struct usb_interface *interface)
{
printk("USB device disconnected\n");
}
static struct usb_driver my_driver =
{
.name = "my_usb",
.probe = my_probe,
.disconnect = my_disconnect,
.id_table = id_table,
};
注册:
usb_register(&my_driver);
13. 用户空间查看 USB
查看 USB 设备
lsusb
查看 USB 拓扑:
lsusb -t
查看内核信息:
dmesg
14. USB 设备节点
USB 设备通常通过:
udev
创建设备节点。
例如:
/dev/ttyUSB0
/dev/video0
/dev/hidraw0
15. USB 子系统结构总结
Linux USB 子系统结构:
User Space
│
▼
USB Core
│
▼
USB Driver
│
▼
USB Host Controller
│
▼
USB Device
核心结构:
usb_device
usb_interface
usb_driver
16. 驱动常见问题
USB 设备无法识别
原因:
VID/PID 不匹配
probe 未调用
原因:
id_table 未配置
数据传输失败
原因:
Endpoint 类型错误
17. 总结
Linux USB 子系统核心结构:
usb_device
usb_interface
usb_driver
关系:
USB Core
│
▼
USB Driver
│
▼
USB Device
最重要原则:
USB 驱动 = USB Core + USB Device
18. Q&A
18.1 基础理解
-
USB 为什么采用 Host/Device 架构?
-
Endpoint 的作用是什么?
18.2 Linux 架构
-
usb_interface 表示什么?
-
usb_driver 的 probe 为什么会被调用?
18.3 驱动流程
-
URB 的作用是什么?
-
usb_submit_urb 做了什么?