【问题标题】:U-Boot bootcmd (auto vs manual)U-Boot bootcmd(自动与手动)
【发布时间】:2017-07-19 22:16:47
【问题描述】:

我遇到了一个问题,当我打开设备电源时,它会挂在

Starting kernel ...

或者循环使用

Starting kernel ...

resetting ...

但是,如果我中断启动过程并手动运行启动,即:

=> run bootcmd
or
=> boot

然后内核加载正常。

根据 DENX (5.9.6.5) 这相当于 Uboot 应该自动执行的操作。

有谁知道让 uboot 自己运行与手动中断和运行引导之间是否有区别?否则,我该如何开始调试呢?

环境

=> printenv
autoload=no
baudrate=115200
board_name=EVK
board_rev=pilot
boot_fdt=try
bootcmd=echo Booting from network ...; usb start; setenv ethact asx0; if dhcp && tftp $loadaddr $bootfile && tftp $f
dt_addr $fdt_file; then run nfsboot; else echo WARN: Issue with TFTP.; run sdboot; fi;
bootdelay=3
bootfile=zImage
bootscript=echo Running bootscript from mmc ...; source
console=ttymxc1
ethact=asx0
ethprime=FEC
fdt_addr=0x83000000
fdt_file=imx6ul-pilot-v1-evk.dtb
fdt_high=0xffffffff
image=zImage
initrd_high=0xffffffff
ip_dyn=yes
loadaddr=0x80800000
loadbootscript=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${script};
loadfdt=fatload mmc ${mmcdev}:${mmcpart} ${fdt_addr} ${fdt_file}
loadimage=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${image}
mmcargs=setenv bootargs console=${console},${baudrate} root=${mmcroot}
mmcautodetect=yes
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;
mmcdev=1
mmcpart=1
mmcroot=/dev/mmcblk1p2 rootwait rw
netargs=setenv bootargs console=${console},${baudrate} root=/dev/nfs ip=dhcp nfsroot=${serverip}:${nfsroot},v3,tcp
nfsboot=run netargs; bootz $loadaddr - $fdt_addr
nfsroot=/nfs/rootfs
script=boot.scr
sdboot=echo Booting from mmc ...; mmc dev ${mmcdev}; mmc dev ${mmcdev}; if mmc rescan; then if run loadbootscript; then run bootscript; else if run loadimage; then run mmcboot; else echo ERROR: Cannot run loadimage; fi; fi; else run ERROR: Cannot run mmc rescan; fi;
serverip=192.168.0.219

Environment size: 1714/8188 bytes

【问题讨论】:

  • 默认启动命令是在编译阶段定义的。您的 U-Boot 可能是使用与普通 run bootcmd 不同的命令序列编译的。
  • 你知道在源代码中哪里可以找到启动的默认命令吗?
  • 您认为自动引导和bootrun bootcmd 命令应该是等价的假设是正确的。但也有替代变量,例如 altbootcmdfailbootcmd。发布 U-Boot 环境变量,以及两种情况的引导日志,这样我们就可以确保您没有忽略任何内容。 “我如何开始调试这个?” -- 在 common/autoboot.c 的顶部插入#define DEBUG 1(并重新编译)以启用 bootcmd(字符串)变量在其执行之前。
  • @DanielBujak -- 另一条评论是错误的。 U-Boot 命令可以通过配置启用或禁用,但不能重新定义(除非修改代码)。可以为各种环境变量,尤其是 bootcmd 分配默认值。但是每个变量只能有一个值,所以一旦更改(并保存)一个变量,默认值就没有了(除非发现保存的环境无效)。
  • @sawdust,在判断其他评论之前检查来源。一个人可能会或可能不会定义一个默认命令行,默认情况下将用于自动启动。

标签: embedded-linux u-boot


【解决方案1】:

此问题与 SDBOOT 环境变量有关:

sdboot = echo Booting from mmc ...; mmc dev ${mmcdev}; mmc dev ${mmcdev}; 
         if mmc rescan; then 
             if run loadbootscript; then 
                 run bootscript; 
             else 
                 if run loadimage; then 
                     run mmcboot; 
                 else 
                     echo ERROR: Cannot run loadimage; 
                 fi; 
             fi; 
         else 
             echo ERROR: Cannot run mmc rescan; 
         fi;

加载引导脚本一直失败,并显示“** 无法读取文件 boot.scr **”。我仍然不确定是什么导致了差异,但删除 loadbootscript 分支并直接进入 loadimage 解决了问题。

【讨论】:

    猜你喜欢
    • 2020-06-24
    • 2020-08-24
    • 2018-10-25
    • 2019-04-03
    • 1970-01-01
    • 2018-11-04
    • 2019-05-03
    • 2016-09-10
    • 1970-01-01
    相关资源
    最近更新 更多