« ZyboでLinux | トップページ | Zybo+linaro用のクロスコンパイルメモ »

2015年2月27日 (金)

ZYBOでのu-Bootのカーネル読み込み先

ずっと DOS系+ITRONだったのでLinuxに免疫が無い WebMaster です(苦笑)。

  Zybo で本格的に開発する前に勉強することが多すぎてパンクしていますが、今回は u-Boot の起動を調べて見たので、自分用備忘録です。
  Digilent のgit から clone した u-boot-Digilent-Dev (U-Boot 2014.01-00005-gc29bed9)使っています。

  PL側のRTLを開発するときには、JTAG から次々回路を入れ替えて行きたいのですが、その度にLinuxカーネル含めてPS側JTAG転送していたらやってられません。

  uBoot に TFTPサーバーから送るようにしたりいろいろ出来るようなのですが、今回はSDカードにカーネルその他が一式があるわけなので、そちらに切り替えればきっと幸せになれるはずです。なのでその下調べ。
  u-Boot の各種設定は include/configs 以下にあり、Zybo の場合は zynq_zybo.h というのがありますね。
  また、zynq_zybo.h の中から zynq-common.h が include されていました。

  どうやら、uBoot には環境変数がちゃんとあって、bootcmd という変数が自動起動先を決定しているようです。

  include/env_default.h

  に

#ifdef    CONFIG_BOOTCOMMAND
    "bootcmd="    CONFIG_BOOTCOMMAND        "\0"
#endif

  があり。

  CONFIG_BOOTCOMMAND を追いかけると

zynq_zybo.h  に

#if defined(CONFIG_CMD_ZYNQ_RSA)
#define CONFIG_BOOTCOMMAND        "run rsa_$modeboot"
#else
#define CONFIG_BOOTCOMMAND        "run $modeboot"
#endif

  という記述があり

  $modeboot を追いかけると

  board/xilinx/zynq/board.h に

int board_late_init(void)
{
    switch ((zynq_slcr_get_boot_mode()) & ZYNQ_BM_MASK) {
    case ZYNQ_BM_QSPI:
        setenv("modeboot", "qspiboot");
        break;
    case ZYNQ_BM_NAND:
        setenv("modeboot", "nandboot");
        break;
    case ZYNQ_BM_NOR:
        setenv("modeboot", "norboot");
        break;
    case ZYNQ_BM_SD:
        setenv("modeboot", "sdboot");
        break;
    case ZYNQ_BM_JTAG:
        setenv("modeboot", "jtagboot");
        break;
    default:
        setenv("modeboot", "");
        break;
    }

    return 0;
}

  とあり、ちゃんとブートモードに応じて切り替えていたのですね。

  逆に言うとこのままでは jtag ブートしたときに SDカードには読みに行ってくれないことになります。

  いずれにせよ、JTAG起動時でも bootcmd 環境変数に sdboot が入るように、どこかを書き換えれば解決しそうな予感です。

  ちなみに sd_boot は zynq_zybo.h にて

    "sdboot=if mmcinfo; then " \
            "run uenvboot; " \
            "echo Copying Linux from SD to RAM... && " \
            "fatload mmc 0 0x3000000 ${kernel_image} && " \
            "fatload mmc 0 0x2A00000 ${devicetree_image} && " \
            "fatload mmc 0 0x2000000 ${ramdisk_image} && " \
            "bootm 0x3000000 0x2000000 0x2A00000; " \
        "fi\0" \

   と、設定されています。

   SDカードの3つのファイルが、それぞれのアドレスに置かれるのが見えてきました。

  ついでに 上記の uenvboot を追いかけていくと、zynq_common.h にて

    "bootenv=uEnv.txt\0" \
    "loadbootenv=fatload mmc 0 ${loadbootenv_addr} ${bootenv}\0" \

  となっているのを発見。

  なるほど、SDカードの場合 uEnv.txt でもいろいろ設定できるのですね。

  いろいろと勉強せねば...

« ZyboでLinux | トップページ | Zybo+linaro用のクロスコンパイルメモ »

FPGA」カテゴリの記事

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: ZYBOでのu-Bootのカーネル読み込み先:

« ZyboでLinux | トップページ | Zybo+linaro用のクロスコンパイルメモ »