2012年6月3日 星期日

如何將做好的file system放到NAND flash中,並燒入修改

 
一、如何將做好的file system放到NAND flash中,
(這樣的做法事實上是間接把mtd3格式化成jffs2,然後再把未壓縮filesystem給copy到已格式化的mtd3上。這樣可以方便我們測試filesystem可不可以適用於此板。)

1. 將file system壓縮成jffs2的格式,
      ./mkfs.jffs2 --pad=0x00F00000 --eraseblock=0x20000 -r target/ -o rootfs.jffs2
(注意一下這邊的pad參數,這樣的做法只把mtd3的部分給格式化成F00000大小,所以可以把它放大到跟mtd3的分割大小)

2. 用NFS開機進去Linux之後,將rootfs.jffs2燒進去,
 flash_eraseall -j /dev/mtd3
 nandwrite -p /dev/mtd3 rootfs.jffs2

3. 將/dev/mtdblock3 掛載起來,並將檔案全數刪除,
mount -t jffs2 /dev/mtdblock3 /mnt/nand
rm -rf /mnt/nand/*

4. 接著把要測試的file system全部重新copy到 /mnt/nand 

5. unmount /mnt/nand; 之後重新掛載mtdblock3,注意有沒有錯誤訊息(應該是沒有)

在編譯kernel需要注意的是kernel config的時候,確定NAND flash有被選起來(預設會有),並在file system裡面的NFS選項,必須把"Root file system on NFS"這個選項disable。
(注意:之後要再重新從NFS開機的話,要在重新把此選項選起來,並重新編譯)

在u-Boot,從NAND flash開機方法如下

uboot # tftp 0x80700000 uImage    /*tftp下載image*/
uboot # setenv bootargs console=ttyS0,115200n8 noinitrd rw ip=140.124.182.1::140.124.182.254:255.255.255.0:dm6446:eth0:off root=/dev/mtdblock3 rw rootfstype=jffs2   /*從mtdblock3開機*/

uboot # bootm
二、如何將kernel燒進去NAND Flash
這邊的做法是從uboot去做下載並燒到flash裡面,
1. 將編譯完成之uImage放置tftp目錄下。

2. uboot # nand erase 0x2060000 0x155400
uboot # tftp 0x80700000 uImage
uboot # nand write 0x80700000 0x2060000 0x155400
uboot # setenv 'bootcmd nand read 80700000 2060000 155400 ; bootm'
(注意:這裡是將kernel放在2060000放置,最好跟linux配置kernel位置一樣mtd2,kernel大小為155400,要視自己的flash配置空間以及kernel大小做修改)
這裡2060000是放置kernel位址,但若是u-boot直接對此位址讀取在第一次是可正常讀取但在重新開機就會產生讀取錯誤的狀況。所以應該要填入60000

3.重新開機可直接進去linux

之後如果要更新kernel的話也可以從linux去更新。
/usr/sbin/flash_eraseall -j /dev/mtd2 
/usr/sbin/nandwrite -p /dev/mtd2 uImage
三、MTD PARTITION

在arch/arm/mach-davinci/board-evm.c裡,我們必須自己規劃flash的配置大小。static struct mtd_partition nand_partitions[] = {
   /* bootloader (U-Boot, etc) in first sector */
   {
         .name             = "bootloader",                                              //mtd0 放 bootloader
         .offset           = 0,
         .size             = SZ_2M,     //配置2MB,視bootloader大小決定
         .mask_flags       = MTD_WRITEABLE, /* force read-only */
   },
   /* bootloader params in the next sector */
   {
         .name             = "params",  //mtd1 放 bootloader的params
         .offset           = MTDPART_OFS_APPEND,                               //接續上一個配置空間
         .size             = SZ_1M,    //配置1MB,視bootloader params大小決定
         .mask_flags       = MTD_WRITEABLE, /* force read-only */
   },
   /* kernel */
   {
         .name             = "kernel", //mtd2 放 kernel(uImage)
         .offset           = MTDPART_OFS_APPEND, //接續上一個配置空間
         .size             = SZ_4M,     //配置4M,視kernel大小決定
         .mask_flags       = 0
   },
   /* file system */
   {
         .name             = "filesystem",    //mtd3 放 file system
         .offset           = MTDPART_OFS_APPEND, //接續上一個配置空間
         .size             = MTDPART_SIZ_FULL,                                     //配置剩下全部空間
         .mask_flags       = 0
   }
{
     //可視情況再增加分割數
}
};


沒有留言: