打印

U盘开发

[复制链接]
7506|44
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zmbnj|  楼主 | 2007-5-22 12:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
古道热肠| | 2007-5-22 12:55 | 只看该作者

U盘其实很简单

   U盘插入电脑USB口后,首先枚举成大容量存储设备,枚举成功后就只用读和写两条SCSI指令进行通讯了。
   用到的指令定义如下:

#define Inquiry                            0x12
#define    Mode_Sense                        0x1A
#define    Read10                            0x28
#define Read_Capacity                     0x25 
#define Read_Format_Capacities             0x23 
#define Test_Unit_Ready                 0x00 
#define Verify                             0x2F 
#define Write10                         0x2A 
#define Medium_Removal                    0x1E

#define SCSI_MSPGCD_TPP                    0x1C
#define SCSI_MSPGCD_RETALL                0x3F

使用特权

评论回复
板凳
zmbnj|  楼主 | 2007-5-23 11:14 | 只看该作者

谢谢 古道热肠

Read_Capacity和Read_Format_Capacities的容量是从哪来的?刚开始的时候,自己定的?
还有等效的SHC是怎么告诉主机的?

使用特权

评论回复
地板
zmbnj|  楼主 | 2007-5-23 14:27 | 只看该作者

^-^

小弟还没全想通,非常感谢古道热肠!
Read_Capacity给出了主机寻址的范围,而不管实际大小如何,对吗?
U盘出厂前要低格之类的吗?0磁头1柱面1扇区是DBR,怎么定位到哪一块?

使用特权

评论回复
5
古道热肠| | 2007-5-23 15:22 | 只看该作者

要实战才能彻底整明白

  多思考、多提问也是值得提倡的。
  U盘的容量是由U盘的代码给它设定的,PC发Read_Capacity命令,就能知道这个U盘到底有多大了,我写的Demo是1.44M(仿真软驱),当然可以设置成2M,但最大不能超过物理介质存储容量。
  PC发读0扇区内容时,U盘必须响应,并将0扇区的内容原样送给PC机,你用软件对U盘按自已格式格式化后,能读写。
  但在PC上一旦格式化,就会提示你数据格式不对,是否低格,如果执行低格,此时0扇区的内容就由PC生成,U盘没有主动权了。
  U盘的所有空间对PC透明的,除非你隐藏了扇区,那PC当然不能访问到。
  0扇区的定位由U盘的程序定位。

使用特权

评论回复
6
zmbnj|  楼主 | 2007-5-23 15:53 | 只看该作者

---

谢谢古道热肠,实战中……

使用特权

评论回复
7
古道热肠| | 2007-5-23 16:04 | 只看该作者

好呀!最难整的还在后头呢。

  用什么环境做的U盘,最难弄的是1包数据512字节要分好几次收发,要设置好标置,采用状态机会容易些。

使用特权

评论回复
8
zmbnj|  楼主 | 2007-5-24 09:50 | 只看该作者

公司自己的一个芯片

ram不够,是要分好几次收发。
古道热肠,我现在对MBR还不时很明白,搞了好几天了。
我读写等程序框架都编好了,可是新的flash都是空的,第一个512字节MBR也是空的,而在格式化的时候,需要知道DBR的位置,所以老出错。
新U盘的MBR要先写进去吗?还是要进行所谓的低格??一般低格软件会发些什么命令?
大哥,指点指点!

使用特权

评论回复
9
平常人| | 2007-5-24 10:14 | 只看该作者

只要Read_Capacity报告正确,存储空间可以为空,PC可以格式化

Windows的格式化过程可以帮你写入需要的内容。

使用特权

评论回复
10
zmbnj|  楼主 | 2007-5-24 10:25 | 只看该作者

谢谢平常人,不过还是不解!

Read_Capacity给出了地址的范围,0x00---某个值。
我就是这么做的,我测到的数据显示,主机读写0x00和最后一个地址,然后就是写fat表之类的,不过一个好的U盘,读写的是DBR和最后一个地址,最后再修改MBR,就完了,而我到最后没地方修改MBR。

使用特权

评论回复
11
古道热肠| | 2007-5-24 10:28 | 只看该作者

U盘可以不分区,只用DBR就行了。

  DBR的分配以及逻辑扇区到循环地址的变换是由你自已程序管理的,Windows要0扇区的数据,你定位到888块,它也没意见。
  DBR的数据我是自已写了个低格程序,让单片机跑一下,0扇区的原始数据就生成了。
  做U盘单片机的SRAM最少也得512ByteSRAM,太少了收发缓冲区都做不出来,哪来的速度。
  自已公司做芯片,不错哟,多问问高手吧!
  老整不出来,买个U盘评估板或MP3评估板看看源代码会很快解决问题的。搞单片机也要引进与自力更生相结合,等起把大**做出来了,仗都打完了,还有什么用。

使用特权

评论回复
12
zmbnj|  楼主 | 2007-5-24 11:19 | 只看该作者

不零买U盘,所以快慢无所谓。

就是说反正得想办法把0扇区的数据搞进去了!
有评估板。
谢谢古道热肠!

使用特权

评论回复
13
zmbnj|  楼主 | 2007-5-29 15:38 | 只看该作者

Inquiry

我参考了一些实例,Inquiry命令的前四个字节一般有两种,
0x00,0x80,0x00,0x01或0x00,0x80,0x02,0x02,自己在做的时候,两种都试了,但不知道有什么区别,那位大侠解释一下。
我用的Bulk-only与SCSI协议

使用特权

评论回复
14
gyt| | 2007-5-29 19:17 | 只看该作者

厉害

古版原来是U盘专家。厉害!

使用特权

评论回复
15
古道热肠| | 2007-5-30 10:53 | 只看该作者

整出个标准U盘,是要费不少心血

    专家谈不上,只是要想用自已的USB接口做U盘的话,要读懂协议,要会调试工具,还要有参考Demo板,不然很难成功。
    

使用特权

评论回复
16
computer00| | 2007-5-30 11:04 | 只看该作者

你可以看看我做的“假U盘”,里面的MBR和DBR都是用数组模拟

使用特权

评论回复
17
gyt| | 2007-5-30 11:13 | 只看该作者

厉害

不错不错

使用特权

评论回复
18
古道热肠| | 2007-5-30 11:29 | 只看该作者

oo的U盘速度如何?

   我做的U盘,用AT45DB161B作存储介质,D12作USB接口,速度最大也就100K以下,用电脑取U盘数据播放MP3,64K数据流比较顺畅,128K的数据流会停顿,速度很难提高。

使用特权

评论回复
19
computer00| | 2007-5-30 12:25 | 只看该作者

这个我没测试过速度, 不过另外一个挂硬盘的测试过速度

使用特权

评论回复
20
zmbnj|  楼主 | 2007-6-2 14:15 | 只看该作者

作为一个普通的U盘

modesense返回一些什么值?
有没有一些参数一定要返回的?
哪位大虾帮帮忙.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

37

主题

143

帖子

1

粉丝