1. 基于平臺:海思3556V100
2. 存儲設(shè)備:nand flash
3. 驅(qū)動加載 (參考《外圍設(shè)備驅(qū)動 操作指南.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分區(qū)x(0 ~ n)作為模擬盤的存儲介質(zhì)
4. 在uboot的bootargs里加個分區(qū)():
#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文件添加個燒錄區(qū)域(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 前面分區(qū)的總大小
SelectFile 空置
5.開機(jī)進(jìn)入linux 運行命令:cat? /proc/mtd? 查看有沒有 u_disk分區(qū),如下:
mtd10: 03100000 00000000 "u_disk"
然后加載驅(qū)動
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對應(yīng)鲫凶,其實就是從0開始數(shù)BOOTARGS里面設(shè)置的分區(qū)) luns=1 stall=0 removable=1?
6.連接USB到PC會彈出一個盤符禀崖,右鍵格式化成FAT就好了。
linux端格式分區(qū)命令:mkfs.vfat -n 盤符名稱? /mtdblock10
7.linux端 讀寫 U盤內(nèi)容:
mount -t vfat -o sync /mtdblock10 /mnt
當(dāng)電腦寫入數(shù)據(jù)時螟炫,? umount /mnt? 然后重新mount 數(shù)據(jù)就同步了波附。。昼钻。掸屡。(感覺好low....)
當(dāng)linux寫入數(shù)據(jù)時,PC端插拔下USB線 或者rmmod g_mass_storage 然后重新g_mass_storage.ko來同步數(shù)據(jù)然评。仅财。。(haolow....)
8.上述方法直接在nand分區(qū)上格式化了一個FAT分區(qū)的弊端
nand? flash的每個塊擦寫次數(shù)大約十萬次碗淌,盏求,,意思就是你一直懟一個nand塊 那就很快沒用了亿眠。
然后FAT沒有對flash寫入進(jìn)行負(fù)載均衡碎罚,,纳像,意思是 很均勻的懟每一個nand塊荆烈。
https://www.iteye.com/blog/rubynroll-375771? 具體看這個blog
那怎么辦列, 用一個low的方法竟趾,在負(fù)載均衡的文件系統(tǒng)上(我用的是ubifs)虛擬一個塊設(shè)備(就是類似上面那個/dev/mtdblock10)然后把這個塊設(shè)備格式化為FAT32格式的憔购。
具體怎么做呢宫峦?
https://blog.csdn.net/yimiyangguang1314/article/details/42744123 我是參考這里的,后面講我遇到的坑倦始。。山卦。
9.制作個文件系統(tǒng)鏡像
dd if=/dev/zero of=/disk.img bs=1M count=20
然后加載驅(qū)動: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端讀寫了肮雨。當(dāng)然如果不需要此功能,箱玷,怨规,就不用接下來的操作了。锡足。
10.linux端讀寫U盤分區(qū)(鏡像文件)
mount -t vfat -o sync /disk.img /mnt/? 如果成功的話那么恭喜你波丰。。舶得。
我是失敗的哈哈哈哈哈mount了半天提示 No space left on device 掰烟。。沐批。
然后我ls /dev/? 發(fā)現(xiàn)成千個/dev/loopn? ? 也就是 從 /dev/loop0? ? ~? /dev/loop9999? 創(chuàng)建那么多當(dāng)然沒空間了纫骑。。九孩。
mount 鏡像文件的時候其實可以理解為以下幾個命令
losetup /dev/loop0 /disk.img? ? //建立鏡像文件(disk.img) 與回環(huán)設(shè)備的連接先馆, 回環(huán)設(shè)備的作用(去百度吧,躺彬,懶得打字了磨隘。。)
我這里就報錯了:no device or no file
一般你ls /dev/loop*? 會出現(xiàn) loop0 ~ loop7?
如果沒有: 去linux源碼的根目錄下 make make ARCH=arm CROSS_COMPILE=arm-xxxxx-gcc- menuconfig
去開啟回環(huán)設(shè)備的支持顾患。? 大致在 device設(shè)備 --> block devices --> loopback device support
之后的話 /dev/loop0 設(shè)備 等價于/dev/mtdblock10
mount? /dev/loop0 /mnt
如:mkfs.vfat /disk.img? 等價于 lostepup /dev/loop0 /disk.img? ? mkfs.vfat /dev/loop0? 當(dāng)然如果loop0被占用了? 那就用loop1? 具體使用問那個男人番捂。。
11.還有個問題沒解決江解,设预,,我之前因為直接在分區(qū)上負(fù)載FAT文件系統(tǒng)? 有幸出現(xiàn)了一堆壞塊哈哈哈犁河。鳖枕。魄梯。然后PC寫入文件就卡在壞塊那里了,宾符,酿秸,不知道是卡在壞塊還是壞塊太多了(待驗證)。魏烫。辣苏。有遇到過這個問題的人嗎?
解決思路1:測試剛出廠的nand在ubifs 上 + fat 具體擦寫次數(shù)哄褒,稀蟋。 但是網(wǎng)上說。呐赡。剛出廠的nand是有可能出現(xiàn)壞塊的退客。。
解決思路2:看代碼链嘀。萌狂。』巢矗可勁兒看粥脚。。包个。
-------------------------------------------------------------------稚嫩的搬磚工-------------
歡迎來噴~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
12.續(xù)之前的問題: nand 上出現(xiàn)壞塊? ubifs + fat格式的鏡像文件? PC端讀寫文件會卡住的問題刷允。
我仔細(xì)讀了下第一篇的帖子。碧囊。树灶。
? ? “UBI原本是為了實現(xiàn)更好的負(fù)載均衡(全片負(fù)載均衡)和更好的擴(kuò)展性。UBI架構(gòu)在MTD之上糯而,它? ? ? 要完成的工作就是實現(xiàn)透明的負(fù)載均衡和壞塊管理天通,讓上層的文件系統(tǒng)從這兩部分繁重的工作中? ? ? ? 釋放出來。
? 看起來與FTL很接近了熄驼,只可惜它提供的不是我們需要的塊設(shè)備像寒。與MTD一樣,它提供的界面? ? ? ? ? ? 是"flash"設(shè)備瓜贾,供flash-aware-filesystem使用诺祸。例如可以在UBI之上使用JFFS2(據(jù)說可以獲得更好? ? 的負(fù)載均衡特性),或者專門設(shè)計的UBIFS祭芦】瓯浚”
行吧。。胃夏≈峄颍看來海思的ubifs不是專門設(shè)計的ubifs咯。仰禀。照雁。
然后我就把文件系統(tǒng)改成了yaffs2,答恶,就OK了
大致有兩個猜測饺蚊,
? 一、是海思 的我這個版本的sdk? linux關(guān)于MTD驅(qū)動沒有弄好亥宿,或者是我沒有把壞塊相關(guān)的檢測開起來卸勺? 因為看到這篇文章的介紹yaffs2
https://blog.csdn.net/iceiilin/article/details/22721029
【yaffs/yaffs2自帶NAND芯片的驅(qū)動砂沛,并且為嵌入式系統(tǒng)提供了直接訪問文件系統(tǒng)的API烫扼,用戶可以不使用Linux中的MTD與VFS,直接對文件系統(tǒng)操作碍庵。當(dāng)然映企,yaffs也可與MTD驅(qū)動程序配合使用【苍。】
這個需要去整個MTD框架了
? 二堰氓、就是ubifs文件系統(tǒng)沒有壞塊處理?? 這個應(yīng)該不太可能把苹享、双絮、、(不太懂)
然后 mount yaffs2分區(qū)的時候又又不成功了得问,囤攀,,這時候長了個心眼宫纬、焚挠、
cat /proc/filesystems? 查看當(dāng)前支持的文件系統(tǒng)
nodev? sysfs
nodev? proc
.....
? ? ? ? vfat
nodev? ubifs? // 果然沒有yaffs2?
好吧。漓骚。蝌衔。老樣子去配置內(nèi)核
make ARCH=arm CROSS_COMPILE=arm-xxxxx-gcc- menuconfig
File systems --> Miscellaneous filesystems
然后mount 成功。蝌蹂。噩斟。
傳輸大概1M ~ 2M 把。 孤个。亩冬。還可以啊。。
-------------------------------------------------------------------稚嫩的搬磚工-------------
歡迎來噴~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~