瑞雪年

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: 订阅 订阅 :: 管理 ::

想搞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 ();
}

 

 SmartQ的u-boot在进入循环之前,添加如下代码:

#ifdef  CONFIG_HHTECH_MINIPMP
if (tstc() && getc() == ' ')    // here test press key
    setenv("bootcmd", NULL); 
else 
{
    
if(0 == init_hard_last(00))
        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卡中加载。紧接着是读按键代码,区分不同的按键以启动不同的系统就靠它了!

 

posted on 2009-07-02 10:18  瑞雪年  阅读(621)  评论(0编辑  收藏  举报