このページは「24環境」の情報です

第20回 CompactFlash Boot(CAT709)

海老原祐太郎
2004/1/23

CAT709のCompactFlashブートについて検証します。

CFカードにrootファイルシステムを作る

まず普通にCFをメモリーカードを認識させ、現在のオンボードメモリのファイル群をCFにコピーしましょう。
新品のCFはFAT16ファイルシステムでフォーマットされていますので、パーテーションを切り直してext2ファイルシステム(別のファイルシステムでも良いが)
でフォーマットしなければなりません。PCでlinuxが動いているならPCでやってしまったほうが簡単です。

# cfdisk /dev/sda  ← 環境による。PCでどのデバイスで認識されるか?USB接続ならsdaとなるだろう。
# mke2fs /dev/sda1

CFをCAT709のソケット0 (CAT709 CPUボードのソケット)に刺して起動します。cardmgrを立ち上げて認識させます。

# cardmgr
cardmgr[123]: watching 3 sockcs: IO port probe 0x0000-0x0fff:ets
 clean.
cat709_set_global_base ba000000
cat709_make_irq_demux(34 -> 9)
cat709_port_map(start(0x000),stop(0x00f),offset(0xba000000))
cat709_set_global_base 00000000
hde: SanDisk SDCFB-32, CFA DISK drive
ide2 at 0x000-0x007,0x00e on irq 9
hde: attached ide-disk driver.
hde: task_no_data_intr: status=0x51 { DriveReady SeekComplete Error }
hde: task_no_data_intr: error=0x04 { DriveStatusError }
hde: 62720 sectors (32 MB) w/1KiB Cache, CHS=490/4/32
Partition check:
 hde: hde1
ide_cs: hde: Vcc = 3.3, Vpp = 0.0
cat709_set_global_base ba008000
cat709_set_global_base ba00a000
# mount /dev/hde1 /mnt -t ext2
 hde: hde1
 hde: hde1
mount するときに必ず -t ext2 として タイプを指定してください。省略するとVFATでマウントしてしまいます。(kernelのbug?)

無事マウントしたら現在のファイルをコピーします。

# ls /
bin      dev      floppy   initrd   mnt      root     tmp      var
cdrom    etc      home     lib      proc     sbin     usr      var.rom

このうち /mnt と /proc /var は単純なコピーではうまくいかないのでコピーしません。 この3つのディレクトリは単にディレクトリを作るだけでokです。

# /mnt
# cp -a /bin /cdrom /dev /etc /floppy /home /initrd /lib /root /sbin /tmp /usr /var.rom .
# mkdir proc
# mkdir mnt
# mkdir var

続いてvi /mnt/etc/fstab で編集します。 root のデバイスを /dev/hda1 に書き換え、ファイルシステムをext2にします

# /etc/fstab: static file system information.
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
/dev/hda1       /       ext2    defaults,ro,noatime     0 0
proc            /proc   proc    defaults                0 0

続いて vi /mnt/etc/modules で、こちらも書き換えます。次節で述べますが、CFからブートする場合はIPLROMでCFカードの初期化を行い、
起動後はすでに動作している状態になりますので、socket0をcardmgrの管理から外す必要があります。
さもないと cardmgr が再初期化を行いひどいことになります。

# sh3_ss base=0xb8000000,0xb8008000,0xb800a000 irq=34,32,33
sh3_ss base=0xb8008000,0xb800a000 irq=32,33

base=0xb8000000とirq=34がsocket0になりますので、オリジナルはコメントアウトして残しておき、socket0のベースアドレスとIRQ番号を外します。

socket 0 CAT709上socket 1 向かって左下socket 2 向かって右下
base0xb80000000xb80080000xb800a000
irq343233
# cd .. 
# umount /mnt

以上です。umountしましょう。

そもそもCAT709のCFソケットは

CAT709のCFソケットはCompactFlashメモリーカードをはじめ、無線LANカードやPHSモデムなど、各種のCFタイプカードを識別し認識できるようになっています。
CFカードのタプル情報を読み込んで解析し、カードの種別を判断して対応しているドライバをロードするのが cardmgr です。carcmgr は
linuxが立ち上がった後、プロセスとして起動します。

Linux起動後に、CFソケットに刺さっているカード種別を判断してドライバをロードするには cardmgr を使うわけですが、
ブート前は当然linuxが動いていないわけですしcardmgrも動いていません。ブート時にCFからブートするにはipl-rom内部でCompactFlashだと(無線LAN等ではないと)
決めウチで初期化するしかありません。

従って、CFからブートするということはIPLROMでCFを初期化することでありこの場合は/dev/hdaにきめウチします。
またcardmgrの管理から外す必要があるわけです。

カーネルはどこから来るのか?

カーネルはどこからロードされて来るのでしょうか?カーネルとはzImageというただひとつのバイナリーになります。
PCで使われているブートローダliloやgrubは、ハードディスク上にある zImage (vmlinuzというファイル名にするのが一般的)
を探し出してきてメモリにロードする機能を持っています。 CAT709の場合は標準ではCFブートではありませんので、zImageはオンボードの8MbyteのFLASH-ROMの中にアドレス決めウチで保存されています。

shlinux_tips20_1.jpg

CAT709仕様書より。カーネル(zImage)はオンボードFLASHの 0x00020000番地に保存されている。~
linux起動後にはこの番地は /dev/mtd1 デバイスとして読み書きができる。

前節で書いたようにCFの初期化には選択肢があります。
CFからのブートを選択するには(1)の選択をしなければなりません。

  1. IPL-ROMの時点でCompactFlashメモリーカードだと決めウチで初期化する
  2. linux起動後に cardmgr でタプル情報を解析し、無線LANカードやPHSカード等、なんのカードなのか自動的に識別する

カーネルのロード方法も以下から選択します

  1. 通常どおりオンボードFLASHの zImage 領域に保存されているカーネルを起動する。 ルートファイルシステムはCFカードのパーテーションとする。
    ipl-romのメニューで 's' キーを押して起動するのがこのやり方
    (メリット:分かりやすい。起動が若干高速。デメリット:CFカード交換ではカーネルのVerupができない。)
  2. CFカードの /boot/vmlinuz ファイルからカーネルを読み込む。
    ipl-romのメニューで'b'を押してsh-liloを使う方法
    (メリット:CF交換でカーネルを含めてVerUPできる。デメリット:sh-liloのインストールは分かりにくい)

本章では上記1と2の両方の起動手順を個別に解説します。
1の方が簡単です。2に進むためにはまず1をやってから次に進んでください。

1.オンボードFLASHのカーネルからの起動

オンボードFLASHに保存されているカーネルから起動しますので、起動手順は通常通り's'キーによる起動と変わりありません。
カーネルパラメータによってコンパクトフラッシュをIDEデバイスとして認識しろという指示と、
rootファイルシステムをIDEデバイスだと認識させる指示を出します。
'c'キーを押してカーネル起動パラメータを書き換えます。

console=ttySC0,115200 ide0=0xba0001f0,0xba0003f6,34 root=0301 ro

ide0= I/Oアドレス、I/アドレス、割り込み番号 ← CFをIDEデバイスとして初期化させるための指示
root=0301 ← メジャー番号0x03,マイナー番号0x01 で /dev/hda1 をrootパーテーションとせよという意味

    ? --- Show this message (HELP)
    b --- Boot the system
    g --- Invoke GDB stub
    l --- Show about license
    w --- Show about (no)warranty

    k --- download kernel
    r --- download rootfs
    c --- setup kernel cmdline
          example)  console=ttySC0,115200 root=1f02 ro
    m --- setup mac address
    s --- start linux
command line is

console=ttySC0,115200 root=1f02 ro

> c
input kernel command line, and stripe return key
console=ttySC0,115200 ide0=0xba0001f0,0xba0003f6,34 root=0301 ro
>
> s
loading linux
Uncompressing Linux... Ok, booting the kernel.
Linux version 2.4.21 (root@boss) (gcc version 3.0.3) #2 2003年 6月 23日 月曜日 14:09:40 JST
setup_cat709

中略

Uniform Multi-Platform E-IDE driver Revision: 7.00beta4-2.4
ide: Assuming 50MHz system bus speed for PIO modes; override with idebus=xx
hda: SanDisk SDCFB-32, CFA DISK drive
ide0 at 0xba0001f0-0xba0001f7,0xba0003f6 on irq 34
hda: attached ide-disk driver.
hda: task_no_data_intr: status=0x51 { DriveReady SeekComplete Error }
hda: task_no_data_intr: error=0x04 { DriveStatusError }
hda: 62720 sectors (32 MB) w/1KiB Cache, CHS=490/4/32
Partition check:
 hda: hda1
 Amd/Fujitsu Extended Query Table v1.1 at 0x0040
number of CFI chips: 1
cfi_cmdset_0002: Disabling fast programming due to code brokenness.
Creating 3 MTD partitions on "CAT709 Flash1":
0x00000000-0x00020000 : "ipl"
0x00020000-0x00100000 : "kernel"
0x00100000-0x00800000 : "Flash FS"
NET4: Linux TCP/IP 1.0 for NET4.0
IP Protocols: ICMP, UDP, TCP
IP: routing cache hash table of 512 buckets, 4Kbytes
TCP: Hash tables configured (established 2048 bind 4096)
NET4: Unix domain sockets 1.0/SMP for Linux NET4.0.
 hda: hda1
 hda: hda1
VFS: Mounted root (ext2 filesystem) readonly.
略

これでrootファイルシステムをCFにおくことが出来ましたので、アプリケーションのVersionUp目的であればこれでも十分です。

2.CFカードの /boot/vmlinuz ファイルからカーネルを読み込む

コンパクトフラッシュの/boot/vmlinuzをカーネルとしてbootするにはPCと同じくliloブートローダが必要になります。
CFカードにカーネルを置くことが出来るのでカーネルを含めてフィールドで交換することが容易になりますが、組込み手順の難易度は少し高くなります。
頭の中がごちゃごちゃにならないようにしてください。

ブートローダーとしてsh用のliloをインストールしなければなりません。
liloはコンパクトフラッシュのマスターブートレコードに書き込まれます。
sh-linux上からliloをインストールするために一旦 方法1のやり方まで達成し、CFをrootとしてlinuxを起動してください。

無事CFをIDEデバイス(/dev/hda1)として認識し、rootファイルシステムとして起動できましたか?

INIT: Entering runlevel: 2
Starting system log daemon: syslogd.
Starting kernel log daemon: klogd.
Starting HTTP server: boa.
Starting internet superserver: inetd.
Starting NFS common utilities: statd.

supercat login:root
Password:root
supercat:~# rommode rw
supercat:~# vi /etc/lilo.conf

以下の書式で /etc/lilo.confを作ります。

linear
boot = /dev/hda
disk = /dev/hda
bios=0x80
append="ro root=0301 console=ttySC0,115200 ide0=0xba0001f0,0xba0003f6,34  "
delay = 30
image = /boot/vmlinuz
label = linux
root = /dev/hda1
read-only

次にいくつかのファイルをCAT709にダウンロードしておきます。

  • -/usr/local/bin/lilo
  • -/boot/boot.b
  • -/boot/vmlinuz ←vmlinuzはzImageのことです
    # rommode rw
    # cp /どこか/lilo /usr/local/sbin  ← lilo書き込みツール
    # cp /どこか/boot.b /boot/         ← ブートローダ
    # cp /どこか/zImaeg /boot/vmlinuz  ← カーネル
    # lilo
    Added linux *                      ← このメッセージが出ればok
    # rommode ro

これで /boot/vmlinuz をカーネルとして起動できるよう、liloが書き込まれました。以下が要注意なのですが、

liloでブートするときのカーネルパラメータは、/etc/lilo.confのappend=行が使用される。iplromの'c'で書き込む文字列は利用されない

という点に注意してください。
それでは再起動(リセットでもok)し、iplromのメニューで'b'を押してください。
CFの/boot/vmlinuzカーネルがロードされて起動すればokです。

> b
Disk drive detected: SanDisk SDCFB-32 Vdg 1.21          06120202025
Set Transfer Mode result: 51
Initialize Device Parameters result: 50
IDLE result: 50
LILO boot: first-image
Loading linux..................done.
Uncompressing Linux... Ok, booting the kernel.
Linux version 2.4.21 (ebihara@boss) (gcc version 3.0.3) #84 2003年 12月 4日 木曜日 17:37:26 JST setup_cat709
略

自動起動

さて上記まで進み無事 'b' キーでCFのカーネルのブートができるようになりました。
最後の仕上げに自動起動ですが、CAT709のIPL-ROMでは DIPSWの1がONになっていると
自動的に's'でブートするようになっています。このままでは自動で'b'でブートしません。

そこでipl-romに対して'b'に対する自動ブートを付け加えましたが、単純にDIPSW-2
でもよかったのですが、すでにDIP-SW2を使っている方もいらっしゃるかもしれません。
そこで's'もしくは'b'の選択をEEPROMに保存する方法にしました。

sh-stub-2004-01-23.bin (version 0.11_Jan 23 2004 15:58:39)をダウンロードしてipl-romをバージョンアップしてください

# cp sh-stub-2003-01-23.bin /dev/mtd0  ←完了するまで絶対に電源を切らない!!
再起動
SH IPL+g version 0.11_Jan 23 2004 15:58:39, Copyright (C) 2001 Free Software  Foundation, Inc.
 
This software comes with ABSOLUTELY NO WARRANTY; for details type `w'.
This is free software, and you are welcome to redistribute it under
certain conditions; type `l' for details.
 
RTC clock is 2004/01/23 17:41:08
mac addr:00:03:82:02:00:7c
 
IDE: device not detected.
> h
SH IPL+g version 0.11_Jan 23 2004 15:58:39, Copyright (C) 2001 Free Software  Foundation, Inc.
    ? --- Show this message (HELP)
    b --- Boot the system
    g --- Invoke GDB stub
    l --- Show about license
    w --- Show about (no)warranty

    k --- download kernel
    r --- download rootfs
    c --- setup kernel cmdline
          example)  console=ttySC0,115200 root=1f02 ro
    m --- setup mac address
    s --- start linux
    o --- boot_key             ←今回増やした
boot_key=[b]
command line is
 
console=ttySC0,115200 root=1f02 ro

オプションの 'o' が増えています。

> o
boot_key select
type [s] or [b]
-->boot_key set to 'b'

'o'を押すと、自動ブートに's'を使うのか'b'を使うのか聞いてきますので1文字押して ください。
この情報はRTC内蔵のシリアルEEPROMの未使用部分に保存されます。
次回電源ON時にdipsw-1がONになっていると、ここで設定した方法でブートします。

DIPSWは必ず絶対に!つまようじなどやわらかめの物で動かしてください。
針やドライバーの先、ボールペンなどで動かすと接触不良になってしまいます
Last-modified: 2019-07-22 (月) 17:56:00 (28d)