问个nand flash分区表的问题

Sniper167 2006-08-20 06:47:29
偶的nand flash分四个区,分别是vivi,kernel,root,user
在vivi里面可以读出分区表
可是进入控制台后,用fdisk -l看不到分区信息
在内核启动的时候也读不出分区表,提示说放分区表那块是坏块
偶就纳闷啊,都是同一个地方,为啥vivi就能读出来,而内核却说那块是坏快呢

另外再问个问题
在PC上,硬盘的分区是 /dev/hda1 /dev/hda2 ……

请问在nand flash上,分区又是什么呢? /dev/???
我看到sd卡的是 /dev/sda1
...全文
1097 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sniper167 2006-08-26
  • 打赏
  • 举报
回复
多谢楼上指点

0 vivi 192K kernel 1M 应用程序(cramfs) 63M 空闲(FAT) 127M partition table 128M

我的nand flash分区如上 我只把63M到127M这段64M大的空间用来做U盘,上面的文件系统我准备把他做成FAT格式的

我现在开始啃USB协议了 多谢你的指点
JerryWang2000 2006-08-26
  • 打赏
  • 举报
回复
remark
tb01412 2006-08-25
  • 打赏
  • 举报
回复
LZ可以用以下四个步骤来实现:
1.理解USB协议,LZ要开发的是一个usb client设备,就是所谓的固件程序,可以参阅USB固件开发相关的书来深入理解USB协议,也就是可以实现第一个功能,让你的PC机出现"已发现新硬件"之类的提示
2.理解USB中的MASS-STARAGE协议,也就是所谓的U盘所使用的协议,主机端的协议都由操作系统所提供了,比如WINDOWS与LINUX都带有U盘设备驱动程序.这一步就需要深入理解USB中MASS-STARAGE协议,也可以参阅一些USB固件开发方面的书,实现了这一步,就会在PC端看到"驱动已安装,你可以使用该设备了"之类的提示
3.理解一种文件系统,比如在WINDOWS上所支持的U盘,一般都要求U盘上能理解FAT16(或者FAT32)文件系统,主机端识别到设备一是个U盘时,当用户通过read函数操作U盘上的文件,实际上最终由驱动转识别相应的文件系统,发出对实际物理扇区的读写要求,所以固件程序就需要理解FAT文件系统的组织方式,这也是一种最常用的组织方式,如果是在LINUX上,LINUX主机还会识别N种文件系统,包括EXT2/EXT3等,这个时候,你的固件程序可以做成非FAT文件系统,到这一步,会出现冲突,如果你的固件程序是写在设备上所运行的LINUX系统之上,而此系统上又是按YAFFS或者是CRAMFS之类的文件系统格式,就很麻烦了,你的程序需要充当FAT与YAFFS之间的转换功能,这几乎无法实现,所以这一步,你完全可以在设备LINUX程序中申请一块内存,来虚拟FAT文件系统,从而完成主机端发过来的关于物理扇区方面的读写请求,到这里,你需要深入理解FAT文件系统,完成这一步之后,就会在主机端看到你所虚拟出的文件或者目录了
4.真正完成实用的功能:由于你在设备端是运行在LINUX上,所以无法直接按物理扇区操作设备,就需要在你的LINUX上实现一个驱动,然后再写一个应用程序,那个应用程序首先实现USB协议,让主机端出现"已发现新硬件",接下来再实现MASS-STARAGE协议,让你的PC端出现"已安装完驱动程序",然后再实现主机端发过来的按实际物理扇区读写的要求,把这种要求结合驱动操作实际的存储器,这一步,要深入理解驱动程序,存储器,文件系统组织方式,说起来容易,做起来太难了!!!!!

最后,如果你想要让你的板子上运行LINUX,又要让它当作一个U盘的话,难度是可想而知的!!!!如果仅是为了实现功能,可以提供两种方案给LZ参考:
1.让你的设备不运行LINUX,而是直接用ADS之类的开发平台开发一个小型固件程序,就相当于做一个你普通U盘上所运行的小程序一样,那个程序在专业上被称为"固件",这方面的开发书籍也有,可以参照着做一个,最终你的设备就是一个U盘,你可以让你的设备当作两种系统,在某种情况下运行操作系统,在另一种情况下就作为U盘,比如设一个跳线,用硬件的方式让你的程序进入两个流程,比如你的程序在最初运行时就去判断某个IO,如果为高位,就启动固件程序,反之则启动VIVI BOOT之类,从而进入到LINUX
2.让你的设备不通过MASS-STARAGE协议,在主机端另外实现一个驱动与一个应用程序,自己设定一个协议,类似于你最初的设想,主机端应用程序点击某个按钮的时候就向下发出一个命令,而设备端响应这个命令,把数据传给主机端,在主机端的主要工作就是实现一个应用程序,将用户的需求转换成自己的一套协议,再实现一个USB主机端驱动,把基于这套协议下的数据请求通过USB协议向下传递,而在设备端实现一个应用程序与一个驱动,驱动主要与主机端的USB协议通信,完成收发数据,而应用程序就完成将原始数据翻译成自己的协议,进行操作,比如主机发出一个请求根目录下所有目录,此时在设备端就把这个命令解析出来,然后利用LINUX下的函数,扫描出根目录下的所有文件,再封装协议,把这些数据交给USB驱动,向主机端发送回去就OK了!!!!
Sniper167 2006-08-23
  • 打赏
  • 举报
回复
我用usbview看了下,结果如下
Device Descriptor:
bcdUSB: 0x0000
bDeviceClass: 0x00
bDeviceSubClass: 0x00
bDeviceProtocol: 0x00
bMaxPacketSize0: 0x00 (0)
idVendor: 0x0000
idProduct: 0x0000
bcdDevice: 0x0000
iManufacturer: 0x00
iProduct: 0x00
iSerialNumber: 0x00
bNumConfigurations: 0x00

ConnectionStatus: DeviceFailedEnumeration
Current Config Value: 0x00
Device Bus Speed: Low
Device Address: 0x00
Open Pipes: 0
---------------------------
请问要在linux里面作些什么才能让在pc上运行的usbview检测到开发板呢
Sniper167 2006-08-23
  • 打赏
  • 举报
回复
再补充一下
现在我的开发板通过usb接上电脑(windows xp),pc提示无法识别的usb设备
是否要先再开发板上做些什么东东才能让pc识别这个usb设备呢?

tb01412(tb) 记得去接分哈 不然浪费咯
Sniper167 2006-08-23
  • 打赏
  • 举报
回复
多谢 tb01412(tb)
再请教个问题

我要在pc上通过usb访问开发板上的nand flash
偶的最终目标是要做到:把开发板通过usb连到pc上(windows xp),在pc端可以对开发板的nand flash进行读、写、删除等操作

也就跟mp3一样,通过usb连上电脑,可以在电脑上往mp3里面拷歌、删歌等

可我发现现在大多mp3在windows xp下不需要驱动呀
我的开发板通过usb连在电脑上,电脑显示无法识别的usb设备

PC <----------USB---------> 开发板
windows xp <----------USB---------> Linux
USB Host <----------USB---------> USB Device
驱动A <----------USB---------> 驱动B <-------> nand flash驱动

是否要在开发板上把OHCI配置成usb device呢?
我是这样想的
在PC端写个驱动程序A,主要用来识别USB Device设备类型,获得厂商ID、设备ID啥的
然后在开发板写个驱动程序B,用来响应pc端发来的命令,并且这个程序是和nand flash的驱动是挂在一起的,即驱动B收到pc端发来的信号为read,则此程序就调用nand flash的read函数呢?

再次感谢 tb01412(tb) 的回复,另外麻烦你去这个帖子接分哈,我这个贴只开了50 ^_^
http://community.csdn.net/Expert/topic/4943/4943491.xml?temp=.9728205
tb01412 2006-08-22
  • 打赏
  • 举报
回复
应该是/dev/mtd/3,不过这是按原始的方法写数据,而不是按文件的方式写,如果使用文件的方式写,还需要先对/dev/mtd/3设备进行格式化!!!!还要提供相应分区的文件系统驱动
Sniper167 2006-08-21
  • 打赏
  • 举报
回复
偶的一些信息
# cat mtd
dev: size erasesize name
mtd0: 00100000 00004000 "kernel"
mtd1: 03b00000 00004000 "root"
mtd2: 00300000 00004000 "jffs2"
mtd3: 04000000 00004000 "user"

# fdisk -l
fdisk: No such file or directory

# cd /dev/mtd
# ls -l
crw-rw-rw- 1 0 0 90, 0 Jan 1 1970 0
crw-rw-rw- 1 0 0 90, 1 Jan 1 1970 0ro
crw-rw-rw- 1 0 0 90, 2 Jan 1 1970 1
crw-rw-rw- 1 0 0 90, 3 Jan 1 1970 1ro
crw-rw-rw- 1 0 0 90, 4 Jan 1 1970 2
crw-rw-rw- 1 0 0 90, 5 Jan 1 1970 2ro
crw-rw-rw- 1 0 0 90, 6 Jan 1 1970 3
crw-rw-rw- 1 0 0 90, 7 Jan 1 1970 3ro
# cd /dev/mtdblock/
# ls -l
brw-rw-rw- 1 0 0 31, 0 Jan 1 1970 0
brw-rw-rw- 1 0 0 31, 1 Jan 1 1970 1
brw-rw-rw- 1 0 0 31, 2 Jan 1 1970 2
brw-rw-rw- 1 0 0 31, 3 Jan 1 1970 3

在pc上,比如我要操作d盘,则路径是 d:\
请问在开发板上,我要操作user分区,路径怎么写呢? /dev/mtd/3 还是 /dev/mtdblock/3
这个mtd跟mtdblock有什么区别呢 是否是mtd下又分mtdblock呢,即mtd是由mtdblock组成?

请大家指教 谢谢
tb01412 2006-08-20
  • 打赏
  • 举报
回复
vivi所认识的分区并不是我们所说的传统意义上的分区!!!!
当VIVI将你的分区映像文件下载到FLASH上去后,从那个开始写入的地址入就是根文件系统的挂载点了,VIVI将这个挂载点传递给内核,内核挂载根文件系统需要的是两个信息,一是挂载地址,另一种就是文件系统自身组织的形式,而那个文件系统自身组织的形式已经在PC机端通过构造文件系统的方式组织好了,挂载地址通过VIVI传给了内核,所以内核就不需要更多的信息,最后当内核启动完成之后,通过相应的MTD驱动与文件系统驱动(比如用yaffs文件系统时,需要将这个包从网上下载,更好,编译进内核)共同驱动你的FLASH设备,至少在VIVI下没有检测出现坏块,而在LINUX中检测出了坏块,一定是你的某个驱动出现了问题,要么就是VIVI的FLASH驱动,要么就是LINUX内部的FLASH驱动出了问题(LINUX内部的FLASH驱动是在相应的文件系统下面,比如使用YAFFS时,就在YAFFS里面会有FLASH驱动)

4,441

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧