Pylone Blog - 2007年06月

CPU ボード Bishop (9) 『uClibc によるルートファイルシステム』

2007年7月28日: 本記事にてご案内した uClibc によるルートファイルシステムは中止させていただきました。

Bishop の NAND フラッシュメモリにプリインストールされるルートファイルシステムは buildroot によって作られたものです。 現在検討中の構成は以下の通りです。

  • uClibc: 組込み Linux 向け軽量 C ライブラリ
  • BusyBox: 標準的な Linux ユーティリティを単一バイナリで提供
  • MatchBox: 小さな画面やタッチパネルを対象に設計されたウィンドウマネージャ

詳細につきましては、正式決定後に製品情報ページや本ブログにてお知らせいたします。

buildroot とは uClibc の作者である Erik Andersen 氏 によって開発されたルートファイルシステムを作成するための仕組みで、 様々なプログラムを uClibc でビルドするための Makefile や patch で 構成されています。

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 (7) 『JTAG-ICE』

前回の記事で JTAG-ICE を使わないでフラッシュメモリに書込む方法をご紹介しましたが、実際の開発では JTAG-ICE を用いたデバッグのニーズも多いかと思います。基本的には ARM920T コアを サポートしている JTAG-ICE であれば使用可能ですが、コアだけに対応して CPU 固有 のペリフェラルに対応していない JTAG-ICE では使い勝手はあまりよくありません。

写真 Bishop の推奨 JTAG-ICE は ビットラン株式会社様 の DR-01 です。 DR-01 の デバッガソフト は CPU 固有のペリフェラル定義を簡単に追加できます。 パイロンでは S3C2440 用ペリフェラル定義ファイルを公開する予定です。 このペリフェラル定義ファイルをデバッガソフトに追加することによって、直感的なユー ザインタフェースで S3C2440 のペリフェラルレジスタへアクセスできます。

2008/06/07: ペリフェラル定義ファイルを公開

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を購入する必要はありません。

CPU ボード Bishop (5) 『フラッシュメモリ』

図 Bishop のフラッシュメモリは 4MB の NOR 型 と 128MB の NAND 型です。 NOR は S3C2440 のメモリコントローラに直接つながり、 NAND は S3C2440 の NAND コントローラによって制御されます。

S3C2440 のリセットベクタはメモリコントローラのバンク0 (ROM/RAM の先頭) になります。 出荷状態の Bishop では バンク0 は NOR になっていますので、 ブートローダは NOR にインストールされます。 S3C2440 の Stepping Stone と呼ばれる機能により NAND からもブート可能ですが、 Bishop では Stepping Stone をサポート対象外とさせていただきます。