中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » [原创]USB系列之四:向U盘上写数据
作者:
标题: [原创]USB系列之四:向U盘上写数据 上一主题 | 下一主题
whowin
初级用户





积分 134
发帖 37
注册 2006-9-28
状态 离线
『楼 主』:  [原创]USB系列之四:向U盘上写数据

原文地址:
http://hengch.blog.163.com/blog/static/1078006720086141327970

    在《USB系列之三》中,我们实现了一系列的SCSI命令,在这个系列中,我们要实现向U盘上写扇区的命令,所以,本文相对比较容易,更多地是给出一个实现的源程序。

    在《USB系列之三》中,我们实现的SCSI命令有:INQUIRY、READ CAPACITY(10)、TEST UNIT READY、REQUEST SENSE、READ(10);都是一些读出的命令,所以不会破坏U盘的内容,在文档SBC-2的第29页有一个SCSI命令的表,在这个表中列出了所有的命令,其TYPE为“M”的都是SCSI设备必须实现的命令,这些命令有:

Num    Command Name           Operation Code    Type    Reference
-----------------------------------------------------------------
1       FORMAT UNIT            04h               M        SBC-2
2       INQUIRY                12h               M        SPC-3
3       READ(6)                08h               M        SBC-2
4       READ(10)               28h               M        SBC-2
5       READ(16)               88h               M        SBC-2
6       READ CAPACITY(10)      25h               M        SBC-2
7       READ CAPACITY(16)      9Eh/10h           M        SBC-2
8       REQUEST SENSE          03h               M        SPC-3
9       SEND DIAGNOSTIC        1Dh               M        SPC-3
10      TEST UNIT READY        00h               M        SPC-3
11      WRITE(10)              2Ah               O        SBC-2

    这里面最后的一个命令并不是SBC-2中要求强制实现的,而是可选的,但如果我们不去实现,U盘的操作将失色很多;我们不打算去实现序号为1、3、5、7和9的命令,READ(6)、READ(16)和READ(10)十分相似,只是LBA的长度不同而已,如果需要实现,参考READ(10)就可以了,FORMAT和SEND DIAGNOSTIC两个命令对使用芯片的U盘来说没有什么意义,当然对硬盘是有意义的,所以在本文中,我们只需要实现一个很重要的WRTE(10),向U盘上写数据,我们需要准备一张没有有用数据的U盘,因为我们要改变其中的内容。

    WRITE(10)源代码下载地址:

    http://blog.hengch.com/source/usb-write.zip

    程序中,我们向《USB系列三》中的程序一样,先reset,然后得到最大的LUN,这个步骤不是必须的,然后我们向device发出WRITE(10)命令,注意,这是一个OUT事务,所以,CBW_FLAGS=0X00而不是像以前一样是0X80,发出WRITE(10)命令后,我们还要向device发送要写入的数据,每次64个字节,一个扇区512字节需要启动8个OUT事务,这个工作又函数putData完成,每次发送的64个字节我们分别写入了0--63,程序中,我们把这些数据写入到了LBA=100的扇区中,写入后,我们在使用在《USB系列之三》中介绍过的READ(10)命令把相同的扇区读出来,我们会看到我们所希望的结果,由于在读之前,我们已经把buffer全部清为0了,所以我们有把握相信,我们读到的数据是真实的。

    到这里,我们已经把控制U盘的主要命令都介绍完了,利用DOSUSB,我们已经有可能为U盘编写一个简单的驱动程序,但可能我们还不知道DOS下的驱动程序该如何写,从下一篇文章开始,我们将暂时放下USB系列文章,介绍一下DOS下驱动程序的写法。



DOS编程技术
2008-7-21 20:35
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
netwinxp
高级用户





积分 741
发帖 366
注册 2007-7-25
状态 离线
『第 2 楼』:  

LZ对于硬件的理解是颇有深度的。不过我们希望驱动不必居于DOSUSB,而是通过自身来完成USB Storage设备的检测和访问,否则我们自己的驱动程序就没有太多的意义了,如果LZ能对如何通过USB总线(UHCI、OHCI、EHCI)对USB设备进行检测、选择访问的设备进行较为深入的介绍,那无疑就比较完美了。

2008-7-30 09:07
查看资料  发短消息 网志   编辑帖子  回复  引用回复
whowin
初级用户





积分 134
发帖 37
注册 2006-9-28
状态 离线
『第 3 楼』:  

一般认为USB的驱动要分成三个部分,HCD(Host Controller Driver)、USBD(Universal Serial Bus Driver)和客户端驱动,DOSUSB实现了HCD和USBD,而我们要完成的只是实现客户端驱动,这样写这个《USB系列》的目的是为了减少难度,使初次接触USB的人可以很快见到成效而不至于知难而退,当然,最终目的还是要自己去实现HCD和USBD部分。
    很多事情都是这样了,当我们站在山顶的时候,会发现当初我们历尽艰辛翻过的小山是那么的渺小;当我们已经能够驾驭USB的时候,再回过头来对付HCD和USBD时,我们对USB规范的理解已经有了一定的高度,我们的自信心也已经很强,这时候会觉得HCD和USBD原来并不是很难。
    如果对此有兴趣,请关注我的网志:
    http://hengch.blog.163.com



DOS编程技术
2008-8-6 07:02
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: