Pylone Blog
CPU ボード Bishop (8) 『U-Boot』
Tue, 19 Jun 2007 05:32 GMT, 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 */
![[広告] 組込みLinux開発用CPUボード SBC6000X](/i/sbc6000x-ad.jpg)