今天在给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 "); run_command("mtdparts default", 0); } #endif