Почему u-boot игнорирует мою инструкцию IF в uEnv.txt - PullRequest
1 голос
/ 03 октября 2019

Я уже искал в Интернете, но не смог найти ответ, поэтому я пытаюсь здесь в качестве последней надежды. У меня есть BeagleBone Black и я хочу загрузиться с MMC независимо от того, вставлена ​​ли SD-карта или нет. Без вставленной 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.

Мой uEnv.txt для загрузки без SD-карты выглядит следующим образом, и этоМожно загружаться из MMC.

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

Теперь я попытался добавить заявление If Else в файл uEnv.txt, как я обнаружил в своем исследовании в Интернете.

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.

Как я могу добиться, чтобы BBB всегда загружался из MMC с или без вставленной SD-карты?

Вот выходные данные отладки u-boot с последним uEnv.txt без вставленной SD-карты.

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 считывается дважды.

1 Ответ

1 голос
/ 03 октября 2019

Проблема в том, что uEnv.txt не является сценарием оболочки, который выполняется дословно. Соответствующий раздел 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 (и окружающая среда) определит это значение для вас и передаст его.

...