海思g_mass_storage.ko模拟U盘

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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容