阅读:20482回复:47
U盘开发成功,问题和心得
我不是常来这里,但仅有的几次给了我很大的帮助。心存感激,因此想要和大家一起分享开发的体会。我没有刻意总结U盘有关的问题,但我想有几点是大家都关心的:
(重申:希望大家都是以个人研究的目的来讨论,而不是商用化,很多商用化的问题不要来问我。呵呵) 1.选件:很重要,有些内部程序和数据空间太小的单片机是不应该用于设计U盘的。商用一般都采用专用集成芯片。作为研究,我不推荐。不过有能力的同志可以用PLD去实现,那是另外的话题了。我选用的是Cypress的EZ2131,这款芯片的好处就是很容易使存储器与操作系统之间的传输率达到1M左右,相信用9602的同志们经常会为速度问题头痛的。另外,2131的程序加载和调试都很容易。 2.开发工具:强烈推荐bushound,用它监视总线,一切问题都可以迎刃而解。加上加几个控制用的小灯泡在I/O上,根本不需要买什么开发板。 3.协议:BULK ONLY+SCSI transparent。不要过多的考虑别的协议了,如果U盘是当做硬盘来用的,UFI协议是不太合适的,RBC的针对性比较强,但我发现2000下似乎只支持SCSI Transparent,具体的我没有深究,希望大家提出意见。因为协议的选择是系统建立初期很多人绞尽脑汁的问题。其根源就在于,不明了文件系统和下层硬件之间的操作规范,这是Windows的痼疾,我们也没办法。简单说来,文件系统对于下层硬件多数情况下发送Read 10,Write 10,Read Capacity这几个命令,只要持处理好它们,基本通讯可以无误。不要去想什么Format,高级Format根本就是Read Write Verify的组合。没别的指令。 4.分区表,BPB,FAT,ROOT:分区表可以不要,但分区头部的BPB必不可少,里面有几个参数很重要,簇的大小,对于三星的Flash,一般选用16K,或者32K,你要计算一下选用不同的簇,对于FAT大小的影响。系统对于FAT的操作是1个扇区1个扇区这样来的。例如我们实现16M的U盘,最好就规定为32K的簇,这样FAT就占据一个扇区,换句话说,一个Block就行了,这样你可以不需要对FAT作缓冲,每次直接擦除FAT所在块,并写入就行。ROOT是根目录的大小,系统以8个扇区为单位进行操作。 5.数据区:数据区我不知道大家怎么处理的,如果要建立一个数据区的好坏块参数表,那比较耗费内存,如果不建立,则当系统进行非标准写(既不是标准长度的写)的情况下就会变得缓慢。典型的情况是WORD文档的修改,当你修改WORD文档的时候,系统会下发一些不标准长度的数据,这样,我们就需要备份原有块中的内容,然后再导回来,过程烦琐,速度成倍降低。当然,wo指的是在没有扩充缓冲内存的情况下。我使用的2131只有2K左右的数据内存可用。因此很难实现大容量缓冲。我采用用FLASH进行中转的方式,但速度较慢。 6.地址转换:系统下发的LBA与你提供给系统的BPB参数有关。检测一下BUS HOUND你就可以很明确地了解了。这个问题很容易解决。 下面我说说我的成果和所遇到的难题: 我用2131有限的8K PRAM和2K DRAM实现了具有两个功能的USB client。其中一个就是U盘,代码量大约占据了0x0000-0x1800,6K左右的字节。基本上没有采用任何形式的数据缓冲。接口模式采用2131的Fast Write 和Fast Read。最终U盘的大块读写速度都很快,将近1M,和专用芯片没什么区别,甚至更快,得益于2131的出色性能。 困扰我的问题有: 1.怎样处理系统格式化,这是一个典型的因为Flash和单片机的缘故需要开发者采用底层协议控制上层协议的例子。我必需控制系统不让它格式化,因为格式化会破坏原有的U盘参数。Win2000最可恶,提供用户一堆格式化形式(FAT16,FAT32,NTFS),多数都会将U盘格式化到8K以下的簇,这很可怕,意味着每次都需要缓冲16K的数据。请问高手,什么硬盘参数可以控制系统格式化的形式? 2.怎样处理小于簇长度的写入请求,刚才说过WORD修改就是一个例子,它下发小于32K(簇长度)的写入请求,且是在数据区。我们不可能只为一个扇区分配一个块,因此只能作中转,中转是影响U盘速率的罪魁祸首。请问大家是怎么解决这个问题的。当然,扩充外部内存可以解决,但系统提及就会增大,外部缓冲内存和Flash的交互怎么办?增加DMAC么?如果不增加,速度也不乐观啊! 上面是我开发过程中的体会和问题,希望大家给予意见,我的email是nuxifish00@mails.tsinghua.edu.cn,欢迎大家来信和我讨论,因为都是课余爱好,旨在学术研讨,因此商业团体就别来询问了,我这套方案绝对不适合商业推广。呵呵! 再声明一点:做U盘和U Disk不一样,后者容易得多,因为没有Block的限制。我觉得开发过程中最扼我脖子的就是这个16KBlock限制。:) |
|
沙发#
发布于:2003-06-04 21:11
提倡大家相互学习和交流
work together to build the future! |
|
板凳#
发布于:2003-06-04 22:06
good job!
4.分区表,BPB,FAT,ROOT:分区表可以不要,但分区头部的BPB必不可少,里面有几个参数很重要,簇的大小,对于三星的Flash,一般选用16K,或者32K,你要计算一下选用不同的簇,对于FAT大小的影响。系统对于FAT的操作是1个扇区1个扇区这样来的。例如我们实现16M的U盘,最好就规定为32K的簇,这样FAT就占据一个扇区,换句话说,一个Block就行了,这样你可以不需要对FAT作缓冲,每次直接擦除FAT所在块,并写入就行。ROOT是根目录的大小,系统以8个扇区为单位进行操作。 2.什么硬盘参数可以控制系统格式化的形式? 格式化实际上就是一个WRITE10命令,写到开始的几个block, 因此,我认为,只要简单的过滤一下命令,把写到开始的那几个 BLOCK的数据稍做处理就可以控制。 3.那里又关于分区表的资料?我一直再找,有的话劳烦给我一份。 ksnet2000@21cn.com |
|
地板#
发布于:2003-06-05 09:38
分区表的看FAT,有很多资料
|
|
地下室#
发布于:2003-06-06 18:02
先置顶
大家觉得是放在usb版置顶好,还是放到整个bbs的精华区好? |
|
|
5楼#
发布于:2003-06-07 09:56
但是bpb表的参数实际上好像会被操作系统修改的哦,而且在98和2k下的参数是不一样的--格式化后
|
|
6楼#
发布于:2003-06-07 18:43
哦,我也正在为format and write data less than 32K 烦恼。
我想如果是对pbr的写入,我应该强迫写入某些固定的数值,以免破坏我得硬盘参数。但是这样就会带来verify的问题。我想采用欺骗pc的办法。 还有,如果我把一簇定义为一个block,目的是避免捣腾数据。那么怎样才能避免出现小于一个block数据的下载。 |
|
7楼#
发布于:2003-06-08 14:07
这个帖子很有价值。建议斑竹两个地方都放吧。让多些人可以看到
|
|
|
8楼#
发布于:2003-06-08 16:52
学习!
|
|
9楼#
发布于:2003-06-10 00:09
这个帖子很有价值。建议斑竹两个地方都放吧。让多些人可以看到 只能放一个地方啊!遗憾........... |
|
|
10楼#
发布于:2003-06-10 14:17
那。。。。自私点,就放在顶上吧 ;)
|
|
|
11楼#
发布于:2003-06-15 10:48
好好学习珍贵经验,非常感谢!
|
|
|
12楼#
发布于:2003-06-16 09:01
不错,慢慢消化!
|
|
13楼#
发布于:2003-06-16 13:15
我也做这个交个朋友吧
QQ42814055 |
|
14楼#
发布于:2003-06-16 13:18
固顶吧
|
|
15楼#
发布于:2003-06-18 16:03
你做的是不能格式化的u盘。采取块的搬迁,让系统来完成格式化(FAT,FAT32,NTSF),可做各种格式化。还有,如果你比较一下SISI,SFF-8070i和UFI命令,会发现其惊人的类似。
|
|
16楼#
发布于:2003-06-18 20:12
其实使用块中继,可以让程序变得更加简单。但是这是要消耗内存的,所以。。。我讲了,不一定每个人选片的时候都考虑得那么周全,一旦系统资源出了问题,还得做下去怎么办?我的办法也仅仅是个折衷的解决方法而已。
|
|
17楼#
发布于:2003-06-20 15:53
我想请问bushound这个软件在那里可以下载?
|
|
|
18楼#
发布于:2003-06-27 22:43
谢谢你的心得。
能否介绍一下bushound这个工具?谁开发的?针对什么用的? |
|
19楼#
发布于:2003-07-02 15:51
好阿,提倡相互学习阿
|
|
|
上一页
下一页