uboot修正设备树(fixup)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liebao_han/article/details/84444824

说明:源码来自opensource的最新uboot,以sdhc的设备树节点被uboot修改为例说明。
调用过程;

do_bootm(cmd/bootm.c)//通用命令
->do_bootm_subcommand(cmd/bootm.c)
->do_bootm_states(common/bootm.c)
->bootm_os_get_boot_func() (common/bootm_os.c)
return boot_os[os];
->static boot_os_fn *boot_os[] = { (common/bootm_os.c)//通用代码
    [IH_OS_U_BOOT] = do_bootm_standalone,
#ifdef CONFIG_BOOTM_LINUX
    [IH_OS_LINUX] = do_bootm_linux,

->do_bootm_linux(arch/arm/lib/bootm.c)  //架构相关
->boot_prep_linux(arch/arc/lib/bootm.c) //架构相关
->image_setup_linux(common/image.c)
->image_setup_libfdt(common/image-fdt.c)
 ->ft_board_setup( board/freescale/ls2080ardb/ls2080ardb.c) //板级相关
->ft_cpu_setup(arch/arm/cpu/armv8/fsl-layerscape/fdt.c)

eg:#ifdef CONFIG_FSL_ESDHC
    		fdt_fixup_esdhc(blob, bd);//对sdhc修正
#endif
->fdt_fixup_esdhc(drivers/mmc/fsl_esdhc.c)
->esdhc_status_fixup(修改status状态 okey 或者disabled  使能/失能设备)
->

解析fixup过程:
#ifdef CONFIG_OF_LIBFDT
__weak int esdhc_status_fixup(void *blob, const char *compat)
{   
#ifdef CONFIG_FSL_ESDHC_PIN_MUX    //此宏必须在.h文件中定义
    if (!hwconfig("esdhc")) {//hwconfig环境变量没有设置esdhc选项eg:=> pri hwconfig 
hwconfig=fsl_ddr:bank_intlv=auto;dspi
        do_fixup_by_compat(blob, compat, "status", "disabled", 
                sizeof("disabled"), 1); //改变status的状态为disabled
        return 1;
    }
#endif
    return 0;
}

总结:
在执行bootm启动linux内核和设备树之前,会层层调用从通用的代码到板级soc相关的代码,会根据环境变量来选择是否修改sdhc的状态,即是修改传递给linux内核的设备树的sdhc节点的status属性值,将其更改为disabled,来失能此设备。

猜你喜欢

转载自blog.csdn.net/liebao_han/article/details/84444824