正文
添加mtdparts引起的问题
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
今天在给uboot添加分区,大家都知道添加完之后直接在终端里面mtd会报错:
SMDK2440 # mtd
mtdparts variable not set, see 'help mtdparts'
no partitions defineddefaults:
mtdids : nand0=jz2440-
mtdparts: mtdparts=jz2440-:512k(u-boot),128k(params),2m(kernel),-(rootfs)
需要手动执行mtdparts default之后在执行mtd命令就好了,于是大家几乎都在arch/arm/lib下的board.c中添加:
run_command("mtdparts default",);
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", );
}
#endif