株式会社デバイスドライバーズ
組込みLinuxボード開発手法

11/21/2005

Linux Kernel Conference 2004

Device Drivers Limited1

E!Kit-1100
n Au1100™-400MHzn シリアル、USB、CF、LAN標準搭載
n LCD、AC97、SDなど拡張コネクタで増設可能
n 110×90mm（名刺2枚分）
n EJTAG搭載

11/21/2005

Linux Kernel Conference 2004

Device Drivers Limited2

AMD Alchemy™ Au1100™
nMIPS32™CPUコア
n高集積システムペリフェラル
n SDRAM/SRAM/Flash/PCMCIAコントローラ
n LCDコントローラ
n 10/100Ethernetコントローラ
n USBホスト/デバイス
n UARTn GPIO(48本)など

n低消費電力（400MHz時で250［mW］以下）
11/21/2005

Linux Kernel Conference 2004

Device Drivers Limited

3

Linuxボード開発
仕様検討
検討

ハードウェア開発
検討

ブートローダ移植検討

カーネル移植ルートイメージ作成

ブートローダやカーネルの検討を、仕様、ハードウェ
アの段階で行いフィードバックする！

11/21/2005

Linux Kernel Conference 2004

Device Drivers Limited

4

仕様検討
n スペックの検討
nn

CPU（種類、動作周波数・・・）
Flashメモリ（容量、バス幅・・・）n

メインメモリ（容量、バス幅・・・）
搭載機能（LAN、USB・・・）

n

ボードサイズnn 部品の検討nn

11/21/2005

価格
入手性Linux Kernel Conference 2004

Device Drivers Limited5ハードウェア開発
n 回路設計n 部品、回路n ボード設計
n 外形、AWn 製造
n 評価
n 電圧、波形確認
n 機能確認11/21/2005

Linux Kernel Conference 2004

Device Drivers Limited

6

部品選定(Flashメモリ)
n 容量
n データ幅（x8、x16、ｘ32）
n インタフェース（バースト、ページ・・・）
n セクタタイプ（ユニフォーム、ブート）n 制御コマンド（AMD、Intel互換・・・）
n 動作電圧、アクセス速度・・・

11/21/2005

Linux Kernel Conference 2004

Device Drivers Limited

7

回路設計(CFソケット割込み)
割込み信号が分離

制御回路

CPU

割込み信号が共用
CPUGPIOx

CF0GPIOy

CF1GPIO

CF0CF1

GPIOの消費は2本

GPIOの消費は1本Linuxの移植が容易

Linuxの移植が困難

11/21/2005

Linux Kernel Conference 2004

Device Drivers Limited8

drivers/pcmcia/au1000_ekit1100.c
static int ekit1100_pcmcia_init(struct pcmcia_init *init)
static int ekit1100_pcmcia_shutdown(void)
static int ekit1100_pcmcia_socket_state(unsigned sock, struct pcmcia_state *state)static int ekit1100_pcmcia_get_irq_info(struct pcmcia_irq_info *info){
if(info->sock > PCMCIA_MAX_SOCK) return -1;
if(info->sock == 0)
info->irq = AU1000_GPIO_0;
else
info->irq = AU1000_GPIO_1;
return 0;}
static int ekit1100_pcmcia_configure_socket(const struct pcmcia_configure *configure)
11/21/2005

Linux Kernel Conference 2004

Device Drivers Limited

9

ブートローダ移植
n ソース変更n コンパイルn Flashメモリ書込み
n デバッグ

11/21/2005

Linux Kernel Conference 2004

Device Drivers Limited

10

ブートローダn Yamon™
n MIPS Technologies, Inc.

n RedBootn RedHat, Inc.

n U-Bootn http://sourceforge.net/projects/u-boot/11/21/2005

Linux Kernel Conference 2004

Device Drivers Limited

11

init/reset/reset.Sb

reset_au1xxx/* 0xBFC00000 */･･････

リセットベクタ

reset_au1xxx:･･････#ifdef EKIT1100_CONFIG#include "../arch/init/reset_ekit1100.S"#endifボード依存の初期化
ルーチンのインクルード･･････
yamon_le:lak0, _reset_handler_le

KSEG1A(k0)j11/21/2005

k0Linux Kernel Conference 2004

エンディアン毎の初期化ルーチンへジャンプ

Device Drivers Limited

12

arch/init/reset_ekit1100.S
nCPUエンディアン設定

nCPU PLL初期化

nCPU各種レジスタ初期化

nシステムバス分周比初期化

nEJTAG Debugレジスタ初期化

nAUX PLL初期化

nキャッシュ初期化

n32KHz発信器初期化

nTLB初期化

nスタティックメモリコントローラ初期化
n各種ペリフェラル初期化
nSDRAMコントローラ初期化
n各種信号線初期化（信号の選択、方向など）

11/21/2005

Linux Kernel Conference 2004

Device Drivers Limited

13

init/init.S･･････
lwt3, 0(t0)addt0, 4swt3, 0(t1)lit0, 4*4

subu

sp, t0

lat0, c_entry

jalrt0コードや初期化データをRAM領域にコピー･･････

11/21/2005

RAM領域にコピーされたCのc_entry関数へジャンプ

Linux Kernel Conference 2004

Device Drivers Limited

14

各種信号線初期化
周辺回路用の信号とGPIOの一部のピンは共有されている。

CPUN0/GPIOx

PHYRJ45

ブートローダで初期化が必要！

11/21/2005

Linux Kernel Conference 2004

Device Drivers Limited15

Yamon™のコンパイル$ make install
mkdir ELmkdir EB

最初に一度だけ実行$ make

その後はこれだけでOK

11/21/2005

Linux Kernel Conference 2004

Device Drivers Limited

16

Yamon™の書込み
FLASH.PROGRAM 0xBFC00000--0xBFCFFFFF
DATA.SET 0xA0100000--0xA01FFFFF 0xFF
DATA.LOAD.S3RECORD yamon¥bin¥yamon-02.19EKIT1100-070504.rec.m.EB
DATA.COPY 0xA0100000--0xA01FFFFF 0xBFC00000 /WORD

書込み時間
40分程度

11/21/2005

Linux Kernel Conference 2004

Device Drivers Limited17

Yamon™の起動
IO
EXCEP･･････
YAMON ROM Monitor, Revision 02.19EKIT1100-012704.
･･････Flash memory size =8 MByteSDRAM size =128 MByte

First free SDRAM address =0x8008f0bc･･････YAMON>

11/21/2005

Linux Kernel Conference 2004

Device Drivers Limited18

RAMテストYAMON> test ram
Testing RAM
Memory test from 0xA008F100 to 0xA7FFFFFC, 10 loops.
Press Ctrl-C to break

KSEG1領域

Now running loop 10 |Test passed

非キャッシュ、非TLB

YAMON>

11/21/2005

Linux Kernel Conference 2004

Device Drivers Limited

19

Flashメモリテスト
YAMON> test flash
Testing Flash
Test passed
YAMON>

11/21/2005

Linux Kernel Conference 2004

Device Drivers Limited20

Yamon™の設定
YAMON> setenv ethaddr 00.0e.6c.00.00.09
YAMON> setenv ipaddr 192.168.1.150
YAMON> setenv subnetmask 255.255.255.0
YAMON> setenv bootserver 192.168.1.201
YAMON> setenv bootfile ekit1100.srec

設定内容はFlashメモリに保存される

11/21/2005

Linux Kernel Conference 2004

Device Drivers Limited

21

Linuxカーネル移植
n ソース変更n コンパイルn デバッグ

11/21/2005

Linux Kernel Conference 2004

Device Drivers Limited

22

arch/mips/zboot/pb1xxx/head.S･･････
lak0, decompress_kernel

jrk0

lik0, KERNEL_ENTRY

jrk0

圧縮カーネルの展開･･････

展開したカーネル
へジャンプ･･････

11/21/2005

Linux Kernel Conference 2004

Device Drivers Limited

23

arch/mips/kernel/head.S･･････
jal

init_arch･･････

アーキテクチャ固有の初期化ルーチン
へ11/21/2005

Linux Kernel Conference 2004

Device Drivers Limited24

arch/mips/kernel/setup.c
asmlinkage void __init init_arch(int argc, char**argv, char**envp, int*prom_vec){
cpu_probe();prom_init(argc, argv, envp, prom_vec);
cpu_report();load_mmu();･･････

カーネル実行
start_kernel();}

11/21/2005

Linux Kernel Conference 2004

Device Drivers Limited

25

init/main.c
asmlinkage void __init start_kernel(void){char * command_line;
extern char saved_command_line[];lock_kernel();printk(linux_banner);

アーキテクチャ固有の初期化ルーチン

setup_arch(&command_line);
printk("Kernel command line: %s¥n", saved_command_line);parse_options(command_line);･･････}
11/21/2005

Linux Kernel Conference 2004

Device Drivers Limited

26

arch/mips/kernel/setup.cvoid __init setup_arch(char **cmdline_p){･･････#ifdef CONFIG_SOC_AU1X00

Au1x00固有の初期化
ルーチン

case MACH_GROUP_ALCHEMY:
au1x00_setup();break;#endif･･････}

11/21/2005

Linux Kernel Conference 2004

Device Drivers Limited27

arch/mips/au1000/common/setup.cvoid __init au1x00_setup(void){･･････
board_setup();･･････}

ボード固有の初期化
ルーチン

11/21/2005

Linux Kernel Conference 2004

Device Drivers Limited

28

arch/mips/au1000/ekit1100/board_setup.cvoid __init board_setup(void){#if defined(CONFIG_MMC)
au_writel((1 << 31)|(1 << 30)|(1 << 20)|(1 << 21), SYS_TRIOUTCLR);
au_sync();au_writel((1 << 22)|(1 << 23), SYS_OUTPUTSET);
au_sync();#endif･･････

SD/MMCコネクタ用の信号線（GPIO）初期化

printk("Device Drivers Limited E!Kit-1100 Board¥n");}
11/21/2005

Linux Kernel Conference 2004

Device Drivers Limited

29

initrdn 圧縮イメージを展開しRAMDISKとしてマウント
n 必要な処理を行いルートファイルシステムを再マウント
n ネットワークを有効にしてNFS
n cardmgrを実行してPCMCIA/CFn ・・・・・・

PCMCIA/CF/ネットワークなどの各種ドライバが動作してなくてもLinuxを起動可能

11/21/2005

Linux Kernel Conference 2004

Device Drivers Limited

30

initrdの作成
n BusyBoxのコンパイルn ramdisk.gz作成
n Linuxカーネルへの組込み

11/21/2005

Linux Kernel Conference 2004

Device Drivers Limited31

BusyBoxn 組込みLinux用コマンド郡
n 一つの実行ファイルで複数のコマンドに対応
n 小容量
n 各種サーバ機能(httpdなど)を入れても約1.5MB
n gzipで圧縮すれば約500KB

11/21/2005

Linux Kernel Conference 2004

Device Drivers Limited32

BusyBoxのコンパイル[root@pen4 rootfs]# make menuconfig
Build Options --->[*] Build BusyBox as a static binary (no shared libs)[ ] Build with Large File Support (for accessing files > 2 GB)[*] Do you want to build BusyBox with a Cross Compiler?
(/export/local/bin/mipsel-linux-) Cross Compiler prefix() Any extra CFLAGS options for the compiler?
[root@pen4 rootfs]# make[root@pen4 rootfs]# make PREFIX=linux/initrd install

11/21/2005

Linux Kernel Conference 2004

クロスコンパイル指定

Device Drivers Limited

33

initrd/etc/init.d/rcS#!/bin/sh/bin/mount -t proc /proc /proc
exit 011/21/2005

Linux Kernel Conference 2004

Device Drivers Limited

34

ramdisk.gz作成/bin/dd if=/dev/zero of=ramdisk bs=1k count=4k/sbin/mke2fs -F ramdisk/bin/mount -o loop ramdisk /misc/bin/cp -a initrd/* /misc//bin/umount /misc/usr/bin/gzip -f -9 ramdisk
mv ramdisk.gz linux/arch/mips/ramdisk/.

11/21/2005

Linux Kernel Conference 2004

Device Drivers Limited

35

カーネルへの組込み[root@pen4 rootfs]# make menuconfig
Block devices ---><*> RAM disk support(4096) Default RAM disk size[*] Initial RAM disk (initrd) support
MIPS initrd options --->[*] Embed root filesystem ramdisk into the kernel
Filename of gziped ramdisk image: "ramdisk.gz"[root@pen4 rootfs]# make zImage[root@pen4 rootfs]# cp linux/arch/mips/zboot/images/ekit1100.srec /tftpboot/.

11/21/2005

Linux Kernel Conference 2004

Device Drivers Limited36

カーネルのロード
YAMON> load
About to load tftp://192.168.1.201/ekit1100.srec
Press Ctrl-C to breakStart dump from terminal program........................................
........................................
...........................
Start = 0x81000000, range = (0x81000000,0x810d6fff), format = SRECYAMON>

11/21/2005

Linux Kernel Conference 2004

Device Drivers Limited37

カーネルの起動
YAMON> goCPU revision is: 02030204
Primary instruction cache 16kB, physically tagged, 4-way, linesize 32 bytes.
･･････
VFS: Mounted root (ext2 filesystem) readonly.
Freeing unused kernel memory: 112k freed
Algorithmics/MIPS FPU Emulator v1.5
Please press Enter to activate this console.
BusyBox v1.00-pre10 (2004.06.14-08:56+0000) Built-in shell (ash)Enter 'help' for a list of built-in commands.
-sh: can't access tty; job control turned off/#
11/21/2005

Linux Kernel Conference 2004

Device Drivers Limited

38

補足：
JTAGデバッガn 独ロータバッハ社製JTAG Debuggerシリーズ
n 対応CPUn ARM, MIPS, PPC, SH, H8, i186, 各種DSP, FPGA
n 提供機能n ハードウェアデバッグ
n ソフトウェア・シミュレータ
n ROMエミュレータn オンボードFlashメモリの書込み

11/21/2005

Linux Kernel Conference 2004

Device Drivers Limited

39

補足：
MIPS32™の論理アドレス
0xFFFFFFFF
0xE0000000
0xC0000000
0xA0000000
0x80000000

KSEG3
KSSEG
KSEG1
KSEG0

領域 キャッシュ TLB
KSEG1××
KSEG0
○×
KUSEG
○○
KSEG0、KSEG1は物理アドレス
0x00000000 - 0x1FFFFFFFにマップ

0x00000000

11/21/2005

KUSEG

Au1100™はKSSEG、KSEG3が予約領域になっている

Linux Kernel Conference 2004

Device Drivers Limited40

補足：Flashメモリマップ
KSEG1
物理アドレス
0x1FFFFFFF 0xBFFFFFFF
0x1FFC0000
0x1FD00000

Env

256KB
0xBFFC0000(Kernel)0xBFD00000

2.75MB
Yamon

0x1FC00000

0xBFC00000

1MB(User FS)

0x1F800000
11/21/2005

0xBF800000

リセットベクタ
0xBFC00000

4MBLinux Kernel Conference 2004

Device Drivers Limited

41

補足：
情報のポインタn E!Kit-1100n http://e-kit.jp/products/E!Kit1100/n Linux/MIPSn http://www.linux-mips.org/
n http://www.linux.or.jp/JF/JFdocs/MIPS-HOWTO.html

n BusyBoxn http://www.busybox.net/

11/21/2005

Linux Kernel Conference 2004

Device Drivers Limited

42補足：GPIOアサイン
GPIO0

CF0割込みGPIO8

拡張コネクタ(I2SDI)

GPIO1

CF1割込みGPIO9

UART3(U3CTS)

GPIO2

拡張コネクタ(EXTCLK0)

GPIO10UART3(U3DSR)GPIO3CPLDクロック(EXTCLK1)

GPIO11

UART3(U3DCD)

GPIO4

拡張コネクタ(DMA_REQ0)

GPIO12

UART3(U3RI)

GPIO5

拡張コネクタ(DMA_REQ1)

GPIO13

UART3(U3RTS)GPIO6

CPLD(SMROMCKE)

GPIO14

UART3(U3DTR)

GPIO7

ソフトウェアリセット

GPIO15

拡張コネクタ(IRFIRSEL)

他の信号とピンが共有
専用のピン

11/21/2005

Linux Kernel Conference 2004

Device Drivers Limited

43

補足：
GPIOアサイン(続き)GPIO16

CF電源

GPIO24PHY(N0TXEN)

GPIO17

CF電源

GPIO25PHY(N0TXD0)

GPIO18CF電源

GPIO26PHY(N0TXD1)

GPIO19CF電源

GPIO27PHY(N0TXD2)

GPIO20

拡張コネクタGPIO28PHY(N0TXD3)

GPIO21

拡張コネクタGPIO29拡張コネクタ(I2SDIO)GPIO22拡張コネクタGPIO30

拡張コネクタ(I2SCLK)GPIO23

拡張コネクタGPIO31

拡張コネクタ(I2SWORD)

11/21/2005

Linux Kernel Conference 2004

Device Drivers Limited44

補足：GPIOアサイン(続き)GPIO200

拡張コネクタ(LRD0#)

GPIO208

拡張コネクタ(S0DOUT)

GPIO201

拡張コネクタ(LRD1#)

GPIO209

拡張コネクタ(S0CLK)GPIO202

拡張コネクタ(LWR0#)

GPIO210拡張コネクタ(S0DEN)

GPIO203

拡張コネクタ(LWR1#)

GPIO211

拡張コネクタ(IRDATX)GPIO204

CF(PREG#)GPIO212拡張コネクタ(U0TXD)GPIO205

CF(PCE1#)

GPIO213

拡張コネクタ(U1TXD)

GPIO206

CF(PCE2#)

GPIO214

UART3(U3TXD)

GPIO207

CF(PWE#)GPIO215PHY(N0MDC)

11/21/2005

Linux Kernel Conference 2004

Device Drivers Limited

45

補足：
デバッグ事例E!Kit-1100のFlashメモリ回路
Au1100
RAD

Flash
22bit
16bit

しかしAu1100の設定の不具合だったA

RD

DQ

RCS0#

CS#RWE#WE#

OR
RBE0#

11/21/2005

対策回路

Linux Kernel Conference 2004

Device Drivers Limited

46

補足：
デバッグ事例(続き)32bitアクセス
RBE0#

RWE#(WE#)

RCS0#(CS#)

11/21/2005

Linux Kernel Conference 2004

Device Drivers Limited

47

補足：
デバッグ事例(続き)16bitアクセス
RBE0#

RWE#(WE#)

RCS0#(CS#)

11/21/2005

WE#が2回発生！

Linux Kernel Conference 2004

Device Drivers Limited

48

補足：
デバッグ事例(続き)16bitアクセス（Au1100設定対策後）
RBE0#

RWE#(WE#)

RCS0#(CS#)

11/21/2005

WE#が1回Linux Kernel Conference 2004

Device Drivers Limited

49

連絡先

株式会社デバイスドライバーズ
川本 泰久
info@devdrv.co.jp

11/21/2005

Linux Kernel Conference 2004

Device Drivers Limited50