在《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下驱动程序的写法。

USB系列之四:向U盘上写数据的更多相关文章

  1. 初识Redis系列之四:.net使用Redis存储数据

    首先Redis在Windows上的安装前面的文章已经介绍过,这里不介绍了,直奔主题, 直接来看看.net怎么使用Redis 首先需要引用redis相关的dll,两个途径,意识网上下载编译好的dll : ...

  2. 通过FSDataOutputStream向HDFS上写数据

    FSDataOutputStream,这个类重载了很多write方法,用于写入很多类型的数据:比如字节数组,long,int,char等等. 像FSDataInputStream一样,要获得FSDat ...

  3. USB系列之六:基于DOSUSB的简单U盘驱动程序

    首先要说明的是,该驱动程序仅实现了部分块设备的功能,如果作为成品软件使用,会感觉性能比较差,而且有些功能(比如FORMAT)是不能完成的,发表此驱动程序的目的旨在说明USB的编程原理以及DOS下驱动程 ...

  4. USB系列之八:透过ASPI执行SCSI命令

    在<USB系列之七>里我们介绍了ASPI的规范,并对一系列ASPI的命令做了测试,其中的02号命令是执行SCSI命令,我们专门在这篇文章中介绍,在<USB系列七>中,我们已经了 ...

  5. USB系列之五:用汇编实现的一些USB功能

    前面的USB系列一至四,实现了我们需要的一些USB功能,但都是用C语言的32位代码,之后我们插进了三篇关于DOS下设备驱动程序的文章,我们现在应该清楚,当我们要在DOS下写一个U盘的驱动时,最好使用汇 ...

  6. USB系列之九:基于ASPI的U盘驱动程序

    USB系列之七和之八介绍了ASPI,并通过一些实例说明了基于ASPI的编程方法,本文使用前两篇文章介绍的知识以及以前介绍的有关DOS驱动程序下驱动程序的内容实际完成一个简单的基于ASPI的U盘驱动程序 ...

  7. USB系列之三:从你的U盘里读出更多的内容

    U盘是我们最常使用的一种USB设备,本文继续使用DOSUSB做驱动,试图以读取扇区的方式读取你的U盘.本文可能涉及的协议可能会比较多. 一.了解你的U盘    首先我们用上一篇文章介绍的程序usbvi ...

  8. 接口的多态使用; 接口应用实例:U盘、打印机可以使用共同的USB接口,插入到电脑上实现各自的功能。

    接口的多态使用 接口应用实例:U盘.打印机可以使用共同的USB接口,插入到电脑上实现各自的功能.

  9. 【智能无线小车系列八】在树莓派上使用USB网卡

    在这个腾“云”驾“物”(云:云计算,物:物联网)的时代,什么都可以没有,就是不能没有网络,树莓派也离不开它.本章节将详细介绍如何将树莓派接入互联网,因为有一些后期将要使用到的小软件需要联网进行下载和安 ...

随机推荐

  1. poj2409 Let it Bead

                                                                      Let it Bead Time Limit: 1000MS   M ...

  2. VS2010下测试程序性能瓶颈

    之前看到Qt的有个BUGreport https://bugreports.qt-project.org/browse/QTBUG-13182 这个BUG是在windows下QFileDialog很慢 ...

  3. uniq详解

    一.简介 报告或删除文件中重复的行. uniq 命令读取由 InFile 参数指定的标准输入或文件.该命令首先比较相邻的行,然后除去第二行和该行的后续副本.重复的行一定相邻.(在发出 uniq 命令之 ...

  4. 数据结构之单链表,c#实现

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  5. Find Successor & Predecessor in BST

    First, we use recursive way. Successor public class Solution { public TreeNode inorderSuccessor(Tree ...

  6. Hive 8、Hive2 beeline 和 Hive jdbc

    1.Hive2 beeline  Beeline 要与HiveServer2配合使用,支持嵌入模式和远程模式 启动beeline 打开两个Shell窗口,一个启动Hive2 一个beeline连接hi ...

  7. 【转】手机web——自适应网页设计(html/css控制)

    手机web——自适应网页设计(html/css控制) 就目前形势来看,Web App 正是眼下的一个趋势和潮流,但是,对于Web App的设计可能大家有的不是很了解,下面就将整理好的网页设计的技巧奉献 ...

  8. CLR via C# - 基础拾遗

    编译器开关设置 IL代码质量 JIT本地代码质量 /optimize- /debug-(默认设置) 未优化 优化 /optimize- /debug+(full/pdbonly) 未优化 未优化 /o ...

  9. django的Model 模型中常用的字段类型

    常用的字段类型: AutoField:自增长字段,通常不用,如果未在Model中显示指定主键,django会默认建立一个整型的自增长主键字段 BooleanField:布尔型,值为True或False ...

  10. iOS开发-单例模式的解读

    现在网上的有很多人写单例模式,一个很基本的东西但是版本也有很多,新人看了难免有些眼花缭乱的感觉.自己最新比较闲,也过来写一些自己的心得. 在往下看之前,我们要明白一点,那就是在什么情况下我们才要用到单 ...