Pylone Blog - タグ:u-boot

CPU ボード Bishop (8) 『U-Boot』

Bishop のブートローダ U-Boot は前身であるPowerPC用ブートローダ ppcboot を他のアーキテクチャにも対応させた組込み向け汎用ブートローダです。 tftpによるネットワークブートなどブートローダとしての機能に加え、 USB、MMC、IDE、MII、PCMCIA、NAND、I2C、SPI など様々なデバイスやバスに対応 したモニタプログラムでもあります。

U-Boot の特筆すべき点は移植性の高さです。 アーキテクチャに依存する部分と非依存の部分が分離されているため、 コアアーキテクチャさえ対応していれば 新しい CPU への対応も比較的少ない作業で済みます。 また、デバイスドライバが豊富に用意されているため、 対応しているデバイスであれば デバイス固有のパラメータを与えるだけで動いてしまう事が多いです。 例として、実際に U-Boot を Bishop へ移植した際に追加したコードの一部をご紹介します。

LANコントローラDM9000

DM9000 のドライバは common/dm9000x.c です。ターゲットで動かすためには アドレスとバス幅を指定します。

include/configs/bishop.h:

#define CONFIG_DRIVER_DM9000    1                        /* ドライバを有効化 */
#define CONFIG_DM9000_BASE      0x20000300
#define DM9000_IO               CONFIG_DM9000_BASE       /* アドレス (I/O) */
#define DM9000_DATA             (CONFIG_DM9000_BASE + 4) /* アドレス (データ) */
#define CONFIG_DM9000_USE_32BIT 1                        /* バス幅 */

NAND

NAND のドライバは drivers/nand/ です。動かすためにはチップの数と NAND コントローラのベースアドレスを指定し、NAND コントローラ固有の処理を追加します。

include/configs/bishop.h:

#define NAND_MAX_CHIPS          1
#define CFG_MAX_NAND_DEVICE     1
#define CFG_NAND_BASE           0x4E000010

board/pylone/bishop/nand.c:

#include <common.h>

#if (CONFIG_COMMANDS & CFG_CMD_NAND) && !defined(CFG_NAND_LEGACY)

#include <nand.h>
#include <s3c2440.h>

static int hwctl = 0;

static void bishop_hwcontrol(struct mtd_info *mtdinfo, int cmd)
{
        S3C2440_NAND * const reg = S3C2440_GetBase_NAND();

        switch (cmd) {
        case NAND_CTL_SETCLE:
                hwctl |= 0x1;
                break;
        case NAND_CTL_CLRCLE:
                hwctl &= ~0x1;
                break;
        case NAND_CTL_SETALE:
                hwctl |= 0x2;
                break;
        case NAND_CTL_CLRALE:
                hwctl &= ~0x2;
                break;
        case NAND_CTL_SETNCE:
                reg->NFCONT = reg->NFCONT & 0xfffffffd;
                break;
        case NAND_CTL_CLRNCE:
                reg->NFCONT = reg->NFCONT | 2;
                break;
        }
}

static void bishop_write_byte(struct mtd_info *mtdinfo, u_char byte)
{
        S3C2440_NAND * const reg = S3C2440_GetBase_NAND();

        if (hwctl & 0x1)
                reg->NFCMMD = byte;
        else if (hwctl & 0x2)
                reg->NFADDR = byte;
        else
                reg->NFDATA = byte;
}

static u_char bishop_read_byte(struct mtd_info *mtdinfo)
{
        S3C2440_NAND * const reg = S3C2440_GetBase_NAND();
        return reg->NFDATA;
}

static int bishop_dev_ready(struct mtd_info *mtdinfo)
{
        S3C2440_NAND * const reg = S3C2440_GetBase_NAND();
        while (!(reg->NFSTAT & 1));
        return 1;
}

void board_nand_select_device(struct nand_chip *nand, int chip)
{
        S3C2440_NAND * const reg = S3C2440_GetBase_NAND();
        reg->NFCONT = reg->NFCONT & 0xfffffffd;
        return;
}

int board_nand_init(struct nand_chip *nand)
{
        S3C2440_NAND * const reg = S3C2440_GetBase_NAND();

        nand->eccmode = NAND_ECC_SOFT;
        nand->hwcontrol  = bishop_hwcontrol;
        nand->read_byte  = bishop_read_byte;
        nand->write_byte = bishop_write_byte;
        nand->dev_ready  = bishop_dev_ready;
        reg->NFCONF = 0x0300;
        reg->NFCONT = 0x0063;

        return 0;
}
#endif /* (CONFIG_COMMANDS & CFG_CMD_NAND) && !CFG_NAND_LEGACY */

CPU ボード Bishop (6) 『フラッシュメモリの書き込み』

U-Bootによる書き込み

Bishop にプリインストールされるブートローダ U-BootはOSのブートだけでなくフラッシュメモリの書き込みもできます。フラッシュメモリ上のLinuxカーネルやルートファイルシステムを書き換えるにはU-Bootを使うのがもっとも簡単な方法です。

U-BootによってU-Boot自体を書き換える事も可能ですが、書き込みに失敗した場合は起動できなくなります。お客様がU-Bootを上書きした事による起動の不具合についてはサポート対象外とさせていただきます。

ダウンロードケーブルによる書き込み

図

オプションとして販売予定のダウンロードケーブルとライタープログラムを使えば、 PC からNORフラッシュメモリへ書き込む事ができます。 U-Bootを使った書き込みでは U-Boot自体の上書きが失敗した場合に起動できなくなってしまいますが、本ケーブルを使えば起動できない状態でも書き込むことができます。 フラッシュメモリ書き込みのためだけにJTAG-ICEを購入する必要はありません。