USB Gadget 大容量存储 SCSI 命令开发指南
文章目录
- USB Gadget 大容量存储 SCSI 命令开发指南
- 一、目录整体定位
- 二、mass storage 相关核心文件清单
- 1. 核心文件(f_mass_storage 全套)
- 2. 同目录其他常用 function(了解即可)
- 三、f_mass_storage 完整调用链路(从上到下)
- 四、关键结构体(来自 `.h` 文件,你代码频繁用到)
- 1. struct fsg_common(核心上下文)
- 2. SCSI 指令宏定义
- 3. 数据方向枚举
- 4. CBW / CSW 结构体(transport.h)
- 五、基于该目录,**新增自定义 SCSI 命令 (0xB8 / 0xC5)** 改造步骤
- 步骤 1:头文件添加自定义指令宏
- 步骤 2:在 do_scsi_command 的 switch 中增加分支
- 示例 1:0xB8 自定义指令(设备→主机,返回数据)
- 示例 2:0xC5 自定义指令(无数据 / 控制类)
- 步骤 3:实现自定义处理函数
- 步骤 4:声明函数(避免编译告警)
- 步骤 5:编译内核模块 / 内核
- 步骤 6:加载测试
- 六、结合你「内核截获 + 应用层交互」的拓展方案
- 七、常见问题 & 调试要点
- 八、快速总结
结合你手里的
do_scsi_command代码、USB Gadget 大容量存储,以及kernel/drivers/usb/gadget/function/目录,做目录结构、文件分工、核心源码、改造要点完整说明,同时适配你截获 / 新增自定义 SCSI 指令 (0xB8/0xC5)的开发场景。一、目录整体定位
路径:
kernel/drivers/usb/gadget/function/该目录存放USB Gadget 标准功能驱动(Function Driver),每一类 USB 设备对应一个功能驱动:
- 大容量存储、串口、网口、HID、MTP、音频等
- 你当前关注的USB Mass Storage(U 盘 / 虚拟磁盘)全套代码都在此目录下
二、mass storage 相关核心文件清单
1. 核心文件(f_mass_storage 全套)
| 文件名 | 作用 | 关联你代码的关键点 |
|---|---|---|
f_mass_storage.c | 主入口、框架、线程、缓冲区管理、命令分发 | 你贴出的do_scsi_command就在这个文件里,SCSI 命令总入口 |
f_mass_storage.h | 对外头文件、全局结构体、宏定义、命令枚举 | struct fsg_common/cmnd/ 数据方向宏、SCSI 指令码定义 |
storage_common.c | 通用存储逻辑、后端文件 / 分区读写、扇区操作 | 实际读写本地文件 / 块设备 |
storage_common.h | 存储层公共头、Sense 错误码、LUN 结构体 | sense_data、错误状态定义 |
transport.c | USB MSC 传输层:解析 CBW、组装 CSW、端点收发 | USB 协议层,SCSI 命令的来源 |
transport.h | 传输层头文件、CBW/CSW 结构体定义 | USB MSC 包装协议 |
2. 同目录其他常用 function(了解即可)
f_serial.c:USB 虚拟串口f_ecm.c/f_ncm.c:USB 网卡f_hid.c:USB 键盘 / 鼠标 / HID 设备f_audio.c:USB 音频f_mtp.c:媒体传输f_loopback.c:USB 回环测试
三、f_mass_storage 完整调用链路(从上到下)
结合你do_scsi_command函数,梳理数据流向:
USB Host ↔ USB 物理端点 ↓ transport.c 解析 CBW 包(USB MSC) → 提取 SCSI CDB ↓ f_mass_storage.c 线程入口 → 调用 do_scsi_command() 【你当前代码】 ↓ switch 分支分发:READ/WRITE/INQUIRY/TEST UNIT READY ... ↓ 调用 do_read / do_write / do_inquiry 等处理函数 ↓ storage_common.c 读写后端文件/分区(模拟U盘介质) ↓ 数据/状态回填 → 组装 CSW 应答包 → 发回 USB 主机四、关键结构体(来自.h文件,你代码频繁用到)
1. struct fsg_common(核心上下文)
定义在f_mass_storage.h,贯穿整个驱动:
structfsg_common{u8 cmnd[16];// 存放 SCSI CDB 指令(最多16字节)intcmnd_size;// CDB 有效长度enumdata_dirdata_dir;// 数据方向:TO_HOST / FROM_HOST / NONEu32 data_size_from_cmnd;// 命令指定的数据传输长度structfsg_buffhd*next_buffhd_to_fill;// 待填充缓冲区structfsg_buffhd*next_buffhd_to_drain;// 待发送缓冲区intphase_error;intshort_packet_received;l