如何使USB Mass Storage驱动支持CD-ROM格式
2017-11-26 22:11
288 查看
摘要
U盘支持CDROM格式,其实是U盘中含有两个逻辑单元,即LUN。其中,一个LUN表现为CD-ROM device,另一个表现为SBC Direct-access device。而这两种格式的优缺点,及为什么要这样实现,可以自行百度。
在讲如何实现CD-ROM格式前,不得不提另一个名词,即量产工具。量产工具指的就是一个U盘设备,该设备包含了两种LUN,其中一个是你要制作的image系统,该系统被放置在CD-ROM逻辑单元,用户只能读取或者插入U盘后自动运行,另一个就是常规的U盘。制作这种特殊U盘可以到淘宝上搜索,有专门的卖家,且卖家会提供制作工具及说明文档,帮你完成量产。
我们在有了量产工具和USB Mass Storage驱动后,如果使我们的USB设备完成枚举流程且顺利的访问U盘呢?
正文
一、Get Max LUN请求
该class类的请求,可以使host端获得device端的LUN数量,这会为接下来的Inquiry提供上限。以下是FreeBSD中的代码流程:
当Host完成strandard request后,会去attach umass驱动,在umass_attach接口中,会初始化驱动的一些基本信息
驱动通过CBW发送Inquiry Command给设备驱动,这时候设备驱动会返回Inquiry Data给Host,Host解析数据后可以得到当前LUN的属性,包括Peripheral Device Type(PDT)、 Removable Medium Bit (RMB)、PID、VID等信息,其中PDT可以说明当前设备类型,如下图:
![](https://img-blog.csdn.net/20171126221625862?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGVubmlzR2FuZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
三、访问U盘
在第二步中,驱动已经知道那个LUN是Direct-access device了,所以我们只需要在CBW中指定LUN为当前的值即可。
四、访问CD-ROM
在访问CD-ROM时,除了需要满足U盘的一些命令外,还需要完成READ TOC指令,格式如下:
![](https://img-blog.csdn.net/20171126221647517?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGVubmlzR2FuZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
说明:USB Mass Storage驱动具体要实现那些SCSI命令,请参考usb_msc_boot_1.0.pdf
但是该文档中对data有删减,所以SCSI返回详细数据可参考SCSI Commands Reference Manual.pdf
文章结尾推荐一个比较好的博客:
1、如何实现Linux下的U盘(USB Mass Storage)驱动
——该博客详细的介绍了U盘驱动的相关基础知识,及驱动协议之间的关系
博文链接:http://blog.csdn.net/mao0514/article/details/24996553
2、Linux
USB gadget设备驱动解析(2)---驱动调试
——该文章详细的讲解了BBB传输方式下,驱动所处的状态及Wrapper的说明
文章链接:http://www.hzlitai.com.cn/article/ARM11/SYSTEM/1746.html
<<< 返回博客架构
U盘支持CDROM格式,其实是U盘中含有两个逻辑单元,即LUN。其中,一个LUN表现为CD-ROM device,另一个表现为SBC Direct-access device。而这两种格式的优缺点,及为什么要这样实现,可以自行百度。
在讲如何实现CD-ROM格式前,不得不提另一个名词,即量产工具。量产工具指的就是一个U盘设备,该设备包含了两种LUN,其中一个是你要制作的image系统,该系统被放置在CD-ROM逻辑单元,用户只能读取或者插入U盘后自动运行,另一个就是常规的U盘。制作这种特殊U盘可以到淘宝上搜索,有专门的卖家,且卖家会提供制作工具及说明文档,帮你完成量产。
我们在有了量产工具和USB Mass Storage驱动后,如果使我们的USB设备完成枚举流程且顺利的访问U盘呢?
正文
一、Get Max LUN请求
该class类的请求,可以使host端获得device端的LUN数量,这会为接下来的Inquiry提供上限。以下是FreeBSD中的代码流程:
当Host完成strandard request后,会去attach umass驱动,在umass_attach接口中,会初始化驱动的一些基本信息
umass_attach() ---> usbd_transfer_setup() /* 设置umass的传输方式为umass_bbb_config */ ---> sc->sc_transform = &umass_scsi_transform /* 设置传输协议为 SCSI */ ---> sc->sc_maxlun = umass_bbb_get_max_lun() /* 获取最大的 LUN */ ---> umass_cam_attach_sim() /* 注册 SIM */
static uint8_t umass_bbb_get_max_lun(struct umass_softc *sc) { struct usb_device_request req; usb_error_t err; uint8_t buf = 0; /* The Get Max Lun command is a class-specific request. */ req.bmRequestType = UT_READ_CLASS_INTERFACE; req.bRequest = UR_BBB_GET_MAX_LUN; USETW(req.wValue, 0); req.wIndex[0] = sc->sc_iface_no; req.wIndex[1] = 0; USETW(req.wLength, 1); err = usbd_do_request(sc->sc_udev, NULL, &req, &buf); if (err) { buf = 0; /* Device doesn't support Get Max Lun request. */ printf("%s: Get Max Lun not supported (%s)\n", sc->sc_name, usbd_errstr(err)); } return (buf); }二、完成Inquiry
驱动通过CBW发送Inquiry Command给设备驱动,这时候设备驱动会返回Inquiry Data给Host,Host解析数据后可以得到当前LUN的属性,包括Peripheral Device Type(PDT)、 Removable Medium Bit (RMB)、PID、VID等信息,其中PDT可以说明当前设备类型,如下图:
三、访问U盘
在第二步中,驱动已经知道那个LUN是Direct-access device了,所以我们只需要在CBW中指定LUN为当前的值即可。
四、访问CD-ROM
在访问CD-ROM时,除了需要满足U盘的一些命令外,还需要完成READ TOC指令,格式如下:
说明:USB Mass Storage驱动具体要实现那些SCSI命令,请参考usb_msc_boot_1.0.pdf
但是该文档中对data有删减,所以SCSI返回详细数据可参考SCSI Commands Reference Manual.pdf
文章结尾推荐一个比较好的博客:
1、如何实现Linux下的U盘(USB Mass Storage)驱动
——该博客详细的介绍了U盘驱动的相关基础知识,及驱动协议之间的关系
博文链接:http://blog.csdn.net/mao0514/article/details/24996553
2、Linux
USB gadget设备驱动解析(2)---驱动调试
——该文章详细的讲解了BBB传输方式下,驱动所处的状态及Wrapper的说明
文章链接:http://www.hzlitai.com.cn/article/ARM11/SYSTEM/1746.html
<<< 返回博客架构
相关文章推荐
- 如何实现Linux下的U盘(USB Mass Storage)驱动 分类: arm-linux-Ubuntu 2014-05-04 18:03 565人阅读 评论(0) 收藏
- 如何实现Linux下的U盘(USB Mass Storage)驱动
- 如何实现Linux下的U盘(USB Mass Storage)驱动
- 如何实现Linux下的U盘(USB Mass Storage)驱动
- 如何实现Linux下的U盘(USB Mass Storage)驱动
- Android [USB]如何同时打开UMS和BICR(CD-ROM)
- 如何删除/mnt/cdrom?|如何删除只读文件系统(Read-only files ystem)? failed !bh ? 挂载光盘?挂载usb?
- 如何编写Linux下的USB键盘驱动
- Linux CDROM驱动分析 - linux CDROM驱动标准
- 问题:iis配置json;结果:如何配置iis支持.json格式的文件
- 请将标为Service Pack 2 CD-ROM的光盘插入CD-ROM驱动器(D:),然后单击确定。如何解决? 在windows server 2003服务器上。
- [转帖]支持PS2和USB的键盘过滤驱动(xfocus)
- 如何在 Linux 下安装及使用 CD-ROM
- 支持 PS/2 与 USB 的键盘过滤驱动(可卸载)
- 如何编写Linux下的USB键盘驱动
- 如何检测系统中的第一个CD - ROM驱动器
- USB驱动开发之mass storage的枚举识别过程
- 如何转成libsvm支持的数据格式并做回归分析
- 如何让公共播放器支持特殊格式文件
- 如何基于android4.4.2的源码和android-4.3.1_r1的驱动编译I9250的ROM