版权声明:本文为博主原创文章,未经博主允许不得转载。 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,来失能此设备。