1. 基于平台:海思3556V100
2. 存储设备:nand flash
3. 驱动加载 (参考《外围设备驱动 操作指南.pdf》)如下:
insmod udc-hisi.ko
insmod configfs.ko
insmod libcomposite.ko
insmod usb_f_mass_storage.ko
insmod g_mass_storage.ko file=/dev/mtdblockX luns=1 stall=0 removable=1 将mtd分区x(0 ~ n)作为模拟盘的存储介质
4. 在uboot的bootargs里加个分区():
#define CONFIG_BOOTARGS "mem=128M lpj=240000 console=ttyAMA0 clk_ignore_unused rw ubi.mtd=7 root=ubi0:ubifs rootfstype=ubifs mtdparts=hinand:1M(u-boot.bin),1M(u-boot.bin),4M(uImage),4M(media_app_zip.bin),1M(rawparam),1M(rawparam1),1M(paramdef),24M(rootfs.ubifs),6M(privatefs.ubifs),6M(paramfs.ubifs),84M(u_disk)"
5.在hitool烧录的xml文件添加个烧录区域(config_ubifs_nand.xml)
<Part Sel="1" PartitionName="u_disk" FlashType="nand" FileSystem="none" Start="49M" Length="84M" SelectFile=""/>
Start 49M = :1M +1M +4M +4M + 1M + 1M + 1M + 24M + 6M + 6M u_disk 前面分区的总大小
SelectFile 空置
5.开机进入linux 运行命令:cat /proc/mtd 查看有没有 u_disk分区,如下:
mtd10: 03100000 00000000 "u_disk"
然后加载驱动
insmod udc-hisi.ko
insmod configfs.ko
insmod libcomposite.ko
insmod usb_f_mass_storage.ko insmod g_mass_storage.ko file=/dev/mtdblock10(与mtd10对应,其实就是从0开始数BOOTARGS里面设置的分区) luns=1 stall=0 removable=1
6.连接USB到PC会弹出一个盘符,右键格式化成FAT就好了。
linux端格式分区命令:mkfs.vfat -n 盘符名称 /mtdblock10
7.linux端 读写 U盘内容:
mount -t vfat -o sync /mtdblock10 /mnt
当电脑写入数据时, umount /mnt 然后重新mount 数据就同步了。。。。(感觉好low....)
当linux写入数据时,PC端插拔下USB线 或者rmmod g_mass_storage 然后重新g_mass_storage.ko来同步数据。。。(haolow....)
8.上述方法直接在nand分区上格式化了一个FAT分区的弊端
nand flash的每个块擦写次数大约十万次,,,意思就是你一直怼一个nand块 那就很快没用了。
然后FAT没有对flash写入进行负载均衡,,,意思是 很均匀的怼每一个nand块。
https://www.iteye.com/blog/rubynroll-375771 具体看这个blog
那怎么办列, 用一个low的方法,在负载均衡的文件系统上(我用的是ubifs)虚拟一个块设备(就是类似上面那个/dev/mtdblock10)然后把这个块设备格式化为FAT32格式的。
具体怎么做呢?
https://blog.csdn.net/yimiyangguang1314/article/details/42744123 我是参考这里的,后面讲我遇到的坑。。。
9.制作个文件系统镜像
dd if=/dev/zero of=/disk.img bs=1M count=20
然后加载驱动:insmod g_mass_storage.ko file=/disk.img luns=1 stall=0 removable=1
PC接上USB,,竟然直接弹出盘符了,原来镜像文件也可以。。 PC端格式化下盘符或者linux端mkfs.vfat -n 盘符名称 /disk.img
这样PC就可以读写U盘了。剩下的工作就是linux端读写了。当然如果不需要此功能,,,就不用接下来的操作了。。
10.linux端读写U盘分区(镜像文件)
mount -t vfat -o sync /disk.img /mnt/ 如果成功的话那么恭喜你。。。
我是失败的哈哈哈哈哈mount了半天提示 No space left on device 。。。
然后我ls /dev/ 发现成千个/dev/loopn 也就是 从 /dev/loop0 ~ /dev/loop9999 创建那么多当然没空间了。。。
mount 镜像文件的时候其实可以理解为以下几个命令
losetup /dev/loop0 /disk.img //建立镜像文件(disk.img) 与回环设备的连接, 回环设备的作用(去百度吧,,懒得打字了。。)
我这里就报错了:no device or no file
一般你ls /dev/loop* 会出现 loop0 ~ loop7
如果没有: 去linux源码的根目录下 make make ARCH=arm CROSS_COMPILE=arm-xxxxx-gcc- menuconfig
去开启回环设备的支持。 大致在 device设备 --> block devices --> loopback device support
之后的话 /dev/loop0 设备 等价于/dev/mtdblock10
mount /dev/loop0 /mnt
如:mkfs.vfat /disk.img 等价于 lostepup /dev/loop0 /disk.img mkfs.vfat /dev/loop0 当然如果loop0被占用了 那就用loop1 具体使用问那个男人。。
11.还有个问题没解决,,,我之前因为直接在分区上负载FAT文件系统 有幸出现了一堆坏块哈哈哈。。。然后PC写入文件就卡在坏块那里了,,,不知道是卡在坏块还是坏块太多了(待验证)。。。有遇到过这个问题的人吗?
解决思路1:测试刚出厂的nand在ubifs 上 + fat 具体擦写次数,。 但是网上说。。刚出厂的nand是有可能出现坏块的。。
解决思路2:看代码。。。可劲儿看。。。
-------------------------------------------------------------------稚嫩的搬砖工-------------
欢迎来喷~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
12.续之前的问题: nand 上出现坏块 ubifs + fat格式的镜像文件 PC端读写文件会卡住的问题。
我仔细读了下第一篇的帖子。。。
“UBI原本是为了实现更好的负载均衡(全片负载均衡)和更好的扩展性。UBI架构在MTD之上,它 要完成的工作就是实现透明的负载均衡和坏块管理,让上层的文件系统从这两部分繁重的工作中 释放出来。
看起来与FTL很接近了,只可惜它提供的不是我们需要的块设备。与MTD一样,它提供的界面 是"flash"设备,供flash-aware-filesystem使用。例如可以在UBI之上使用JFFS2(据说可以获得更好 的负载均衡特性),或者专门设计的UBIFS。”
行吧。。。看来海思的ubifs不是专门设计的ubifs咯。。。
然后我就把文件系统改成了yaffs2,,就OK了
大致有两个猜测,
一、是海思 的我这个版本的sdk linux关于MTD驱动没有弄好,或者是我没有把坏块相关的检测开起来? 因为看到这篇文章的介绍yaffs2
https://blog.csdn.net/iceiilin/article/details/22721029
【yaffs/yaffs2自带NAND芯片的驱动,并且为嵌入式系统提供了直接访问文件系统的API,用户可以不使用Linux中的MTD与VFS,直接对文件系统操作。当然,yaffs也可与MTD驱动程序配合使用。】
这个需要去整个MTD框架了
二、就是ubifs文件系统没有坏块处理? 这个应该不太可能把、、、(不太懂)
然后 mount yaffs2分区的时候又又不成功了,,,这时候长了个心眼、、
cat /proc/filesystems 查看当前支持的文件系统
nodev sysfs
nodev proc
.....
vfat
nodev ubifs // 果然没有yaffs2
好吧。。。老样子去配置内核
make ARCH=arm CROSS_COMPILE=arm-xxxxx-gcc- menuconfig
File systems --> Miscellaneous filesystems
然后mount 成功。。。
传输大概1M ~ 2M 把。 。。还可以啊。。
-------------------------------------------------------------------稚嫩的搬砖工-------------
欢迎来喷~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~