此系列博客,仅对Xilinx平台PS端(ARM部分)开发做介绍,不对PL(FPGA)做过多介绍。
目录
五. run_main_loop
此函数实现uboot 启动以后会进入 倒计时,如果在倒计时结束之前按下按下回车键,那么就会进入 uboot 的命令模式,如果倒计时结束以后都没有按下回车键,那么就会自动启动 Linux 内核。
5.1 main_loop
1.autoboot_command:检查倒计时是否结束
2.cli_loop: uboot 的命令行处理函数
六. 自动执行启动内核
6.1 autoboot_command
当在倒计时没有按键按下,则会执行autoboot_command
这里S的值为run distro_bootcmd
6.2 脚本启动
Distro_bootcmd的值为脚本,寻找对应的启动方式的环境变量值
最终会查找boot.scr 脚本去执行镜像,设备树等的搬运,以及启动工作
6.2.1 QSPI
若为QSPI启动方式,执行bootcmd_qspi0环境变量的内容
sf probe 0 0 0: 加载qspi驱动
sf read $scriptaddr $script_offset_f $script_size_f : 从qspi flash中读取脚本到内存中
source ${scriptaddr}: 执行脚本boot.scr
6.2.2 EMMC/SD启动
若为EMMC/SD启动方式,执行bootcmd_mmc0/1环境变量的内容: devnum=0/1; run mmc_boot
run mmc_boot -> run scan_dev_for_boot_part -> run scan_dev_for_boot ->
run scan_dev_for_scripts
scan_dev_for_scripts的内容为:查找MMC分区是否有boot.scr 脚本
若有脚本,则执行run boot_a_script
boot_a_script的值:load ${devtype} ${devnum}:${distro_bootpart} ${scriptaddr} ${prefix}${script}; source ${scriptaddr} 加载分区中的脚本,并source执行脚本