Pylone

Pylone Blog

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

Posted by Seiichi SATO

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 */
top
[0] ホーム
[4] 記事一覧
© 2010 Pylone
会社概要 | プライバシー