美文网首页
海思g_mass_storage.ko模拟U盘

海思g_mass_storage.ko模拟U盘

作者: 自律与进化 | 来源:发表于2020-06-01 23:41 被阅读0次

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 把。 。。还可以啊。。

-------------------------------------------------------------------稚嫩的搬砖工-------------

欢迎来喷~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

相关文章

网友评论

      本文标题:海思g_mass_storage.ko模拟U盘

      本文链接:https://www.haomeiwen.com/subject/avgbahtx.html