阅读:2021回复:10
请教关于U盘的FAT实现和UFI的write()函数----尽量给分
我看了好久ufi的命令,想在u盘的fat16文件格式下实现文件夹和文件的建立,并且能在文件内记录点内容。本来以为很简单的,通过write10()的命令就能实现。可现在麻烦大,根本没有那么简单。
特别是,我应该在 write10()中的那个命令字段中填写我要写如的内容?在下面的字段中(Logical Unit Number, DPO, FUA , RelAdr,Logical Block Address,Transfer Length)的哪个字段中填写我要写入的内容呢?还是在别的地方? 各位老大帮忙啊。能给分数的,决不吝啬。 不胜感谢!! |
|
|
沙发#
发布于:2004-05-12 14:43
我自己写的.不一定对,大家也可以看一看
/* PARA. FOR READ/WRITE/FORMAT para[1]=feature para[2]=Sector Count para[3]=Sector Number(LBA 7-0) para[4]=Cylinder Low (LBA 15-8) para[5]=Cylinder High (LBA 23-16) para[6]=Head (LBA 27-24) BX=Adress of Buffer */ unsigned char CF_WRITE() { MassStorageCBW.dCBW_Signature=CBW_SIGNATURE; MassStorageCBW.dCBW_Tag=0x60a624de; MassStorageCBW.dCBW_DataXferLen=para[2]*512; MassStorageCBW.bCBW_Flag=0x00; MassStorageCBW.bCBW_LUN=0; MassStorageCBW.bCBW_CDBLen=sizeof(WRITE_RBC);//0x0C ///////////////////////////////////////////////// MassStorageCBW.cdbRBC.WRITE_RBC.OperationCode=write10; MassStorageCBW.cdbRBC.WRITE_RBC.VendorSpecific=0; MassStorageCBW.cdbRBC.WRITE_RBC.LBA.LBA_W8.LBA_3=para[6]; MassStorageCBW.cdbRBC.WRITE_RBC.LBA.LBA_W8.LBA_2=para[5]; MassStorageCBW.cdbRBC.WRITE_RBC.LBA.LBA_W8.LBA_1=para[4]; MassStorageCBW.cdbRBC.WRITE_RBC.LBA.LBA_W8.LBA_0=para[3]; MassStorageCBW.cdbRBC.WRITE_RBC.Reserved=0; MassStorageCBW.cdbRBC.WRITE_RBC.XferLength=para[2]; MassStorageCBW.cdbRBC.WRITE_RBC.Reserved1[0]=0; MassStorageCBW.cdbRBC.WRITE_RBC.Reserved1[1]=0; MassStorageCBW.cdbRBC.WRITE_RBC.Reserved1[2]=0; //////////////////////////////////////////// if(!BULK_Transfer_OUT((unsigned char *)&MassStorageCBW,sizeof(MassStorageCBW))) return FALSE; DelayMs(15); if(!BULK_Transfer_OUT(BX,512))// return FALSE; //DelayMs(10); if(!BULK_Transfer_IN((unsigned char *)&MassStorageCSW,13)) return FALSE; return TRUE; } |
|
|
板凳#
发布于:2004-05-12 15:07
你实现的是usb host吗?
如果是ufi的命令那么,Logical Unit Number, DPO, FUA , RelAdr几个字段应该填0,Logical Block Address应该填写你要写入的逻辑块的地址(扇区号),Transfer Length为要写入的块数(逻辑块数),至于逻辑块地址是多少,当然要从你的fat表中查找。 填写完后,形成CBW的请求包,发送到usb device,然后发送你要写入的数据到usb device 就可以了。 看看ufi协议,然后用bushound 抓些包看看,就比较清楚了。 |
|
地板#
发布于:2004-05-12 15:19
CBW中的CBW_DataXferLen是如何计算出来的?
XferLength*512对吗?(U盘的一般使用512) |
|
|
地下室#
发布于:2004-05-12 15:43
CBW_DataXferLen中的值是告诉usb设备主机要发送多少数据。
你要发多少就写多少了。一般为逻辑块数×逻辑块的大小(一般为512字节) 你程序中是正确的。 |
|
5楼#
发布于:2004-05-12 15:47
好极了,我一直不敢确定,这下我心里有底了。谢谢bbiliu!
还有 Identify()是什么? UFI没有这个命令。 我也找了好多资料,不知道这个函数干什么? |
|
|
6楼#
发布于:2004-05-12 15:51
没有遇到过。
你查到的话,可以告诉我一下。 |
|
7楼#
发布于:2004-05-12 16:00
网上有这样一段对话
可以参考一下。 Q 我注意到ATA/ATAPI里,以及DiskID32里,有一个“IDENTIFY PACKET DEVICE”指令,与“IDENTIFY DEVICE”有什么区别? A IDENTIFY DEVICE专门用于固定硬盘,而IDENTIFY PACKET DEVICE用于可移动存储设备如CDROM、CF、MO、ZIP、TAPE等。因为驱动程序的原因,实际上用本例的方法,不管是IDENTIFY DEVICE也好,IDENTIFY PACKET DEVICE也好,获取可移动存储设备的详细信息,一般是做不到的。而且除了IDE硬盘,对SCSI、USB等接口的硬盘也不起作用。除非厂商提供的驱动支持这样的功能。 |
|
|
8楼#
发布于:2004-05-12 20:25
老大,那几个字段我都会,添写啊。
可我问的是 如果在特定的地方写特定的内容。 日如在某个地方,写上1234这几个数字 或者只写一个数字都可以啊 |
|
|
9楼#
发布于:2004-05-12 20:29
基本上明白,给分。
不过希望有更深入的讨论。 谢谢各位!! |
|
|
10楼#
发布于:2004-05-12 20:38
那是很深层次的,估计很少用到。
我看得很多英文资料都是默认值,没有改变。 |
|
|