am335x 从 NAND FLASH 中启动遇到的问题的解决方法(上) (下)

http://blog.chinaunix.net/uid-28458801-id-3437793.html



PC操作系统:ubuntu 11.10

使用的开发板:am335x_evm

开发板使用的操作系统:linux 3.2



有多种方式可以写入数据到NAND FLASH 中,这里使用的是 SD卡,把 SD 中的SPL( MLO), u-boot.img 文件写入到 NAND FLASH 中

NAND 布局如下:

+------------+-->0x00000000-> SPL start         (SPL copy on 1st block)
|            |
|            |-->0x0001FFFF-> SPL end 
|            |-->0x00020000-> SPL.backup1 start (SPL copy on 2nd block)
|            |
|            |-->0x0003FFFF-> SPL.backup1 end 
|            |-->0x00040000-> SPL.backup2 start (SPL copy on 3rd block)
|            |
|            |-->0x0005FFFF-> SPL.backup2 end 
|            |-->0x00060000-> SPL.backup3 start (SPL copy on 4th block)
|            |
|            |-->0x0007FFFF-> SPL.backup3 end
|            |-->0x00080000-> U-Boot start
|            |                                    
|            |-->0x002BFFFF-> U-Boot end 
|            |-->0x00260000-> ENV start
|            |
|            |
|            |-->0x0027FFFF-> ENV end
|            |-->0x00280000-> Linux Kernel start
|            |
|            |
|            |-->0x0077FFFF-> Linux Kernel end
|            |-->0x00780000-> File system start
|            |
|            |
+------------+-->0x10000000-> NAND end (Free end)


1.

先使用 SD卡启动 am335x,但不要进入到系统中。(SD,Switch SW3, SW3[5:1] ==> 10111 , 其他 pins 都设置为 0 (也就是 OFF). )

如下:

am335x 从 NAND FLASH 中启动遇到的问题的解决方法(上) (下)_第1张图片



把 SD 中 的 SPL(MLO),u-boot.img 文件写入到 NAND FLASH 中。

把 SPL (MLO) 写入到  NAND 中 :

U-Boot# mmc rescan 

U-Boot# mw.b 0x82000000 0xFF 0x20000 

U-Boot# fatload mmc 0 0x82000000 MLO

U-Boot# nandecc hw 2

U-Boot# nand erase 0x0 0x20000 

U-Boot# nand write.i 0x82000000 0x0 0x20000


把 u-boot.img 写入到 NAND 中:

U-Boot# mmc rescan 

U-Boot# mw.b 0x82000000 0xFF 0x40000 

U-Boot# fatload mmc 0 0x82000000 u-boot.img 

U-Boot# nandecc hw 2 

U-Boot# nand erase 0x80000 0x40000 

U-Boot# nand write.i 0x82000000 0x80000 0x40000


执行到这里,没有发生任何错误。


2.

关闭 am335x。

转换成有 NAND 模式启动 am335x。(NAND,Switch SW3, SW3[5:1] ==> 10010 , 其他 pins 都设置为 0 (也就是 OFF). )

启动 am335x。


3.

发生异常,提示如下:

U-Boot SPL 2011.09 (Jun 23 2012 - 20:16:14)                       

Texas Instruments Revision detection unimplemented               

spl: ERROR: This bootmode is not implemented - hanging### ERROR ### Please RESET the board ###


4.

解决方法:

打开文件:ti-sdk-am335x-evm/board-support/u-boot-2011.09-psp04.06.00.07/arch/arm/cpu/armv7/omap-common/spl_nand.c

修改函数:void spl_nand_load_image(void)   // LINE  33

如下:

void spl_nand_load_image(void)
{
    struct image_header *header;

/*@@     //修改前
    switch (omap_boot_mode()) {
    case NAND_MODE_HW_ECC:
        debug("spl: nand - using hw ecc\n");
        gpmc_init();
        nand_init();
        break;
    default:
        puts("spl: ERROR: This bootmode is not implemented - hanging");
        hang();
    }
@@*/


    //修改后
    debug("spl: nand - using hw ecc\n");    //@@    
    gpmc_init();    //@@
    nand_init();    //@@


    /*use CONFIG_SYS_TEXT_BASE as temporary storage area */
    header = (struct image_header *)(CONFIG_SYS_TEXT_BASE);


保存。


5.

重新编译 uboot。 执行命令:#make O=am335x CROSS_COMPILE=arm-arago-linux-gnueabi- ARCH=arm am335x_evm

把生成的 MLO,u-boot.img 文件复制到 SD 卡中 替换原来的这两个文件。

重新执行  1.和2.

启动 am335x。

显示如下:

am335x 从 NAND FLASH 中启动遇到的问题的解决方法(上) (下)_第2张图片



完成!


Linux kernel 以及 文件系统  待续





首先要 linux kernel 可以支持 NAND FLASH。

打开linux kernel 文件 :linux-3.2-psp04.06.00.07.sdk/arch/arm/mach-omap2/board-am335xevm.c

修改如下:

/* General Purpose EVM */
static struct evm_dev_cfg gen_purp_evm_dev_cfg[] = {

    ....

//修改前

//@@    {evm_nand_init, DEV_ON_DGHTR_BRD,
//@@        (PROFILE_ALL & ~PROFILE_2 & ~PROFILE_3)},


    //修改后
    {evm_nand_init, DEV_ON_BASEBOARD, PROFILE_NONE},    //@@

    ....

};

重新编译内核


把 linux kernel 的 uImage 写入到 NAND FLASH 中


把 uImage 写入到 NAND 中:

U-Boot# mmc rescan 

U-Boot# mw.b 0x82000000 0xFF 0x500000 

U-Boot# fatload mmc 0 0x82000000 uImage 

U-Boot# nandecc hw 2 

U-Boot# nand erase 0x280000 0x500000 

U-Boot# nand write.i 0x82000000 0x280000 0x500000


通过 NAND 方式启动 am335x ,提示如下:



问题: 应该是没有把 文件系统 也写入到 NAND FLASH 中

待续。。。



ubifs文件系统的制作和移植有几个要点是需要重点注意的,ubifi的正确制作流程,

请看本人的《ubifs的制作,移植的重点详解》

ubifs的制作,移植的重点详解


1,把生成 ubifs 的文件系统的 ubi.img 写入到NAND FALSH 中

U-Boot# mmc rescan 

U-Boot# mw.b 0x82000000 0xFF 0x2000000 

U-Boot# fatload mmc 0 0x82000000 ubi.img 

U-Boot# nandecc hw 2 

U-Boot# nand erase 0x780000 0xF880000 

U-Boot# nand write.i 0x82000000 0x780000 0x2000000


2,设置 bootargs 环境变量,是 ubifs 成为根文件系统,并保持设置,然后关机

U-Boot#setenv bootargs 'console=ttyO0,115200n8 noinitrd ip=off mem=256M rootwait=1 rw ubi.mtd=7,2048 rootfstype=ubifs root=ubi0:rootfs init=/linuxrc'


U-Boot#saveenv


     在这里需要重点注意的命令参数是 :init=/linuxrc

     这里的 linuxrc 是一个可执行文件,这个文件是用以引导内核加载文件系统的。如果没有这个文件,内核无法正确加载文件系统

     将会导致以下错误:Kernel panic - not syncing: No init found.  Try passing init= option to kernel.

     这个文件的详解在:《ubifs的制作,移植的重点详解 》-> "2),生成镜像文件" 中。

     


3,把evm设置成从nandflash启动,这次启动应该是可以正常启动的。但是再次关机后,重新启动,很可能会出现以下错误:

     UBIFS error (pid 1): replay_log_leb: first log node at LEB 3:0 is not CS node

     UBIFS error(pid 1): replay_log_leb: log error detected while replaying the log at LEB 3:0  

     这个错误的原因是'fixup_free_space()中计算空空间开始地址为c->lhead_offs。正确的应该为一直是0

解决方法是:

       1,修改 linux 内核代码

             FILE_PATH: fs/ubifs/sb.c : fixup_free_space()

static int fixup_free_space(struct ubifs_info *c)
{
    int lnum, err = 0;
    struct ubifs_lprops *lprops;

    ubifs_get_lprops(c);


    ......


    //修改前
    /* Fixup the current log head */
/*@@
    err = fixup_leb(c, c->lhead_lnum, c->lhead_offs);
    if (err)
        goto out;
@@*/

    

     //修改后
     /*@@
     * Fixup the log head which contains the only a CS node at the
     * beginning.
     */
     err = fixup_leb(c,c->lhead_lnum,ALIGN(UBIFS_CS_NODE_SZ, c->min_io_size));
     if (err)
          goto out;
    /*@@*/    
    

             

    ......

}


       2,重新编译内核,把生成的uImage写入到SD中,转换为 SD卡启动模式,但不进入linux系统,

            把  uImge和 ubi.img这两个重新写入到 NAND 中。


4,把evm设置成从nandflash启动,OK!

     重启,OK!再重启,也OK! 。。。



至此,ubifs 成功写入到NAND中,并成为linux根文件系统

你可能感兴趣的:(U-boot)