news 2026/5/30 1:19:06

USB Gadget 大容量存储 SCSI 命令开发指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
USB Gadget 大容量存储 SCSI 命令开发指南

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.cUSB 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
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/30 1:19:01

从数据采集到图表显示:LabVIEW数组在DAQmx项目中的实战应用

从数据采集到图表显示:LabVIEW数组在DAQmx项目中的实战应用在工业自动化和测试测量领域,LabVIEW凭借其图形化编程优势和强大的硬件集成能力,成为工程师们处理实时数据流的首选工具。特别是当面对来自传感器的高频采样数据时,如何高…

作者头像 李华
网站建设 2026/5/30 1:18:57

PyMuPDF实战:除了拆分PDF,这4个隐藏功能让你的文档处理效率翻倍

PyMuPDF实战:解锁PDF处理的4个高阶应用场景每次处理PDF文档时,你是否还在为繁琐的手动操作而烦恼?作为Python开发者,PyMuPDF(fitz)库可能是你从未充分发掘的瑞士军刀。这个轻量级工具不仅能完成基础的拆分合…

作者头像 李华
网站建设 2026/5/30 1:18:39

ArcGIS工具箱DIY:手把手教你打造专属的“mxd版本批量转换器”

ArcGIS工具箱DIY:手把手教你打造专属的“mxd版本批量转换器”在GIS日常工作中,版本兼容性问题就像一把悬在头顶的达摩克利斯之剑。当精心制作的mxd文档因为版本差异无法在同事电脑上打开时,那种挫败感每个GISer都深有体会。传统的手动"另…

作者头像 李华
网站建设 2026/5/30 1:18:37

医疗智能化:从数据科学到物联网,技术如何重塑诊疗与健康管理

1. 医疗行业的十字路口:技术驱动的必然变革如果你在医疗行业待过,无论是作为临床医生、医院管理者,还是医疗科技公司的从业者,你都能清晰地感受到一种“熟悉的焦虑”。一边是堆积如山的病历文书、永远排不完的候诊队伍、医护人员超…

作者头像 李华
网站建设 2026/5/30 1:17:17

GitHub终极加速插件:5分钟实现下载速度飙升10倍的完整指南

GitHub终极加速插件:5分钟实现下载速度飙升10倍的完整指南 【免费下载链接】Fast-GitHub 国内Github下载很慢,用上了这个插件后,下载速度嗖嗖嗖的~! 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub 还在为GitHu…

作者头像 李华