AR# 69780

2016.4-2017.4 Zynq UltraScale+ MPSoC: eMMC (SDIO0) および SD (SDIO1) の両方がデザインでイネーブルになっていると、SD ブートを設定する U-Boot 環境変数が PetaLinux で正しく上書きされない

説明

2016.4 ~ 2017.4 Zynq UltraScale+ MPSoC: eMMC (SDIO0) および SD (SDIO1) の両方がデザインでイネーブルになっていると、SD ブートを設定する U-Boot 環境変数が PetaLinux で正しく上書きされません。

次に例を示します。

SDIO0 に eMMC デバイス、SDIO1 に SD カードがあります。 

次のように、SDIO1 デバイスからブートするように PetaLinux を設定しました。

petalinux-config ---> Subsystem AUTO Hardware Settings ---> SD/SDIO Settings ---> Primary SD/SDIO (psu_sd_1)

ところが、それでもツールで U-Boot が生成され、なぜか、その U-Boot は mmc 1 からではなく、予期どおりに mmc 0 からブートします。

ソリューション

この問題を解決するには、U-Boot 環境変数を変更する必要があります。

1) U-Boot 環境変数定義 CONFIG_EXTRA_ENV_SETTINGS を <plnx-proj-root>/project-spec/meta-plnx-generated/recipes-bsp/u-boot/configs/platform-auto.h からコピーします。

これをファイル <plnx-proj-root>/project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h に追加します。

2) 次のように、cp_kernel2ram の環境変数を mmc 0 から mmc 1 に変更します。

#define
 CONFIG_EXTRA_ENV_SETTINGS \
    SERIAL_MULTI \
    CONSOLE_ARG \
    DFU_ALT_INFO \
    PSSERIAL0 \
    "nc=setenv stdout nc;setenv stdin nc;\0" \
    "ethaddr=00:0a:35:00:22:01\0" \
    "sdbootdev=0\0" \
    "bootenv=uEnv.txt\0" \
    "importbootenv=echo \"Importing environment from SD ...\"; " \
        "env import -t ${loadbootenv_addr} $filesize\0" \
    "loadbootenv=load mmc $sdbootdev:$partid ${loadbootenv_addr}
${bootenv}\0" \
    "sd_uEnvtxt_existence_test=test -e mmc $sdbootdev:$partid /uEnv.txt\0" \
 
    "uenvboot=" \
        "if run sd_uEnvtxt_existence_test; then " \
            "run loadbootenv; " \
            "echo Loaded environment from ${bootenv}; " \
            "run importbootenv; " \
            "fi; " \
        "if test -n $uenvcmd; then " \
            "echo Running uenvcmd ...; " \
            "run uenvcmd; " \
        "fi\0" \
    "autoload=no\0" \
    "clobstart=0x10000000\0" \
    "netstart=0x10000000\0" \
    "dtbnetstart=0x11800000\0" \
    "loadaddr=0x10000000\0" \
    "boot_img=BOOT.BIN\0" \
    "load_boot=tftpboot ${clobstart} ${boot_img}\0" \
    "update_boot=setenv img boot; setenv psize ${bootsize}; setenv
installcmd \"install_boot\"; run load_boot ${installcmd}; setenv img;
setenv psize; setenv installcmd\0" \
    "install_boot=mmcinfo && fatwrite mmc 0 ${clobstart}
${boot_img} ${filesize}\0" \
    "bootenvsize=0x40000\0" \
    "bootenvstart=0x1e00000\0" \
    "eraseenv=sf probe 0 && sf erase ${bootenvstart}
${bootenvsize}\0" \
    "jffs2_img=rootfs.jffs2\0" \
    "load_jffs2=tftpboot ${clobstart} ${jffs2_img}\0" \
    "update_jffs2=setenv img jffs2; setenv psize ${jffs2size}; setenv
installcmd \"install_jffs2\"; run load_jffs2 test_img; setenv img;
setenv psize; setenv installcmd\0" \
    "sd_update_jffs2=echo Updating jffs2 from SD; mmcinfo &&
fatload mmc 0:1 ${clobstart} ${jffs2_img} && run
install_jffs2\0" \
    "install_jffs2=sf probe 0 && sf erase ${jffs2start}
${jffs2size} && " \
        "sf write ${clobstart} ${jffs2start} ${filesize}\0" \
    "kernel_img=image.ub\0" \
    "load_kernel=tftpboot ${clobstart} ${kernel_img}\0" \
    "update_kernel=setenv img kernel; setenv psize ${kernelsize}; setenv
installcmd \"install_kernel\"; run load_kernel ${installcmd}; setenv
img; setenv psize; setenv installcmd\0" \
    "install_kernel=mmcinfo && fatwrite mmc 0 ${clobstart}
${kernel_img} ${filesize}\0" \
    "cp_kernel2ram=mmcinfo && fatload mmc 1 ${netstart} ${kernel_img}\0" \
    "dtb_img=system.dtb\0" \
    "load_dtb=tftpboot ${clobstart} ${dtb_img}\0" \
    "update_dtb=setenv img dtb; setenv psize ${dtbsize}; setenv installcmd
\"install_dtb\"; run load_dtb test_img; setenv img; setenv psize; setenv
 installcmd\0" \
    "sd_update_dtb=echo Updating dtb from SD; mmcinfo && fatload
mmc 0:1 ${clobstart} ${dtb_img} && run install_dtb\0" \
    "loadbootenv_addr=0x00100000\0" \
    "fault=echo ${img} image size is greater than allocated place -
partition ${img} is NOT UPDATED\0" \
    "test_crc=if imi ${clobstart}; then run test_img; else echo ${img} Bad
CRC - ${img} is NOT UPDATED; fi\0" \
    "test_img=setenv var \"if test ${filesize} -gt ${psize}\\; then run
fault\\; else run ${installcmd}\\; fi\"; run var; setenv var\0" \
    "netboot=tftpboot ${netstart} ${kernel_img} && bootm\0" \
    "default_bootcmd=run uenvboot; run cp_kernel2ram && bootm
${netstart}\0" \
""


3) 次のコマンドを実行します。

petalinux-build -c u-boot -x cleanall
petalinux-build -c u-boot
AR# 69780
日付 12/20/2017
ステータス アクティブ
種類 既知の問題
デバイス
ツール 詳細 概略
Boards & Kits