想搞SmartQ5上的多启动,看了官方的u-boot源码,记于此:
在lib_arm下的board.c文件中的void start_armboot (void)是汇编过渡到C的第一个函数,在此函数中主要是进行一些初始化工作,像nand,eth及其它设备等,在函数的最后面是一个“死循环”用于处理“终端”上的命令
/* main_loop() can return to retry autoboot, if so just run it again. */
for (;;)
{
main_loop ();
}
for (;;)
{
main_loop ();
}
SmartQ的u-boot在进入循环之前,添加如下代码:
#ifdef CONFIG_HHTECH_MINIPMP
if (tstc() && getc() == ' ') // here test press key
setenv("bootcmd", NULL);
else
{
if(0 == init_hard_last(0, 0))
do_start_firmware(1, NULL);
else
return;
}
#endif
if (tstc() && getc() == ' ') // here test press key
setenv("bootcmd", NULL);
else
{
if(0 == init_hard_last(0, 0))
do_start_firmware(1, NULL);
else
return;
}
#endif
当终端上有输入,进入主循环,处理终端命令,否则,启动“刷机”程序的引导代码,代码文件cmd_hhtech.c和hhtech.h中包含大部分功能,所以要作多启动,以这两个文件的内容作相应的修改就行,hhtech.h中主要对于“按键”的定义,在cmd_hhtech.c中,开始的部分是一些硬件的“驱动”代码,包含LCD(开背光),LED及电源,下面是一个固件的struct定义,官方的刷机固件是以initramfs方式运行的,所以这个struct很最要,它把kernel和initramfs封装在firmware中,根据struct的定义把相应的部分读取出来;再后面是加载kernel并运行等相关代码,分为从nand中和sd卡中加载。紧接着是读按键代码,区分不同的按键以启动不同的系统就靠它了!