为什么u-boot忽略uEnv.txt中的IF语句

问题描述 投票:1回答:1

我已经在网上搜索了,但找不到答案,因此,我在这里尝试碰运气是最后的希望。我有一个BeagleBone Black,无论是否插入SD卡,都想从MMC引导。如果未插入SD,则MMC为/ dev / mmcblk0问题在于,插入SD后,MMC变为/ dev / mmcblk1。我原来的uEnv.txt看起来像这样。

uname_r=4.1.36-bone24
dtb=am335x-boneblack-emmc-overlay.dtb
optargs="consoleblank=0"

如果插入了SD卡,则可以使用/ dev / mmcblk1p2启动。如果未插入SD卡,它仍会尝试从/ dev / mmcblk1p2引导,但由于MMC变为/ dev / mmcblk0而不能。

我的没有SD卡引导的uEnv.txt看起来像这样,可以从MMC引导。

uname_r=4.1.36-bone24
dtb=am335x-boneblack-emmc-overlay.dtb
optargs="consoleblank=0"
mmcdev=0
mmcpart=2

现在我尝试在uEnv.txt中添加一个If If Else语句,这是我在网络上的研究发现的。

uname_r=4.1.36-bone24
dtb=am335x-boneblack-emmc-overlay.dtb
optargs="consoleblank=0"
mmcdev=0 //this gets executed because root changes from /dev/mmcblk1p2 to /dev/mmcblk0p2
if mmc rescan; then mmcdev=1;fi
mmcpart=2

但是似乎该IF语句完全没有影响。但是我知道uEnv.txt会被读取,否则它将不会尝试从/ dev / mmcblk0p2开始。

如何获得在插入或不插入SD卡的情况下BBB总是从MMC引导?

这是带有未插入SD卡的最后uEnv.txt的u-boot调试输出。

U-Boot 2016.03-dirty (Oct 03 2019 - 12:55:58 +0200)

       Watchdog enabled
I2C:   ready
DRAM:  512 MiB
Reset Source: Power-on reset has occurred.
MMC:   OMAP SD/MMC: 0, OMAP SD/MMC: 1
Using default environment

Net:   <ethaddr> not set. Validating first E-fuse MAC
Could not get PHY for cpsw: addr 0
cpsw, usb_ether
Press SPACE to abort autoboot in 2 seconds
Card did not respond to voltage select!
gpio: pin 56 (gpio 56) value is 0
gpio: pin 55 (gpio 55) value is 0
gpio: pin 54 (gpio 54) value is 0
gpio: pin 53 (gpio 53) value is 1
Card did not respond to voltage select!
Card did not respond to voltage select!
switch to partitions #0, OK
mmc1(part 0) is current device
Scanning mmc 1:1...
gpio: pin 56 (gpio 56) value is 0
gpio: pin 55 (gpio 55) value is 0
gpio: pin 54 (gpio 54) value is 0
gpio: pin 53 (gpio 53) value is 1
switch to partitions #0, OK
mmc1(part 0) is current device
gpio: pin 54 (gpio 54) value is 1
Checking for: /uEnv.txt ...
Checking for: /boot.scr ...
Checking for: /boot/boot.scr ...
Checking for: /boot/uEnv.txt ...
gpio: pin 55 (gpio 55) value is 1
136 bytes read in 19 ms (6.8 KiB/s)
Loaded environment from /boot/uEnv.txt
debug: [dtb=am335x-boneblack-emmc-overlay.dtb] ...
Using: dtb=am335x-boneblack-emmc-overlay.dtb ...
Checking if uname_r is set in /boot/uEnv.txt...
gpio: pin 56 (gpio 56) value is 1
Running uname_boot ...
loading /boot/vmlinuz-4.1.36-bone24 ...
6383816 bytes read in 373 ms (16.3 MiB/s)
loading /boot/dtbs/4.1.36-bone24/am335x-boneblack-emmc-overlay.dtb ...
53230 bytes read in 45 ms (1.1 MiB/s)
debug: [console=ttyO0,115200n8 consoleblank=0 root=/dev/mmcblk0p2 ro rootfstype=ext4 rootwait] ...
debug: [bootz 0x82000000 - 0x88000000] ...
Kernel image @ 0x82000000 [ 0x000000 - 0x6168c8 ]
## Flattened Device Tree blob at 88000000
   Booting using the fdt blob at 0x88000000
   Loading Device Tree to 8fff0000, end 8fffffed ... OK

Starting kernel ...

这里是u-boot调试输出,最后一个uEnv.txt已插入SD卡。

U-Boot 2016.03-dirty (Oct 12 2016 - 15:19:30 +0200)

       Watchdog enabled
I2C:   ready
DRAM:  512 MiB
Reset Source: Global warm SW reset has occurred.
Reset Source: Power-on reset has occurred.
MMC:   OMAP SD/MMC: 0, OMAP SD/MMC: 1
Using default environment

Net:   <ethaddr> not set. Validating first E-fuse MAC
Could not get PHY for cpsw: addr 0
cpsw, usb_ether
Press SPACE to abort autoboot in 2 seconds
switch to partitions #0, OK
mmc0 is current device
Scanning mmc 0:1...
gpio: pin 56 (gpio 56) value is 0
gpio: pin 55 (gpio 55) value is 0
gpio: pin 54 (gpio 54) value is 0
gpio: pin 53 (gpio 53) value is 1
switch to partitions #0, OK
mmc0 is current device
gpio: pin 54 (gpio 54) value is 1
Checking for: /uEnv.txt ...
Checking for: /boot.scr ...
Checking for: /boot/boot.scr ...
Checking for: /boot/uEnv.txt ...
** Invalid partition 2 **
** Invalid partition 3 **
** Invalid partition 4 **
** Invalid partition 5 **
** Invalid partition 6 **
** Invalid partition 7 **
switch to partitions #0, OK
mmc1(part 0) is current device
Scanning mmc 1:1...
gpio: pin 56 (gpio 56) value is 0
gpio: pin 55 (gpio 55) value is 0
gpio: pin 54 (gpio 54) value is 0
gpio: pin 53 (gpio 53) value is 1
switch to partitions #0, OK
mmc1(part 0) is current device
gpio: pin 54 (gpio 54) value is 1
Checking for: /uEnv.txt ...
Checking for: /boot.scr ...
Checking for: /boot/boot.scr ...
Checking for: /boot/uEnv.txt ...
gpio: pin 55 (gpio 55) value is 1
136 bytes read in 19 ms (6.8 KiB/s)
Loaded environment from /boot/uEnv.txt
debug: [dtb=am335x-boneblack-emmc-overlay.dtb] ...
Using: dtb=am335x-boneblack-emmc-overlay.dtb ...
Checking if uname_r is set in /boot/uEnv.txt...
gpio: pin 56 (gpio 56) value is 1
Running uname_boot ...
loading /boot/vmlinuz-4.1.36-bone24 ...
6383816 bytes read in 372 ms (16.4 MiB/s)
loading /boot/dtbs/4.1.36-bone24/am335x-boneblack-emmc-overlay.dtb ...
53230 bytes read in 44 ms (1.2 MiB/s)
debug: [console=ttyO0,115200n8 consoleblank=0 root=/dev/mmcblk0p2 ro rootfstype=ext4 rootwait] ...
debug: [bootz 0x82000000 - 0x88000000] ...
Kernel image @ 0x82000000 [ 0x000000 - 0x6168c8 ]
## Flattened Device Tree blob at 88000000
   Booting using the fdt blob at 0x88000000
   Loading Device Tree to 8fff0000, end 8fffffed ... OK

Starting kernel ...

主要区别是我有很多“无效分区”,并且uEnv.txt被读出两次。

beagleboneblack u-boot
1个回答
0
投票

问题是uEnv.txt不是逐字执行的Shell脚本。 include/environment/ti/mmc.h的相关部分如下所示:

        "bootenvfile=uEnv.txt\0" \
        "importbootenv=echo Importing environment from mmc${mmcdev} ...; " \
                "env import -t ${loadaddr} ${filesize}\0" \
        "loadbootenv=fatload mmc ${mmcdev} ${loadaddr} ${bootenvfile}\0" \
        "loadimage=load ${devtype} ${bootpart} ${loadaddr} ${bootdir}/${bootfile}\0" \
        "loadfdt=load ${devtype} ${bootpart} ${fdtaddr} ${bootdir}/${fdtfile}\0" \
        "envboot=mmc dev ${mmcdev}; " \
                "if mmc rescan; then " \
                        "echo SD/MMC found on device ${mmcdev};" \
                        "if run loadbootscript; then " \
                                "run bootscript;" \
                        "else " \
                                "if run loadbootenv; then " \
                                        "echo Loaded env from ${bootenvfile};" \
                                        "run importbootenv;" \
                                "fi;" \
                                "if test -n $uenvcmd; then " \
                                        "echo Running uenvcmd ...;" \
                                        "run uenvcmd;" \
                                "fi;" \
                        "fi;" \
                "fi;\0" \

因此,我们寻找uEnv.txt并将其加载到内存中,然后将其导入到环境中。如果我们在环境中定义了一个uenvcmd(按照惯例现在不存在),那么我们将运行它。您的if / else需要以类似的方式处理:

uenvcmd=if mmc rescan;mmcdev=1;fi

所有这些都不能解决您的实际问题。要解决您的实际问题,您无需将root=/dev/mmcblk...传递给Linux,因为它不稳定,而只需传递root=PARTUUID=....即可,因为这将是稳定的,而现代的U-Boot(和环境)将为您找到价值并通过它。

© www.soinside.com 2019 - 2024. All rights reserved.