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 X6USB 等 USB 扫描仪 |
与 RK3588:均为 老旧专有硬件,一般嵌入式产品内核可 N;分析目的是理解 「非标准类成像设备」在内核里的两类接入方式。
2. mdc800.c(Mustek MDC800)
2.1 功能
- 绑定 VID
0x055f/ PID0xa800。 usb_driver+probe/disconnect:严格校验 单 configuration、接口 Class0xff(Vendor)、4 个端点 的布局是否与mdc800_ed[]一致。- 全局仅支持一台相机(静态
mdc800实例,probe里若已有dev则拒绝第二台)。
2.2 对上接口(用户态)
- 使用
usb_register_dev(intf, &mdc800_class),归属struct usb_class_driver(动态usb_minor),不再是注释里的静态 major180)。 file_operations:open/release/read/write/ioctl/poll等,通过mutex、wait_queue与 USBURB同步。- 传输:中断 URB(状态/就绪)、批量 OUT/IN URB 下发相机命令与取图像数据;状态机
mdc800_state:NOT_CONNECTED/READY/WORKING/DOWNLOAD。
2.3 原理小结
典型 「Vendor 类 + 字符设备」:用户态(历史上 gphoto)按私有协议填缓冲区,经 ioctl/write/read 驱动 URB 与相机对话。
3. microtek.c(Microtek USB 扫描仪)
3.1 功能
- 逆向工程 的 USB 协议:注释描述 EP
0x01OUT 下发命令与写出数据;0x82IN 读状态与普通数据;0x83IN 读大块图像(与 READ IMAGE 类 SCSI 相关)。 - 前缀约定:
mts_usb_*为 USB 侧,mts_scsi_*为 SCSI 中间层接口。
3.2 对上接口(内核 SCSI)
scsi_host_alloc分配struct Scsi_Host,模板mts_scsi_host_template:queuecommand→DEF_SCSI_QCMD包装的mts_scsi_queuecommand_lck。queuecommand把scsi_cmnd转成 USB bulk/int(URB) 序列:先发 CDB 到 EP1,再按注释规则从0x83或0x82收数据,最后读 状态字节。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_autosuspend、usb_kill_urb、usb_submit_urb等标准 API。 - 均未实现 USB Imaging Class 的现代标准路径;若新硬件,应优先 UVC / USB Still Image Class / vendor userspace (libusb),而不是仿照本目录风格新增内核驱动。
5. 小结
| 维度 | MDC800 | Microtek |
|---|---|---|
| 设备模型 | usb_interface → usb char class |
usb_interface → Scsi_Host |
| 协议 | Vendor bulk + int | 逆向 bulk 管道上的 类 SCSI |
| 用户态 | 字符节点 + ioctl/read/write | SG / 扫描栈 |
目录体量小但覆盖了 成像外设在 Linux 里的两种经典挂载方式:直连 misc/usb-class 与 伪装成 SCSI generic。
正在加载留言…