SH7706LSRにDebian 5.0をインストール
はじめに
8000円弱でSH3で遊べるボード、SH7706LSRにDebian 5.0 (lenny)をインストールしたときのメモ。
Linuxのポーティングに関する情報は、三岩さんのページにまとまっている。また、Debian etchを動かすという話はいくつか見つかるのだけど、さすがに古いので、lennyにしたいと思い立った。結論から言うと、etchからlennyにアップデートして一応動くのだけど、何かDBが壊れているのか、Silicon Linuxで公開されているパッケージが不十分なのかわからないが、apt-getが全然機能しない。ということで、現時点ではetchを使い続ける方がお勧めである。
母艦にはMacBook Airを使った。何かとLinux環境が必要になるが、そこはVMWare Fusion上のUbuntu 11.04でカバーした。USB hubにはEthernet、シリアル、SDカードリーダがぶらさがっている。
SDカードの準備
8GBのSDHCカードを使った。基本戦略として、パーティションを3つ切り、最初はブートローダ用にFAT32、2番目はルートファイルシステム、3番目はスワップとした。Linuxローダのデフォルト設定では、カーネルコマンドライン引数に「root=/dev/shmmc2」を指定するので、2番目にルートファイルシステムを置くこと。おそらくこの設定は変更可能だと思うが、調べてない。
手順は「Linuxマシンによるメモリカードのセットアップ」に従えば問題ない。「2GB以上のメモリカードの場合はWindowsでフォーマットしてください」とあったが、Ubuntu 11.04のDisk utilityを使って、パーティショニング、フォーマットしても問題なくブートできた。fdiskの結果は次の通り。
Command (m for help): p Disk /dev/sdb: 8011 MB, 8011120640 bytes 247 heads, 62 sectors/track, 1021 cylinders, total 15646720 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x000562ad Device Boot Start End Blocks Id System /dev/sdb1 62 1960191 980065 c W95 FAT32 (LBA) /dev/sdb2 1960192 14655497 6347653 83 Linux /dev/sdb3 14655498 15635593 490048 82 Linux swap / Solaris
FAT32パーティション(ラベルはMES)には、「ダウンロード」ページにあるvmlinux、initrd.imgの他、Linuxローダのboot.exeをコピーする。
$ sudo cp ~/Downloads/{vmlinux,initrd.img,boot.exe} /media/MES $ umount /media/MES
Ext3パーティション(ラベルはsh3linux)には、Silicon LinuxのここからDebian Etchのベースイメージをダウンロードして、展開しておく。本当はLennyのベースイメージが欲しかったのだが、見つからなかったので、Etchをインストールし、Lennyにアップグレードすることにした。
$ curl -O http://www.si-linux.co.jp/pub/debian-sh/base/etch/debian-etch-sh3_20070713.tgz $ sudo tar xvf debian-etch-sh3_20070713.tgz -C /media/sh3linux
あと、/etc/inittabとfstabはSH7706LSRに合わせて修正しておく。
# cp inittab initab.ORIG # sed -e "s/ttySC0/ttySC1/g" inittab.ORIG > inittab # cat /media/sh3linux/etc/fstab # /etc/fstab: static file system information. # # <file system> <mount point> <type> <options> <dump> <pass> proc /proc proc defaults 0 0 /dev/shmmc2 / ext3 errors=remount-ro 0 1 /dev/shmmc3 none swap sw 0 0 $ umount /media/sh3linux
Etchでブート
Mac OS Xからシリアルを使うときは、screenが便利。
$ sudo screen /dev/tty.usbserial-XXXX 115200
あと、Ethernetだが、わざわざハブを繋ぐのは面倒だったので、MBAの無線LAN経由で外に出ることにした。BSDのようにipfwコマンドでいろいろ設定するのかなと思ったら、System PreferencesのInternet Sharingがipfwのフロントエンドになっているようで、「Share your connection from」のプルダウンで「AirPort」を選択し、「To computer using」のチェックボックスで「USB Ethernet」にチェックを入れればよいだけだった。簡単、簡単。
ブートローダであるMESの改行コードはCR+LRなので、表示がうまくいかないが、気にせず次のように入力すれば、Linuxが起動するはず。
MES> mount mmc0 MES> cd /mmc0 MES> boot.exe
modprobe時に以下のようなエラーメッセージが表示される。気になるなら、modules.depという空ファイルを用意しておけばメッセージは消える。
modprobe: FATAL: Could not load /lib/modules/2.6.28.10/modules.dep: No such file or directory
Lennyにアップグレード
特に変わったことをする必要はないので、Debianの「リリースノート」を参照して進める。ただし、aptitudeのパッケージはないようだ。
/etc/apt/sources.listを編集する。
# cat /etc/apt/sources.list deb http://www.si-linux.co.jp/pub/debian-sh lenny main contrib non-free deb-src http://ftp.debian.org/debian/ lenny main contrib non-free
# aptitude update # aptitude install aptitude apt dpkg # apt-get dist-upgrade
時間はかかるが、無事Lennyにアップグレードできた。一点注意が必要なのは、/etc/securettyにttySC1を追加しないとrootでログインできなくなることだ。
開発環境など
クロス開発用のツールチェインや、カーネルパッチも上記のダウンロードページから入手できる。
簡単なデバイスドライバのひな形を書いてみた。ソースはこちら。ledはLEDを光らせるだけのキャラクタデバイス。led2はTMU(タイマ管理ユニット)を使って周期的に点滅させるもの。SH7706は三つのTMUを持っているが、TMU2は使ってないみたいなので、割込みハンドラを登録してみた。
コンパイルするときは、KERNELDIRに適切なパスを指定すること。
$ make KERNELDIR=../../linux-2.6.28.10 CROSS_COMPILE=sh3-linux- ARCH=sh
謝辞
Linux kernelのポーティングや各種ツールを公開されている三岩さん、Debianパッケージのリポジトリを公開されているSilicon Linuxの海老原さんに感謝!