当前位置: 技术问答>linux和unix
问个nand flash分区表的问题
来源: 互联网 发布时间:2015-12-11
本文导语: 偶的nand flash分四个区,分别是vivi,kernel,root,user 在vivi里面可以读出分区表 可是进入控制台后,用fdisk -l看不到分区信息 在内核启动的时候也读不出分区表,提示说放分区表那块是坏块 偶就纳闷啊,都是同...
偶的nand flash分四个区,分别是vivi,kernel,root,user
在vivi里面可以读出分区表
可是进入控制台后,用fdisk -l看不到分区信息
在内核启动的时候也读不出分区表,提示说放分区表那块是坏块
偶就纳闷啊,都是同一个地方,为啥vivi就能读出来,而内核却说那块是坏快呢
另外再问个问题
在PC上,硬盘的分区是 /dev/hda1 /dev/hda2 ……
请问在nand flash上,分区又是什么呢? /dev/???
我看到sd卡的是 /dev/sda1
在vivi里面可以读出分区表
可是进入控制台后,用fdisk -l看不到分区信息
在内核启动的时候也读不出分区表,提示说放分区表那块是坏块
偶就纳闷啊,都是同一个地方,为啥vivi就能读出来,而内核却说那块是坏快呢
另外再问个问题
在PC上,硬盘的分区是 /dev/hda1 /dev/hda2 ……
请问在nand flash上,分区又是什么呢? /dev/???
我看到sd卡的是 /dev/sda1
|
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了!!!!
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了!!!!