RK3588 kernel-6.1:drivers/usb/image 功能与实现要点

RK3588 kernel-6.1:drivers/usb/image 功能与实现要点

源码基准:rk3588/kernel-6.1/drivers/usb/image/

1. 目录定位

drivers/usb/image 收录 成像类 USB 外设 的内核驱动,与 drivers/usb/storage(大容量存储)media/usb(UVC 等)不同:这里的设备 不按 Mass Storage 工作,而是 厂商自定义 bulk/int 协议把 SCSI 封在 USB bulk 管道里

本树仅 两个驱动(见 Makefile / Kconfig):

选项 文件 设备类型
CONFIG_USB_MDC800 mdc800.c Mustek MDC800 数码相机
CONFIG_USB_MICROTEK microtek.c + microtek.h Microtek X6USBUSB 扫描仪

与 RK3588:均为 老旧专有硬件,一般嵌入式产品内核可 N;分析目的是理解 「非标准类成像设备」在内核里的两类接入方式


2. mdc800.c(Mustek MDC800)

2.1 功能

  • 绑定 VID 0x055f / PID 0xa800
  • usb_driver + probe/disconnect:严格校验 单 configuration、接口 Class 0xff(Vendor)4 个端点 的布局是否与 mdc800_ed[] 一致。
  • 全局仅支持一台相机(静态 mdc800 实例,probe 里若已有 dev 则拒绝第二台)。

2.2 对上接口(用户态)

  • 使用 usb_register_dev(intf, &mdc800_class),归属 struct usb_class_driver(动态 usb_minor),不再是注释里的静态 major 180)。
  • file_operationsopen/release/read/write/ioctl/poll 等,通过 mutexwait_queueUSB URB 同步。
  • 传输中断 URB(状态/就绪)、批量 OUT/IN URB 下发相机命令与取图像数据;状态机 mdc800_stateNOT_CONNECTED / READY / WORKING / DOWNLOAD

2.3 原理小结

典型 「Vendor 类 + 字符设备」:用户态(历史上 gphoto)按私有协议填缓冲区,经 ioctl/write/read 驱动 URB 与相机对话。


3. microtek.c(Microtek USB 扫描仪)

3.1 功能

  • 逆向工程 的 USB 协议:注释描述 EP 0x01 OUT 下发命令与写出数据;0x82 IN 读状态与普通数据;0x83 IN 读大块图像(与 READ IMAGE 类 SCSI 相关)。
  • 前缀约定mts_usb_* 为 USB 侧,mts_scsi_* 为 SCSI 中间层接口。

3.2 对上接口(内核 SCSI)

  • scsi_host_alloc 分配 struct Scsi_Host,模板 mts_scsi_host_templatequeuecommandDEF_SCSI_QCMD 包装的 mts_scsi_queuecommand_lck
  • queuecommandscsi_cmnd 转成 USB bulk/int(URB) 序列:先发 CDB 到 EP1,再按注释规则从 0x830x82 收数据,最后读 状态字节
  • depends on SCSI:对用户表现为 /dev/sg*scsi_generic),SANE 等通过 SG ioctl 或后端扫描栈访问。

3.3 原理小结

典型 「USB-SCSI 胶水」:硬件 不把 SCSI 封成 BOT/UASP,而是在几条 bulk 管道上演 SCSI 语义;内核侧 自建迷你主机适配层,而不是 usb-storage


4. 与通用 USB 子系统的关系

  • 二者都用 usb_enable/disable_autosuspendusb_kill_urbusb_submit_urb 等标准 API。
  • 均未实现 USB Imaging Class 的现代标准路径;若新硬件,应优先 UVC / USB Still Image Class / vendor userspace (libusb),而不是仿照本目录风格新增内核驱动。

5. 小结

维度 MDC800 Microtek
设备模型 usb_interfaceusb char class usb_interfaceScsi_Host
协议 Vendor bulk + int 逆向 bulk 管道上的 类 SCSI
用户态 字符节点 + ioctl/read/write SG / 扫描栈

目录体量小但覆盖了 成像外设在 Linux 里的两种经典挂载方式直连 misc/usb-class伪装成 SCSI generic

文章互动

阅读 --

留言

0 条留言

正在加载留言…