NAND flash 文件系統製作

 

BeagleBoardNAND

Software

以下的部分軟件可以存儲和從NAND啓動/運行:

  • X-Loader
  • U-Boot (+ environment/configuration data)
  • Linux kernel
  • Linux file system

這些軟件在beagleboard上的存儲分配如下:

-------------------------------------
0x00000000-0x00080000 : "X-Loader"
0x00080000-0x00260000 : "U-Boot"
0x00260000-0x00280000 : "U-Boot Env"

0x00280000-0x00680000 : "Kernel"

0x00680000-0x10000000 : "File System"

-------------------------------------

爲了能夠寫東西到nandflash,首先你需要從其他源,如MMC/SD卡啓動。此外,你需要把那些從MMC/SD卡啓動的文件(MLO & U-Boot),寫進MMC/SD卡得第一個分區。然後你可以在那裏讀取到這些文件和寫入到NAND。

X-Loader

編譯x-loader。放到MMC/SD卡的FAT分區,然後開始從存儲卡中的引導和使用下面的命令寫x-loader到NAND:

-------------------------------------

mmc init

fatload mmc 0:1 80000000 x-load_revc_v3.bin.ift

nand unlock

nandecc hw

nand erase 0 80000

nand write 80000000 0 80000

------------------------------------------

注:命令nandecc hw 在這裏是必須的。x-loader是OMAP引導ROM的第一段程序。在讀NAND的時候,使用命令nandecc hw 。所以,在寫NAND時,同樣使用使用命令nandecc hw 。如果你不使用nandecc hw 將不能從NAND 引導ROM。

U-Boot

編譯U-Boot。放到MMC/SD卡的FAT分區,然後開始從存儲卡中的引導和使用下面的命令寫U-Boot到NAND:

-------------------------------------

mmc init

fatload mmc 0:1 80000000 u-boot.bin

nand unlock

nandecc sw

nand erase 80000 160000

nand write 80000000 80000 160000

-------------------------------------

注意:你可以使用引導MMC/SD卡啓動的u-boot.bin來引導NAND啓動。他們之間沒有區別。

注意:這兒,你不需要nandecc hw選項。X-loader用於加載和引導u-boot,能夠識別u-boot寫入的SW ECC。

Kernel

相比於只能通過u-boot寫入NAND的x-loader和u-boot,這裏有兩種方法將kernel和file system寫入NAND:通過u-boot(與上面的x-loader和u-boot相似) 或者從運行中的內核(比如,從MMC卡引導)。

注意:x-loader和u-boot不能從運行中得內核中寫入,因爲從內核的角度, x-loader和u-boot的NAND分區是標記爲只讀的。

Writing kernel with U-Boot

-------------------------------------

mmc init

fatload mmc 0:1 80000000 uImage

nandecc sw

nand erase 280000 400000

nand write 80000000 280000 400000

-------------------------------------

當做了上述工作之後,使用U-Boot命令從NAND引導kernel (uImage):

nand read 80000000 280000 400000 ; bootm 80000000

這裏,你可以保存U-Boot命令,這樣你的板子就可以自動的從NAND引導uImage。

Writing kernel with kernel

當你有一個內核啓動了,比如:從MMC卡。你可以使用該內核去寫自己的kernel (uImage)去NAND。然後從MMC卡啓;動切換到NAND卡啓動。對於這一點,觀察內核的引導信息。這些應該是這樣的:
-------------------------------------
omap2-nand driver initializing
NAND device: Manufacturer ID: 0x2c, Chip ID: 0xba (Micron NAND 256MiB 1,8V 16-bit)
cmdlinepart partition parsing not available
Creating 5 MTD partitions on "omap2-nand":
0x00000000-0x00080000 : "X-Loader"
0x00080000-0x00260000 : "U-Boot"
0x00260000-0x00280000 : "U-Boot Env"
0x00280000-0x00680000 : "Kernel"
0x00680000-0x10000000 : "File System"
-------------------------------------

在內核的提示命令 cat /proc/mtd 下會給出類似的輸出信息:

-------------------------------------
root@beagleboard:~# cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00080000 00020000 "X-Loader"
mtd1: 001e0000 00020000 "U-Boot"
mtd2: 00020000 00020000 "U-Boot Env"
mtd3: 00400000 00020000 "Kernel"
mtd4: 0f980000 00020000 "File System"
-------------------------------------

雖然前三個分區(x-loader,u-boot和u-boot Env),從內核的角度查看是隻讀的。但是kernel和file system 分區對於內核本身來說是可寫的。要做到這一點,你需要有MTD用戶模塊在你的內核根文件系統裏。

在這個例子中,我們掛在MMC卡得FAT分區去讀kernel(uImage)。如果你的內核有網絡連接,你可以使用此。或者把uImage放在你的根文件系統。這樣做的目的是能夠從正在運行的內核中將uImage寫入到NAND。

-------------------------------------
root@beagleboard:~# mkdir -p /mnt/fat
root@beagleboard:~# mount /dev/mmcblk0p1 /mnt/fat/
root@beagleboard:~# ls -la /mnt/fat
-rwxr-xr-x    1 root     root        16740 Jul  7 17:28 mlo
-rwxr-xr-x    1 root     root       717116 Jul 24  2008 u-boot.bin
-rwxr-xr-x    1 root     root      2106940 Jul 26  2008 uImage
root@beagleboard:~# cp /mnt/fat/uImage .
root@beagleboard:~# ls -la
-rwxr-xr-x    1 root     root      2106940 Jul 22 00:30 uImage
root@beagleboard:~# flash_eraseall /dev/mtd3
Erasing 128 Kibyte @ 3e0000 -- 96 % complete.
root@beagleboard:~# nandwrite -p /dev/mtd3 uImage
Writing data to block 0 at offset 0x0
<...>
Writing data to block 20 at offset 0x280000
root@beagleboard:~#
-------------------------------------

File system

與內核一樣,相比於只能通過u-boot寫入NAND的x-loader和u-boot,這裏有兩種方法將file system寫入NAND:通過u-boot(與上面的x-loader和u-boot相似) 或者 從運行中的內核(比如,從MMC卡引導)。很多用戶反映,他們在用u-boot寫根文件系統時遇到了問題。主要的問題是,u-boot必須格式化內核去寫file system。如果有輕微的不兼容,內核將不能讀取到被u-boot寫入的文件系統。

所以,我們在這裏記錄瞭如何去用u-boot寫入文件系統。推薦的方法是通過內核本身去寫根文件系統。有了這個,可以確保用內核寫入一個文件系統,稍後能夠讀取到。

Writing file system with U-Boot

該方法不推薦,原因見上。

-------------------------------------
OMAP3 beagleboard.org # mmc init
OMAP3 beagleboard.org # fatload mmc 0:1 80000000 rootfs.jffs2
reading rootfs.jffs2
12976128 bytes read
OMAP3 beagleboard.org # nand unlock
device 0 whole chip
nand_unlock: start: 00000000, length: 268435456!
NAND flash successfully unlocked
OMAP3 beagleboard.org # nandecc sw
OMAP3 beagleboard.org # nand erase 680000 F980000
NAND erase: device 0 offset 0x680000, size 0xf980000
Erasing at 0xffe0000 -- 100% complete.
OK
OMAP3 beagleboard.org # nand write.jffs2 80000000 680000 ${file_size}
NAND write: device 0 offset 0x680000, size 0xc60000
Writing data at 0x12df800 -- 100% complete.
 12976128 bytes written: OK
-------------------------------------

Writing file system with kernel

推薦該方法。

首先,我們用SD卡上的根文件系統啓動內核。在正在運行的內核中,用SD卡上的文件系統映像把根文件系統寫入到Beagle的NAND上去。在這些做完之後,我們切換內核的啓動參數去從NAND上執行根文件系統來替代SD卡得根文件系統。

然後,爲了能夠從內核的用戶空間去操縱/擦除/寫NAND,我們需要MTD Utils。如果你沒有這個工具,你可以通過該方法獲取:opkg install mtd-utils 

對於在Beagle’s NAND 中的文件系統,我們使用JFFS2。JFFS2是標準的git內核的一部分,只需要配置內核使能JFFS2。使用make menuconfig檢查是否已啓用。

-------------------------------------

CONFIG_JFFS2_FS=y

CONFIG_JFFS2_FS_DEBUG=0

CONFIG_JFFS2_FS_WRITEBUFFER=y

CONFIG_JFFS2_ZLIB=y

CONFIG_JFFS2_RTIME=y

-------------------------------------

在內核支持JFFS2和MTD Utils後,我們先擦除文件系統分區並在該分區中創建JFFS2。

-------------------------------------

root@beagleboard:~# cat /proc/mtd

dev:    size   erasesize  name

mtd0: 00080000 00020000 "X-Loader"

mtd1: 001e0000 00020000 "U-Boot"

mtd2: 00020000 00020000 "U-Boot Env"

mtd3: 00400000 00020000 "Kernel"

mtd4: 0f980000 00020000 "File System"

root@beagleboard:~# flash_eraseall -j /dev/mtd4

Erasing 128 Kibyte @ f960000 -- 99 % complete. Cleanmarker written at f960000.

-------------------------------------

然後,我們可以掛載文件系統分區:

-------------------------------------

root@beagleboard:~# cd /mnt

root@beagleboard:~# mkdir nand

root@beagleboard:~# mount -t jffs2 /dev/mtdblock4 /mnt/nand

-------------------------------------

並提取到他的根文件系統映像:

-------------------------------------

root@beagleboard:~# cd nand

root@beagleboard:~# tar xfz <where_ever_your_root_fs_image_is_at_sd_card>/rootfs.tar.gz .

... wait ...

root@beagleboard:~# cd ..

root@beagleboard:~# sync

root@beagleboard:~# umount nand

-------------------------------------

現在,你應該重啓你的主板並在u-boot中編輯啓動參數去配置在NAND中的根文件系統。

-------------------------------------

root=/dev/mtdblock4 rootfstype=jffs2

-------------------------------------

 

發佈了47 篇原創文章 · 獲贊 235 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章