2026/7/30 16:17:51
网站建设
项目流程
专栏总目录
文章目录
- 概述
- 一、驱动整体架构
- 二、驱动注册与卸载
- 2.1 定义usb_driver结构体
- 2.2 字段说明
- 2.3 模块注册宏
- 三、设备匹配表 (id_table)
- 3.1 定义设备ID表
- 3.2 匹配规则
- 3.3 MODULE_DEVICE_TABLE的作用
- 四、设备私有数据结构 (usb_skel)
- 五、probe函数详解
- 5.1 probe调用时机
- 5.2 probe函数实现
- 5.3 关键步骤解析
- 步骤1: 分配设备结构
- 步骤2: 查找端点
- 步骤3: 获取端点最大包大小
- 步骤4: 保存接口数据
- 步骤5: 注册字符设备
- 六、URB (USB Request Block)
- 6.1 URB是什么?
- 6.2 URB生命周期
- 6.3 URB结构体
- 6.4 URB状态码
- 七、文件操作集 (file_operations)
- 7.1 定义文件操作
- 7.2 usb_class结构体
- 八、完整示例代码分析
- 8.1 read操作
- 8.2 write操作
- 8.3 URB完成回调
- 九、disconnect函数
- 9.1 disconnect调用时机
- 9.2 disconnect实现
- 9.3 清理顺序
- 十、常见问题
- Q1: 为什么要使用usb_anchor?
- Q2: limit_sem的作用是什么?
- Q3: 为什么write中使用usb_alloc_coherent?
- Q4: open/release需要做什么?
- 十一、知识总结
概述
usb-skeleton.c是Linux内核提供的USB设备驱动模板,位于drivers/usb/usb-skeleton.c。它展示了编写USB字符设备驱动的完整流程,包括注册、探测、读写操作等核心功能。
源码位置:drivers/usb/usb-skeleton.c
学习目标:
- ✅ 掌握USB驱动的基本框架
- ✅ 理解probe/disconnect流程
- ✅ 学会URB的创建和提交
- ✅ 了解批量传输的实现方法
一、驱动整体架构
1.1 驱动工作流程图