Thursday, November 29, 2007

KB9202B - 製作 JFFS2 影像,並寫入 NAND Flash

試了2天,終於成功了...

我們要做的工作是把先前可用於 NFS 遠端開機的根檔案系統寫入到目標板上的 NAND Flash 中,要做這件事之前,首要工作是要建立可以寫入 NAND Flash 的一個 JFFS2 影像檔。JFFS2 是用於 Flash 的檔案系統,就我的理解,Linux 是透過 MTD 的驅動程式,將 NAND Flash 模擬成一個分割區(partition, 在我的板子上是 /dev/mtd0)。如果將製作成 JFFS2 形式的影像檔寫入到該分割區,就可以建立在該分割區上的一個 JFFS2 檔案系統。最後藉由正確的開機參數,指定 Linux 核心由該分割區(/dev/mtdblock0)開機。以下流程是說明如何建立 JFFS2 的影像檔,以及如何寫入到 NAND Flash 中。

假設製作好且確定可用於 NFS 掛載的根檔案系統,放置於主機的 /usr/local/arm/target_fs

一、建立 MTD 工具 - MTD 工具是建立 JFFS2 影像檔及寫入 Flash 的必備工具,因些必須先下載編譯。

1. 下載 MTD 工具 的程式碼(KB9202B 的開發手冊上的說明)
$ cvs -d :pserver:anoncvs@cvs.infradead.org:/home/cvs login
(密碼 : anoncvs)
$ cvs -d :pserver:anoncvs@cvs.infradead.org:/home/cvs co mtd
$ cvs -d :pserver:anoncvs@cvs.infradead.org:/home/cvs logout
2. 編譯主機上可以用的 mkfs.jffs2
$ cd mtd/utils
$ make mkfs.jffs2
$ cp mkfs.jffs2 /usr/local/bin/
 Ubuntu 也可以直接安裝 mtd-tools 這個套件,附有 mkfs.jffs2 這支程式。不過僅限於主機端使用,用於 ARM 板上的程式(flash_eraseall, nandwrite)仍要透過步驟 3 產生。

3. 透過跨平台編譯,建立可在 ARM 上面使用的 mtd 工具
$ make clean
$ make CROSS=arm-linux-
 這個跨平台編譯需要在 toolchain 中安裝 zlib 這個函式庫,如果之前建立 buildroot 時沒有選 zlib ,那就要到 buildroot 重新設定及編譯一下。

二、建立 JFFS2 影像檔,及寫入 NANS Flash

1. 在主機端,建立根檔案系統的 JFFS2 影像檔,這部份在 KB9202B 的文件中,其指令如下︰
$ mkfs.jffs2 --pad=0x4000 --eraseblock=0x4000 -l --root=/usr/local/arm/target_fs -o full_fs.bin
 不過我在後面要寫入 NAND 時出現錯誤,原因似乎是因為 NAND 內有 bad blocks ,而這樣的參數導致寫入失敗。(詳細原因我不懂@@)後來嘗試了另一組參數可以成功寫入,指令如下︰
$ mkfs.jffs2 -n -p --root=/usr/local/arm/target_fs -o full_fs.bin
2. 寫入 full_fs.bin 到 NAND 上

 a. 使用 nfs 掛載根檔案系統的方式,開啟 KB9202B 上的系統。
 b. 在主機端,將 full_fs.bin 複製到 /usr/local/arm/target_fs/root 內。
 c. 將跨平台編譯好的程式 flash_eraseall, nandwrite 複製到 /usr/local/arm/target_fs/root 內
 d. 進入 ARM 的 Linux 系統中,使用以下指令︰
[KB9202B] $ cd /root
[KB9202B] $ ./flash_eraseall /dev/mtd0
[KB9202B] $ ./nandwrite -f /dev/mtd0 full_fs.bin
[KB9202B] $ reboot
3. 設定 u-boot 開機參數 bootargs 如下︰
setenv bootargs console=ttyS0,115200n8 root=/dev/mtdblock0 rootfstype=jffs2 mem=64M
saveenv
reset

No comments: