uboot nand_boot

本文详细介绍了U-Boot中通过NAND闪存加载内核及根文件系统的启动过程。根据不同启动模式,如正常启动、工厂模式等,文章阐述了如何配置启动参数、加载内核映像及根文件系统,并展示了关键函数do_nand_boot的具体实现。
extern int do_nand_boot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);


U_BOOT_CMD(
nand_boot, CONFIG_SYS_MAXARGS, 1,do_nand_boot,
"nand_boot  - load linux and ramdisk from NAND flash and boot kernel\n",
    NULL

);


int do_nand_boot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
DECLARE_GLOBAL_DATA_PTR;
int ret;
bd_t *bd = gd->bd;
ulong addr, data, len, initrd_start, initrd_end;
    void (*theKernel)(int zero, int arch, uint params);
    int strlen;




#ifdef CONFIG_CMDLINE_TAG
    char *commandline = getenv ("bootargs");
#endif


#ifdef CFG_UBOOT_PROFILING
      extern unsigned int boot_time;
      unsigned int time_do_nand_boot= get_timer(0);
      unsigned int time_rootfs;
      unsigned int time_load_bootimg;
      unsigned int ubt;
#endif




#if defined (CONFIG_SETUP_MEMORY_TAGS) || \
    defined (CONFIG_CMDLINE_TAG) || \
    defined (CONFIG_INITRD_TAG) || \
    defined (CONFIG_SERIAL_TAG) || \
    defined (CONFIG_REVISION_TAG) || \
    defined (CONFIG_LCD) || \
    defined (CONFIG_VFD)
setup_start_tag (bd);
#ifdef CONFIG_SERIAL_TAG
setup_serial_tag (&params);
#endif
#ifdef CONFIG_REVISION_TAG
setup_revision_tag (&params);
#endif
#ifdef CONFIG_SETUP_MEMORY_TAGS
if(g_boot_mode == FACTORY_BOOT)
{
 setup_memory_tags_factory(bd);
}
else
{
 setup_memory_tags(bd);
}  
#endif


//#ifdef CONFIG_CMDLINE_TAG
//****************
//* according to current boot mode to set boot tag and related boot args
//*
switch(g_boot_mode)
{
//********************************************************************
//* NORMAL BOOT
//********************************************************************
case NORMAL_BOOT:
#if defined(CFG_NAND_BOOT)
      strlen += sprintf(commandline, "%s%s%x%s%x", 
                commandline, NAND_MANF_CMDLINE, nand_flash_man_code, NAND_DEV_CMDLINE, nand_flash_dev_id);
#endif


 setup_boot_tag(NORMAL_BOOT);


      ret = mboot_android_load_bootimg_hdr(PART_BOOTIMG, CFG_BOOTIMG_LOAD_ADDR);            
      if (ret < 0) {
msg_header_error("Android Boot Image");
      }
      
#ifdef CFG_UBOOT_PROFILING
      time_load_bootimg= get_timer(0);
#endif      
      ret = mboot_android_load_bootimg(PART_BOOTIMG, CFG_BOOTIMG_LOAD_ADDR);            
#ifdef CFG_UBOOT_PROFILING
        printf("[PROFILE] ------- load boot.img takes %d ms -------- \n", get_timer(time_load_bootimg));
#endif


      if (ret < 0) {
  msg_img_error("Android Boot Image");
      }          
break;


//********************************************************************
//* META
//********************************************************************
case META_BOOT:
#ifdef CFG_META_MODE
//printf("[META] - Old bootargs : %s\n",commandline);
//commandline=strcat(commandline,META_BOOTARGS);
//printf("[META] - New bootargs : %s\n",commandline);
setup_boot_tag(META_BOOT);
          setup_meta_com_tag(g_boot_arg->meta_com_type, g_boot_arg->meta_com_id);
#endif
      ret = mboot_android_load_bootimg_hdr(PART_BOOTIMG, CFG_BOOTIMG_LOAD_ADDR);            
      if (ret < 0) {
 msg_header_error("Android Boot Image");
      }
      ret = mboot_android_load_bootimg(PART_BOOTIMG, CFG_BOOTIMG_LOAD_ADDR);            
      if (ret < 0) {
   msg_img_error("Android Boot Image");
      }            
break;


      //********************************************************************
      //* ADVANCED META MODE
 //********************************************************************
 case ADVMETA_BOOT:
        //printf("[META] - Old bootargs : %s\n",commandline);
        //commandline=strcat(commandline, ADV_META_BOOTARGS);
        //printf("[META] - New bootargs : %s\n",commandline);
        setup_boot_tag(ADVMETA_BOOT);
        setup_meta_com_tag(g_boot_arg->meta_com_type, g_boot_arg->meta_com_id);
        ret = mboot_android_load_bootimg_hdr(PART_BOOTIMG, CFG_BOOTIMG_LOAD_ADDR);            
        if (ret < 0) {
 msg_header_error("Android Boot Image");
        }
        ret = mboot_android_load_bootimg(PART_BOOTIMG, CFG_BOOTIMG_LOAD_ADDR);            
        if (ret < 0) {
 msg_img_error("Android Boot Image");
        }
      break;
      
//********************************************************************
//* ANDROID RECOVERY
//********************************************************************
case RECOVERY_BOOT:
#ifdef CFG_RECOVERY_MODE
setup_boot_tag(RECOVERY_BOOT);
#endif
        ret = mboot_android_load_recoveryimg_hdr(PART_RECOVERY, CFG_BOOTIMG_LOAD_ADDR);            
        if (ret < 0) {
  msg_header_error("Android Recovery Image");
        }   
        ret = mboot_android_load_recoveryimg(PART_RECOVERY, CFG_BOOTIMG_LOAD_ADDR);            
        if (ret < 0) {
  msg_img_error("Android Recovery Image");
        }
break;


//********************************************************************
//* FACTORY
//********************************************************************
case FACTORY_BOOT:
      #if defined(CFG_NAND_BOOT)
      strlen += sprintf(commandline, "%s%s%x%s%x", 
                commandline, NAND_MANF_CMDLINE, nand_flash_man_code, NAND_DEV_CMDLINE, nand_flash_dev_id);
      #endif
      
#ifdef CFG_FACTORY_MODE
setup_boot_tag(FACTORY_BOOT);
#endif


      //*************
      //* parse recovery image header
      //* 
      ret = mboot_android_load_factoryimg_hdr(CFG_FACTORY_NAME, CFG_BOOTIMG_LOAD_ADDR);
            
      if (ret < 0) {
printf("factory image doesn't exist in SD card\n");
 // load boot image from nand
     ret = mboot_android_load_bootimg_hdr(PART_BOOTIMG, CFG_BOOTIMG_LOAD_ADDR);            
     if (ret < 0) {
 msg_header_error("Android Boot Image");
     }            
     ret = mboot_android_load_bootimg(PART_BOOTIMG, CFG_BOOTIMG_LOAD_ADDR);            
        if (ret < 0) {
msg_img_error("Android Boot Image");
     }          
      }            
      else
      {
   // load the factory image
     ret = mboot_android_load_factoryimg(CFG_FACTORY_NAME, CFG_BOOTIMG_LOAD_ADDR);            
     if (ret < 0) {
 msg_img_error("Android Factory Image");
        }
      }
break;
//********************************************************************
//* ATE_FACTORY_BOOT
//********************************************************************
case ATE_FACTORY_BOOT:
      #if defined(CFG_NAND_BOOT)
      strlen += sprintf(commandline, "%s%s%x%s%x", 
                commandline, NAND_MANF_CMDLINE, nand_flash_man_code, NAND_DEV_CMDLINE, nand_flash_dev_id);
      #endif
      
#ifdef CFG_FACTORY_MODE
setup_boot_tag(ATE_FACTORY_BOOT);
#endif


      //*************
      //* parse recovery image header
      //* 
      ret = mboot_android_load_factoryimg_hdr(CFG_FACTORY_NAME, CFG_BOOTIMG_LOAD_ADDR);
            
      if (ret < 0) {
printf("factory image doesn't exist in SD card\n");
 // load boot image from nand
     ret = mboot_android_load_bootimg_hdr(PART_BOOTIMG, CFG_BOOTIMG_LOAD_ADDR);            
     if (ret < 0) {
 msg_header_error("Android Boot Image");
     }            
     ret = mboot_android_load_bootimg(PART_BOOTIMG, CFG_BOOTIMG_LOAD_ADDR);            
        if (ret < 0) {
msg_img_error("Android Boot Image");
     }          
      }            
      else
      {
   // load the factory image
     ret = mboot_android_load_factoryimg(CFG_FACTORY_NAME, CFG_BOOTIMG_LOAD_ADDR);            
     if (ret < 0) {
 msg_img_error("Android Factory Image");
        }
      }
break;
//********************************************************************
//* SW BOOT
//********************************************************************
case SW_REBOOT:
setup_boot_tag(SW_REBOOT);
      ret = mboot_android_load_bootimg_hdr(PART_BOOTIMG, CFG_BOOTIMG_LOAD_ADDR);          
      if (ret < 0) {
 msg_header_error("Android Boot Image");
      }
      ret = mboot_android_load_bootimg(PART_BOOTIMG, CFG_BOOTIMG_LOAD_ADDR);            
      if (ret < 0) {
 msg_img_error("Android Boot Image");
      }       
break;        
//********************************************************************
//* ALARM BOOT
//********************************************************************
case ALARM_BOOT:
#if defined(CFG_NAND_BOOT)
      strlen += sprintf(commandline, "%s%s%x%s%x", 
                commandline, NAND_MANF_CMDLINE, nand_flash_man_code, NAND_DEV_CMDLINE, nand_flash_dev_id);
#endif


 setup_boot_tag(ALARM_BOOT);


      ret = mboot_android_load_bootimg_hdr(PART_BOOTIMG, CFG_BOOTIMG_LOAD_ADDR);            
      if (ret < 0) {
msg_header_error("Android Boot Image");
      }
      
#ifdef CFG_UBOOT_PROFILING
      time_load_bootimg= get_timer(0);
#endif      
      ret = mboot_android_load_bootimg(PART_BOOTIMG, CFG_BOOTIMG_LOAD_ADDR);            
#ifdef CFG_UBOOT_PROFILING
        printf("[PROFILE] ------- load boot.img takes %d ms -------- \n", get_timer(time_load_bootimg));
#endif


      if (ret < 0) {
  msg_img_error("Android Boot Image");
      }          
break;    
}


//*************
//* relocate rootfs (ignore rootfs header)
//*
#ifdef CFG_UBOOT_PROFILING
    time_rootfs = get_timer(0);
#endif
    //if(g_boot_mode == RECOVERY_BOOT)
    //{
      memcpy((char *)CFG_RAMDISK_LOAD_ADDR, (char *)(g_rmem_off), g_rimg_sz);
    //}
    g_rmem_off = CFG_RAMDISK_LOAD_ADDR;
#ifdef CFG_UBOOT_PROFILING
    printf("[PROFILE] ------- reloate rootfs takes %d ms -------- \n", get_timer(time_rootfs));
#endif
    
          strlen += sprintf(commandline, "%s%s%s",
                                      commandline, 
                                      " uboot_ver=" UBOOT_VERSION_CLI,
                                      " uboot_build_ver=" BUILD_VERSION_CLI
                                      );
#ifdef CFG_UBOOT_PROFILING
        ubt = ((unsigned int)get_timer(boot_time)) + 810;
        strlen += sprintf(commandline, "%s%s%d", commandline, ".ubt.", ubt);
#endif    


    /**
     * The function "custom_port_in_kernel" is used to modify UART port acorrding different requirement. 
     * It may change ttyMT3 to ttyMT0. This function is implemented at uart.c. 
     */
    custom_port_in_kernel(g_boot_mode, commandline);


strlen += sprintf(commandline, "%s lcm=%1d-%s", commandline, DISP_IsLcmFound(), mt65xx_disp_get_lcm_id());
strlen += sprintf(commandline, "%s fps=%1d", commandline, mt65xx_disp_get_lcd_time());
    
setup_commandline_tag (bd, commandline);
  
//#endif //CONFIG_CMDLINE_TAG


//*************
//* dump some starting instruction for debug
//* 
//printf(" theKernel (0x%x)\n",g_kmem_off);
//printf(" theKernel (0x%x) = 0x%x\n",g_kmem_off,DRV_Reg32(g_kmem_off));
//printf(" theKernel (0x%x) = 0x%x\n",g_kmem_off+0x4,DRV_Reg32(g_kmem_off+0x4));
//printf(" theKernel (0x%x) = 0x%x\n",g_kmem_off+0x8,DRV_Reg32(g_kmem_off+0x8));  






//*************
//* dump some starting instruction for debug
//* 
//printf("\n rootfs (0x%x)\n",g_rmem_off);
//printf(" rootfs (0x%x) = 0x%x\n",g_rmem_off,DRV_Reg32(g_rmem_off));
//printf(" rootfs (0x%x) = 0x%x\n",g_rmem_off+0x4,DRV_Reg32(g_rmem_off+0x4));
//printf(" rootfs (0x%x) = 0x%x\n",g_rmem_off+0x8,DRV_Reg32(g_rmem_off+0x8)); 




//*************
//* specify the kernel jumping address
//* 
  theKernel = (void (*)(int, int, uint)) (g_kmem_off);
//printf("\n > kernel mem offset (not include header) = 0x%x\n",theKernel);




//*************
//* specify the rootfs starting address
//* 
  initrd_start = g_rmem_off;
  initrd_end = initrd_start + g_rimg_sz;  
//printf(" > rootfs mem offset (not include header) = 0x%x\n\n",initrd_start);




#ifdef CONFIG_INITRD_TAG
if (initrd_start && initrd_end)
 setup_initrd_tag (bd, initrd_start, initrd_end);
#endif
#if CONFIG_VIDEOLFB_TAG
setup_videolfb_tag ((gd_t *) gd);
#endif
setup_end_tag (bd);
#endif




#ifdef CFG_UBOOT_PROFILING
  printf("[PROFILE] ------- do_nand_boot takes %d ms -------- \n", get_timer(time_do_nand_boot));
  printf("[MBOOT] ------- UBoot boot kernel takes %d ms -------- \n", get_timer(boot_time));
#endif


  printf("NAND BOOT\n");
#ifdef CONFIG_LCD
  video_printf("NAND BOOT\n");
  video_printf("Boot Linux Kernel\n");  
#endif


//*****************
//* to centralize deinit process, moving 
//* "Uboot_power_saving" to "cleanup_before_linux"
//*
cleanup_before_linux();


printf(" > kernel mem offset (not include header) = 0x%x\n",theKernel);




//*****************
//* jump to kernel
//*
theKernel(0, bd->bi_arch_number, bd->bi_boot_params);
return 0;


 g_kmem_off =  CFG_KIMAGE_LOAD_ADDR;

:#define CFG_KIMAGE_LOAD_ADDR   (RIL_SIZE + 0x8000)

#ifdef CFG_RESERVE_MEM_FOR_RIL
  #if defined (MODEM_3G)    
    #define RIL_SIZE                0x1600000
  #elif defined (MODEM_2G)
    #define RIL_SIZE                0x0A00000
  #endif
#else
    #define RIL_SIZE  0    
#endif
 

# configs/compile.mk used due to compile code different according to platform include $(TOPDIR)/rules.mk include $(T_PRODUCT_CONFIG_DIR)/$(PR_NAME)/device_info.config include $(T_PRODUCT_CONFIG_DIR)/$(PR_NAME)/buildroot.config UBOOT_SOC_TYPE:=$(if $(CONFIG_TARGET_ssc30x_ssc305)\ ,ssc305) ifdef CONFIG_USE_NAND_FLASH DEFCONFIG:=$(UBOOT_SOC_TYPE)_nand_config REAL_DEFCONFIG:=$(UBOOT_SOC_TYPE)_nand_defconfig else DEFCONFIG:=$(UBOOT_SOC_TYPE)_config REAL_DEFCONFIG:=$(UBOOT_SOC_TYPE)_defconfig endif ifeq ($(CONFIG_COMPILE_factory_boot),y) ifneq ($(CONFIG_COMPILE_normal_boot),y) export FACTORY_BOOT_ONLY := y endif endif # 默认redboot ifndef CONFIG_FLASH_PARTITION_TYPE CONFIG_FLASH_PARTITION_TYPE:=redboot endif include $(PKG_SRC_DIR)/configs/normalboot.mk include $(PKG_SRC_DIR)/configs/factoryboot.mk ifeq ($(CONFIG_COMPILE_normal_boot),y) Hooks/Compile/Pre += normal_boot_$(CONFIG_FLASH_PARTITION_TYPE)/Prepare Hooks/Compile/Post += normal_boot_$(CONFIG_FLASH_PARTITION_TYPE)/Compile Hooks/Install/Post += normal_boot_$(CONFIG_FLASH_PARTITION_TYPE)/Install Hooks/InstallDev/Post += normal_boot_$(CONFIG_FLASH_PARTITION_TYPE)/InstallDev endif ifeq ($(CONFIG_COMPILE_factory_boot),y) Hooks/Compile/Pre += factory_boot_$(CONFIG_FLASH_PARTITION_TYPE)/Prepare Hooks/Compile/Post += factory_boot_$(CONFIG_FLASH_PARTITION_TYPE)/Compile Hooks/Install/Post += factory_boot_$(CONFIG_FLASH_PARTITION_TYPE)/Install Hooks/InstallDev/Post += factory_boot_$(CONFIG_FLASH_PARTITION_TYPE)/InstallDev endif Build/Compile= Build/Install= Build/InstallDev=$(empty) 这是makefile,我希望确认编译时UBOOT_SOC_TYPE到底值为什么,如何加点打印编译
09-24
<think>好的,用户现在有一个Makefile片段,想要确认在编译时UBOOT_SOC_TYPE的值是什么,并希望添加打印语句来调试。我需要先仔细分析这段Makefile的逻辑,然后给出如何正确打印变量的方法。 首先,用户提供的Makefile代码中,UBOOT_SOC_TYPE被定义为一个变量,使用$(if $(CONFIG_TARGET_ssc30x_ssc305), ssc305)。这说明如果CONFIG_TARGET_ssc30x_ssc305被定义,则UBOOT_SOC_TYPE的值为ssc305,否则为空。接下来,用户可能需要确认这个变量的值,特别是在实际编译过程中是否被正确设置。 接下来,用户想知道如何添加打印语句。在Makefile中,常用的调试方法是使用$(info)、$(warning)或$(error)函数来输出变量的值。比如,添加$(info UBOOT_SOC_TYPE is $(UBOOT_SOC_TYPE))会在编译时打印该变量的值。需要注意的是,这些语句的位置要正确,确保在变量定义之后执行。 然后,我需要检查用户提供的Makefile结构,确定在哪里插入打印语句最合适。通常,在变量定义之后立即打印,或者在某个目标中添加,以确保在编译过程中输出变量的值。例如,在UBOOT_SOC_TYPE定义后添加$(info ...),或者在Build/Compile等目标中加入打印语句。 另外,用户提到之前的问题是关于目录名称不匹配,可能需要确认UBOOT_SOC_TYPE是否正确设置为ssc375,但根据当前Makefile中的条件,只有当CONFIG_TARGET_ssc30x_ssc305存在时才会设置为ssc305,否则为空。这可能导致变量未正确设置,进而影响后续的目录生成。因此,用户可能需要检查配置中的CONFIG_TARGET_ssc30x_ssc305是否被正确启用,或者是否需要调整条件以支持ssc375。 此外,用户可能需要了解如何验证他们的修改是否生效。例如,在编译时查看输出信息,确认变量值是否正确,或者检查生成的目录名是否符合预期。同时,提醒用户注意Makefile中的其他可能影响变量值的部分,比如其他配置文件的包含或环境变量的设置。 最后,总结用户的需求:确认UBOOT_SOC_TYPE的值,并在Makefile中添加打印语句。需要给出具体的步骤,指出在哪个位置添加打印命令,并解释不同方法的优缺点,如使用info、warning或error的区别。同时,建议用户检查配置选项是否正确启用,以确保变量被正确赋值。</think>要在编译时查看 `UBOOT_SOC_TYPE` 的值,可以在 Makefile 中添加打印语句。以下是具体操作步骤: --- ### 1. **在变量定义后直接打印** 在 `UBOOT_SOC_TYPE` 定义后添加 `$(info)` 或 `$(warning)`,例如: ```makefile UBOOT_SOC_TYPE:=$(if $(CONFIG_TARGET_ssc30x_ssc305),ssc305) $(info UBOOT_SOC_TYPE is [${UBOOT_SOC_TYPE}]) # 打印变量值 ``` 或: ```makefile $(warning UBOOT_SOC_TYPE is [${UBOOT_SOC_TYPE}]) # 打印并标为警告 ``` ### 2. **在编译目标中打印** 在 `Build/Compile` 或 `Build/InstallDev` 中添加打印逻辑: ```makefile Build/Compile=$(info UBOOT_SOC_TYPE during compile: ${UBOOT_SOC_TYPE}) ``` ### 3. **通过环境变量强制赋值(临时调试)** 在命令行中运行 `make` 时附加变量: ```bash make UBOOT_SOC_TYPE=ssc375 ``` 这会覆盖 Makefile 中的定义,用于测试不同值的影响。 --- ### 完整修改示例 ```makefile UBOOT_SOC_TYPE:=$(if $(CONFIG_TARGET_ssc30x_ssc305),ssc305) $(info "UBOOT_SOC_TYPE = ${UBOOT_SOC_TYPE}") # 新增打印 ifdef CONFIG_USE_NAND_FLASH DEFCONFIG:=$(UBOOT_SOC_TYPE)_nand_config REAL_DEFCONFIG:=$(UBOOT_SOC_TYPE)_nand_defconfig else DEFCONFIG:=$(UBOOT_SOC_TYPE)_config REAL_DEFCONFIG:=$(UBOOT_SOC_TYPE)_defconfig endif ``` --- ### 编译时输出效果 ```bash make[3]: Entering directory 'xxx' "UBOOT_SOC_TYPE = ssc305" ... ``` --- ### 验证方法 1. **检查配置文件** 确保 `CONFIG_TARGET_ssc30x_ssc305` 在 `.config` 或 `device_info.config` 中被启用: ```bash grep CONFIG_TARGET_ssc30x_ssc305 .config # 应输出 CONFIG_TARGET_ssc30x_ssc305=y ``` 2. **强制覆盖测试** 如果希望临时改为 `ssc375`,可在命令行指定: ```bash make UBOOT_SOC_TYPE=ssc375 ``` 3. **检查生成的目录** 根据 `UBOOT_SOC_TYPE` 的值,确认 `general_bin_ssc305` 或 `general_bin_ssc375` 是否被正确引用。 --- ### 注意事项 - `$(info)` 会输出到标准输出,`$(warning)` 会标记为黄色警告,`$(error)` 会直接中断编译。 - 如果变量值为空,可能是 `CONFIG_TARGET_ssc30x_ssc305` 未在配置中启用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值