今天在给uboot添加分区,大家都知道添加完之后直接在终端里面mtd会报错:

SMDK2440 # mtd
mtdparts variable not set, see 'help mtdparts'
no partitions defined

defaults:
mtdids  : nand0=jz2440-0
mtdparts: mtdparts=jz2440-0:512k(u-boot),128k(params),2m(kernel),-(rootfs)

需要手动执行mtdparts default之后在执行mtd命令就好了,于是大家几乎都在arch/arm/lib下的board.c中添加:

        run_command("mtdparts default",0);
    for (;;) {
        main_loop();
    }

然而我在这个地方加了之后怎么都不成功,分析代码执行mtdparts default其实最终就是调用mtdparts_init()函数,于是我换成在这个地方直接执行mtdparts_init()函数,发现还是不凑效,于是一直在分析do_mtdparts命令,发现也没什么需要添加的宏。

于是想到有可能run_command("mtdparts default",0);这个代码根本就没执行,于是在这个函数前面加了些打印,发现打印也没有,这个函数果然没有执行。

于是搜索board_init_r函数,发现在common/board_r.c里面也有个board_init_r函数,赶紧做了个测试,发现果然是这样的,board_r.c这个文件里面也有一个init_sequence_r[]数组,其实初始化的时候是在执行这个数组,并非arch/arm/lib/board.c这个文件里的init_sequence[],最终执行的是run_main_loop函数,我在这个函数里面添加run_command("mtdparts default",0);就可以了。

当然在直接在main_loop函数里面添加如下代码也可以,走哪个分支,最终都会去执行main_loop函数的:

#ifdef CONFIG_CMD_MTDPARTS
    if (!getenv("mtdparts"))
    {
        puts("mtdparts env not found\r\n");
        run_command("mtdparts default", 0);
    }
#endif