这原本是我这学期OS课程设计最后一次的作业,因为比较有意思,所以就把它公布出来吧。
作业要求:
开发Linux下的usb存储设备的驱动,仅需支持自己的u盘即可。
下面是我写的驱动,他基于linux下自带的usb-storage驱动(/driver/usb/storage)。仅支持基于Bulk-only传输模式下的ATAPI协议的存储设备。我使用自己的SAMSUNG D828手机的usb mass storage功能测试成功。
使用方法是insmod。
代码:
http://www.csksoft.net/data/legacyftp/Products/code_and_lib/csk_udisk_mgr.rar
下面是这次作业报告的节选,希望对需要研究usb-storage或者想自己开发linux u盘驱动(虽然那已经没有必要了)的朋友有帮助。这次报告的原文后面给出的地址。
1.USB MASS STORAGE 协议分析
Sub Class | 协议名 | 说明 |
0x01 | Reduced Block Commands(RBC) | 通常为Flash Rom介质的存储设备使用 |
0x02 | 8020i, MMC-2(ATAPI) | 通常为CD/DVD设备使用 |
0x03 | QIC-157 | 常用于磁带机设备 |
0x04 | UFI | 常用于软磁盘设备(FDD) |
0x05 | 8070i | 常用于软磁盘设备或者其他设备 |
0x06 | SCSI协议 | |
0x07-0xFF | 保留 | |
接口协议号 | 协议名 |
0x00 | Control/Bulk/Interrupt 协议(CBI) 带有command completion中断 |
0x01 | Control/Bulk/Interrupt 协议(CBI) 不带有command completion中断 |
0x50 | Bulk-Only协议 |
0x02-0x4F | 保留 |
0x51-0xFF | 保留 |
2.自带驱动usb-storage的简要原理分析
文件 | 功能说明 |
usb.c/.h | Usb-storage的核心文件,是整个驱动的框架代码 |
transport.c/.h | 实现了对于不同通讯方式的支持函数 |
scsiglue.c/.h | Scsi设备的模拟函数 |
protocol.c/.h | 实现了对于几种通讯协议的SCSI命令翻译函数 |
initializers.c/.h | 对于某些设备的专用初始化函数 |
unusual_devs.h | 对于非常规设备ProductID和VendorID的支持 |
shuttle_usbat.c/.h | 支持SCM Microsystems设备的驱动 |
sddr55.c/.h | SanDisk SDDR-55 SmartMedia reader的驱动 |
sddr09.c/.h | anDisk SDDR-09 SmartMedia reader的驱动 |
onetouch.c/.h | Maxtor OneTouch USB hard drive驱动支持 |
libusual.c | 对于常规设备的ProductID和VendorID的支持 |
karma.c/.h | Rio Karma设备驱动 |
jumpshot.c/.h | Lexar "Jumpshot" Compact Flash reader驱动 |
isd200.c/.h | ISD200专属通讯协议支持 |
freecom.c/.h | Freecom USB/IDE 转化器支持 |
dpcm.c/.h | DPCM-USB CompactFlash/SmartMedia reader设备支持 |
debug.c/.h | 用于调试的工具函数 |
datafab.c/.h | Datafab USB Compact Flash reader驱动支持 |
alauda.c/.h | Alauda-based card readers驱动支持 |

3.对usb-storage的简化
- 删除其中对罕见设备的支持
- 删除Delayed Device Scan机制
- 删除对于除了本次试验所用u盘设备外其他的通讯协议和通讯方式的处理函数。
- 对于仅调用一次的函数作inline处理
4.制作专用驱动
报告原文,请勿随意抄袭!
ftp://FTP_Visitor:visitor@ftp.csksoft.net/Public/Article/osprj_mass_storage_csk.rar