在《USB系列之三》中,我們實(shí)現(xiàn)了一系列的SCSI命令,在這個(gè)系列中,我們要實(shí)現(xiàn)向U盤(pán)上寫(xiě)扇區(qū)的命令,所以,本文相對(duì)比較容易,更多地是給出一個(gè)實(shí)現(xiàn)的源程序。
在《USB系列之三》中,我們實(shí)現(xiàn)的SCSI命令有:INQUIRY、READ CAPACITY(10)、TEST UNIT READY、REQUEST SENSE、READ(10);都是一些讀出的命令,所以不會(huì)破壞U盤(pán)的內(nèi)容,在文檔SBC-2的第29頁(yè)有一個(gè)SCSI命令的表,在這個(gè)表中列出了所有的命令,其TYPE為“M”的都是SCSI設(shè)備必須實(shí)現(xiàn)的命令,這些命令有:
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 |
這里面最后的一個(gè)命令并不是SBC-2中要求強(qiáng)制實(shí)現(xiàn)的,而是可選的,但如果我們不去實(shí)現(xiàn),U盤(pán)的操作將失色很多;我們不打算去實(shí)現(xiàn)序號(hào)為1、3、5、7和9的命令,READ(6)、READ(16)和READ(10)十分相似,只是LBA的長(zhǎng)度不同而已,如果需要實(shí)現(xiàn),參考READ(10)就可以了,F(xiàn)ORMAT和SEND DIAGNOSTIC兩個(gè)命令對(duì)使用芯片的U盤(pán)來(lái)說(shuō)沒(méi)有什么意義,當(dāng)然對(duì)硬盤(pán)是有意義的,所以在本文中,我們只需要實(shí)現(xiàn)一個(gè)很重要的WRTE(10),向U盤(pán)上寫(xiě)數(shù)據(jù),我們需要準(zhǔn)備一張沒(méi)有有用數(shù)據(jù)的U盤(pán),因?yàn)槲覀円淖兤渲械膬?nèi)容。
WRITE(10)源代碼下載地址:
http://blog.hengch.com/source/usb-write.zip
程序中,我們向《USB系列三》中的程序一樣,先reset,然后得到最大的LUN,這個(gè)步驟不是必須的,然后我們向device發(fā)出WRITE(10)命令,注意,這是一個(gè)OUT事務(wù),所以,CBW_FLAGS=0X00而不是像以前一樣是0X80,發(fā)出WRITE(10)命令后,我們還要向device發(fā)送要寫(xiě)入的數(shù)據(jù),每次64個(gè)字節(jié),一個(gè)扇區(qū)512字節(jié)需要啟動(dòng)8個(gè)OUT事務(wù),這個(gè)工作又函數(shù)putData完成,每次發(fā)送的64個(gè)字節(jié)我們分別寫(xiě)入了0--63,程序中,我們把這些數(shù)據(jù)寫(xiě)入到了LBA=100的扇區(qū)中,寫(xiě)入后,我們?cè)谑褂迷凇禪SB系列之三》中介紹過(guò)的READ(10)命令把相同的扇區(qū)讀出來(lái),我們會(huì)看到我們所希望的結(jié)果,由于在讀之前,我們已經(jīng)把buffer全部清為0了,所以我們有把握相信,我們讀到的數(shù)據(jù)是真實(shí)的。
到這里,我們已經(jīng)把控制U盤(pán)的主要命令都介紹完了,利用DOSUSB,我們已經(jīng)有可能為U盤(pán)編寫(xiě)一個(gè)簡(jiǎn)單的驅(qū)動(dòng)程序,但可能我們還不知道DOS下的驅(qū)動(dòng)程序該如何寫(xiě),從下一篇文章開(kāi)始,我們將暫時(shí)放下USB系列文章,介紹一下DOS下驅(qū)動(dòng)程序的寫(xiě)法。