akinchen
驱动牛犊
驱动牛犊
  • 注册日期2004-03-05
  • 最后登录2004-05-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2020回复:10

请教关于U盘的FAT实现和UFI的write()函数----尽量给分

楼主#
更多 发布于:2004-05-12 14:06
 我看了好久ufi的命令,想在u盘的fat16文件格式下实现文件夹和文件的建立,并且能在文件内记录点内容。本来以为很简单的,通过write10()的命令就能实现。可现在麻烦大,根本没有那么简单。
特别是,我应该在 write10()中的那个命令字段中填写我要写如的内容?在下面的字段中(Logical Unit Number, DPO, FUA , RelAdr,Logical Block Address,Transfer Length)的哪个字段中填写我要写入的内容呢?还是在别的地方?
各位老大帮忙啊。能给分数的,决不吝啬。
不胜感谢!!  
to be or not to be ,it is a problem
aasa2
驱动中牛
驱动中牛
  • 注册日期2004-04-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分525分
  • 威望339点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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;
}
技术交流:aasa2@21cn.com QQ群:10863699
bbiliu
驱动牛犊
驱动牛犊
  • 注册日期2004-02-20
  • 最后登录2005-01-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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 抓些包看看,就比较清楚了。
aasa2
驱动中牛
驱动中牛
  • 注册日期2004-04-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分525分
  • 威望339点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-05-12 15:19
CBW中的CBW_DataXferLen是如何计算出来的?
XferLength*512对吗?(U盘的一般使用512)
技术交流:aasa2@21cn.com QQ群:10863699
bbiliu
驱动牛犊
驱动牛犊
  • 注册日期2004-02-20
  • 最后登录2005-01-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-05-12 15:43
CBW_DataXferLen中的值是告诉usb设备主机要发送多少数据。
你要发多少就写多少了。一般为逻辑块数×逻辑块的大小(一般为512字节)
你程序中是正确的。
aasa2
驱动中牛
驱动中牛
  • 注册日期2004-04-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分525分
  • 威望339点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-05-12 15:47
好极了,我一直不敢确定,这下我心里有底了。谢谢bbiliu!
还有 Identify()是什么?
    UFI没有这个命令。 我也找了好多资料,不知道这个函数干什么?
技术交流:aasa2@21cn.com QQ群:10863699
bbiliu
驱动牛犊
驱动牛犊
  • 注册日期2004-02-20
  • 最后登录2005-01-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-05-12 15:51
没有遇到过。
你查到的话,可以告诉我一下。
aasa2
驱动中牛
驱动中牛
  • 注册日期2004-04-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分525分
  • 威望339点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
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等接口的硬盘也不起作用。除非厂商提供的驱动支持这样的功能。
技术交流:aasa2@21cn.com QQ群:10863699
akinchen
驱动牛犊
驱动牛犊
  • 注册日期2004-03-05
  • 最后登录2004-05-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-05-12 20:25
老大,那几个字段我都会,添写啊。
可我问的是
如果在特定的地方写特定的内容。
日如在某个地方,写上1234这几个数字
或者只写一个数字都可以啊
to be or not to be ,it is a problem
akinchen
驱动牛犊
驱动牛犊
  • 注册日期2004-03-05
  • 最后登录2004-05-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-05-12 20:29
基本上明白,给分。
不过希望有更深入的讨论。
谢谢各位!!
to be or not to be ,it is a problem
aasa2
驱动中牛
驱动中牛
  • 注册日期2004-04-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分525分
  • 威望339点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-05-12 20:38
那是很深层次的,估计很少用到。
我看得很多英文资料都是默认值,没有改变。
技术交流:aasa2@21cn.com QQ群:10863699
游客

返回顶部