【linux驱动】USB Gadget Mass Storage + 自定义SCSI指令开发指南
2026/5/30 1:20:08 网站建设 项目流程

USB Gadget Mass Storage + 自定义SCSI指令开发指南

摘要:本文详细解析了 Linux USB Gadget Mass Storage 驱动的目录结构、文件分工与编译流程,并提供了在f_mass_storage.c中新增自定义 SCSI 指令(如 0xB8/0xC5)的完整步骤。核心内容包括:1)驱动源码分层解读;2)Makefile 编译规则;3)日常调试命令;4)自定义指令四步落地法(添加宏、实现函数、修改分发逻辑、重编测试);5)进阶的内核转发方案(kprobe+字符设备)。旨在帮助开发者快速定位改造点,实现 USB 存储设备与主机的定制化通信。


时间:2026年5月29日18:43:57

文章目录

  • USB Gadget Mass Storage + 自定义SCSI指令开发指南
    • 一、目录总览
      • 已生成产物说明(带 `.o`/`.ko`/`.mod`)
    • 二、按功能分组解读文件
      • 1. 【核心:USB 大容量存储(你的主力改造区)】
      • 2. 【网络类 USB 网卡】
      • 3. 【串口 / 通信类】
      • 4. 【音视频类】
      • 5. 【人机 / 外设类】
      • 6. 【其他功能】
      • 7. 编译控制文件
    • 三、Makefile 简要说明(mass_storage 编译规则)
    • 四、日常编译、加载、调试命令(当前目录直接执行)
      • 1. 重新编译模块(修改代码后必做)
      • 2. 卸载旧模块 + 加载新模块
      • 3. 查看日志(抓 SCSI 指令,验证自定义 0xB8/0xC5)
      • 4. 查看模块是否加载成功
    • 五、结合你的需求:新增 0xB8 / 0xC5 自定义 SCSI 指令 完整落地步骤
      • 步骤 1:头文件添加指令宏
      • 步骤 2:f_mass_storage.c 新增处理函数
      • 步骤 3:在 do_scsi_command 的 switch 中增加分支
      • 步骤 4:重新编译 + 加载测试
    • 六、进阶方案:内核转发指令到应用层(你之前的 kprobe / 字符设备 思路)
    • 七、常见坑 & 调试提示
    • 八、快速总结

结合你当前目录树、文件分布和USB Gadget Mass Storage + 自定义 SCSI 指令开发场景,做分层解读、编译说明、改造指引、文件分工,同时结合你之前的do_scsi_command代码。

一、目录总览

路径:drivers/usb/gadget/function/该目录是USB Gadget 功能驱动集合,每个f_xxx.c对应一类 USB 设备功能:

  • 存储、串口、网卡、HID 键鼠、音频、摄像头、打印机等
  • 你当前重点:大容量存储功能f_mass_storage

已生成产物说明(带.o/.ko/.mod

这些是编译后目标文件 & 内核模块,说明当前目录已执行过编译:

  1. f_mass_storage.o/storage_common.o:源码编译出的中间目标文件
  2. usb_f_mass_storage.ko最终内核模块文件,可直接insmod/rmmod加载卸载
  3. modules.order/usb_f_mass_storage.mod*:模块依赖、版本、符号信息,内核加载模块用

二、按功能分组解读文件

1. 【核心:USB 大容量存储(你的主力改造区)】

f_mass_storage.c // 主逻辑:SCSI命令分发、do_scsi_command、线程、缓冲区管理 f_mass_storage.h // 结构体、宏、枚举、函数声明(SCSI指令码、fsg_common 定义) storage_common.c // 存储底层:扇区读写、LUN管理、Sense错误、后端文件操作 storage_common.h // 存储层头文件、错误码、LUN结构体

对应链路USB MSC 传输层 →f_mass_storage.cdo_scsi_command→ 调用storage_common.c读写模拟磁盘。

2. 【网络类 USB 网卡】

f_ecm.c / f_ncm.c / f_eem.c // 标准USB以太网 f_rndis.c / rndis.h / ndis.h // Windows 专用 RNDIS 网卡 u_ether.c / u_ether.h 等 // 以太网通用底层封装

3. 【串口 / 通信类】

f_acm.c / f_serial.c // USB 虚拟串口(CDC-ACM) u_serial.c / u_serial.h f_obex.c / f_phonet.c // 蓝牙/手机相关通信协议

4. 【音视频类】

f_uac1.c / f_uac2.c // USB 音频 UAC1.0/UAC2.0 f_audio_source.c / f_midi.c // 音频输入、MIDI f_uvc.c / uvc_*.c/h // USB 摄像头 UVC(视频采集)

5. 【人机 / 外设类】

f_hid.c // HID 键盘、鼠标、触摸设备 f_printer.c // USB 打印机 f_loopback.c // USB 回环测试设备(调试用)

6. 【其他功能】

f_fs.c // USB 文件系统挂载 f_tcm.c / tcm.h // SCSI 目标器(iSCSI/SCSI 远程存储) f_accessory.c // 安卓配件模式 g_zero.h // 空设备模板

7. 编译控制文件

Makefile // 模块编译规则,控制哪些文件编译进 usb_f_mass_storage.ko

三、Makefile 简要说明(mass_storage 编译规则)

usb_f_mass_storage.ko由以下文件链接而成:

obj-$(CONFIG_USB_MASS_STORAGE) += usb_f_mass_storage.o usb_f_mass_storage-y := f_mass_storage.o storage_common.o
  • 修改f_mass_storage.c/storage_common.c→ 重新编译即可更新模块
  • 无需改动其他文件

四、日常编译、加载、调试命令(当前目录直接执行)

1. 重新编译模块(修改代码后必做)

# 清理旧目标(可选,避免缓存)

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询