run_main_loop

文章目录

  • 1 run_main_loop 执行过程
  • 2 bootcmd 环境变量解析
  • 3 bootz执行过程

1 run_main_loop 执行过程

run_main_loop(common\board_r.c)
	|-> main_loop(common\main.c)
		|-> autoboot_command(common\autoboot.c)	// autoboot_command 函数传入的参数为环境变量 bootcmds
			|-> run_command_list(common\cli.c)	// 传入的参数为(s, -1, 0),其中s为环境变量bootcmds的值
				|-> parse_string_outer(common\cli_hush.c)
					|-> parse_stream_outer(common\cli_hush.c)
						|-> parse_stream(common\cli_hush.c)
						|-> run_list(common\cli_hush.c)
							|-> run_list_real(common\cli_hush.c)
								|-> run_pipe_real(common\cli_hush.c)
									|-> cmd_process(common\command.c)
										|-> find_cmd(common\command.c)	// 查找命令
										|-> cmd_call(common\command.c)	// 执行命令

2 bootcmd 环境变量解析

#define CONFIG_BOOTCOMMAND \
	"run findfdt;" \
	"mmc dev ${mmcdev};" \
	"mmc dev ${mmcdev}; if mmc rescan; then " \
	   "if run loadbootscript; then " \
		   "run bootscript; " \
	   "else " \
		   "if run loadimage; then " \
			   "run mmcboot; " \
		   "else run netboot; " \
		   "fi; " \
	   "fi; " \
	"else run netboot; fi"

	/*** findfdt ***/
	"findfdt="\
		"if test $fdt_file = undefined; then " \
			"if test $board_name = EVK && test $board_rev = 9X9; then " \
				"setenv fdt_file imx6ul-9x9-evk.dtb; fi; " \
			"if test $board_name = EVK && test $board_rev = 14X14; then " \
				"setenv fdt_file imx6ul-14x14-evk.dtb; fi; " \
			"if test $fdt_file = undefined; then " \
				"echo WARNING: Could not determine dtb to use; fi; " \
		"fi;\0" \
	
		"fdt_file=undefined\0"

	/*** mmc dev ${mmcdev} ***/
	"mmc dev ${mmcdev};"	// uboot支持EMMC和SD卡,一般认为EMMC和SD卡是同一个东西,mmc dev表示切换MMC设备
	"mmcdev="__stringify(CONFIG_SYS_MMC_ENV_DEV)"\0"	// (include\configs\mx6ul_14x14_evk.h)	
	#define CONFIG_SYS_MMC_ENV_DEV 1   					// USDHC2 (include\configs\mx6ul_14x14_evk.h)

	/*** mmc rescan ***/
	mmc rescan	// 用于扫描当前开发板上所有的MMC设备,包括EMMC和SD卡
  
	/*** run loadbootscript ***/	
	"loadbootscript=" "fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${script};\0"
		"mmcpart=" __stringify(CONFIG_SYS_MMC_IMG_LOAD_PART) "\0"	// (include\configs\mx6ul_14x14_evk.h)
			#define CONFIG_SYS_MMC_IMG_LOAD_PART 1		// (include\configs\mx6ul_14x14_evk.h)
		"loadaddr="	__stringify(CONFIG_LOADADDR)"\0"	// (include\env_default.h)
			#define CONFIG_LOADADDR 0x82000000			// (include/configs/mx6_common.h)
		"script=boot.scr\0"								// (include/configs/mx6_common.h) 没有这个文件
	展开后得:
		fatload mmc 1:1 0x82000000 boot.scr				// 将mmc设备1的分区1中的boot.scr文件读到DRAM中的0x82000000地址处
  
	/*** run loadimage ***/
	"loadimage=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${image}\0"
		"image=zImage\0"
	展开后得:
		fatload mmc 1:1 0x82000000 zImage				// 将mmc设备1的分区1中的zImage文件读到DRAM中的0x82000000地址处

	/*** run mmcboot ***/
	"mmcboot=echo Booting from mmc ...; " \
		"run mmcargs; " \
		"if test ${boot_fdt} = yes || test ${boot_fdt} = try; then " \
			"if run loadfdt; then " \
				"bootz ${loadaddr} - ${fdt_addr}; " \
			"else " \
				"if test ${boot_fdt} = try; then " \
					"bootz; " \
				"else " \
					"echo WARN: Cannot load the DT; " \
				"fi; " \
			"fi; " \
		"else " \
			"bootz; " \
		"fi;\0" \
		
		/*** run mmcargs ***/
		"mmcargs=setenv bootargs console=${console},${baudrate} " "root=${mmcroot}\0" // 设置环境变量 (include\configs\mx6ul_14x14_evk.h)
			"console=ttymxc0\0"							// (include\configs\mx6ul_14x14_evk.h)
			"baudrate=115200\0"
			"mmcroot=" CONFIG_MMCROOT " rootwait rw\0"	// (include\configs\mx6ul_14x14_evk.h)
            #define CONFIG_MMCROOT "/dev/mmcblk1p2"     // USDHC2 指定跟文件系统位置,传递给内核 (include\configs\mx6ul_14x14_evk.h)
		
		/*** run loadfdt ***/		
		"loadfdt=fatload mmc ${mmcdev}:${mmcpart} ${fdt_addr} ${fdt_file}\0"	// (include\configs\mx6ul_14x14_evk.h)
			"fdt_addr=0x83000000\0"						// (include\configs\mx6ul_14x14_evk.h)
			"fdt_file=imx6ul-14x14-evk.dtb\0"			// (include\configs\mx6ul_14x14_evk.h)
		展开后得:
			fatload mmc 1:1 0x83000000 imx6ul-14x14-evk.dtb				// 将mmc设备1的分区1中的imx6ul-14x14-evk.dtb文件读到DRAM中的0x83000000地址处
		
		/*** bootz ***/
		"bootz ${loadaddr} - ${fdt_addr}; "
		展开后得:
			bootz 0x82000000 - 0x83000000

3 bootz执行过程

do_bootz(cmd\bootz.c)
    |-> bootz_start(cmd\bootz.c)
        |-> do_bootm_states(common\bootm.c)         // state = BOOTM_STATE_START
            |-> bootm_start(common\bootm.c)
        |-> images->ep = simple_strtoul(argv[0], NULL, 16)  // (cmd\bootz.c) 设置内核镜像的起始地址 ep
        |-> bootz_setup(arch\arm\lib\zimage.c)      // 检查魔树,设置zi_start和zi_end两个值
        |-> bootm_find_images(common\bootm.c)       // 查找ramdisk和设备树
            |-> boot_get_fdt(common\image-fdt.c)    // 设置 ft_addr 和 ft_len
    |-> bootm_disable_interrupts(common\bootm.c) 
    |-> images.os.os = IH_OS_LINUX(cmd\bootz.c)
    |-> do_bootm_states(common\bootm.c)
        |-> bootm_os_get_boot_func(common\bootm_os.c)
        |-> boot_fn = do_bootm_linux(common\bootm_os.c)
        |-> need_boot_fn = 0x700
        |-> boot_fn(BOOTM_STATE_OS_PREP, argc, argv, images);
            |-> do_bootm_linux(arch\arm\lib\bootm.c)    // state = BOOTM_STATE_OS_PREP 
                |-> boot_prep_linux(arch\arm\lib\bootm.c)
                    |-> image_setup_linux(common\image.c)   // 使用设备树
        |-> boot_selected_os(common\bootm_os.c)         // state = BOOTM_STATE_OS_GO        
            |-> boot_jump_linux(arch\arm\lib\bootm.c)
                |-> board_jump_and_run(0, machid, r2)   // 进入Linux内核 参数2为机器ID,参数3为设备树首地址

你可能感兴趣的:(imx6ull,uboot,NXP,imx6ull)