USL-5Pで定点カメラをつくる

(lastupdate: 05/02/8)
分解中 単体動作中(外付けHDD) 単体動作中(外付けUSBメモリ)

以下は、試行錯誤しながらUSL-5Pをいじったときの備忘録的メモです。

リンク集

USL-5Pの基礎知識

まずはブートしてみる。

あいているCFを用意して、EXT2でフォーマットし、 LILOを打ち込む。 まずはNFSブートの場合。 ここを参考に。 以下は、ホストPCの/mnt/sh/を、USL-5PからNFSマウントする場合の例。

SH4用liloの構築

ここを 参考に。 (配布HDLSRC42.TGZのloader/lilo_sh/以下のものでもできるかもしれない)
  1. LILOのソースCVSをcvs.m17n.orgから取得
  2. ここを参考にpartitiion.cを修正 (#if0, #endifを追加する)
  3. ホスト側のLILOのバージョンを lilo -V で確認する(21.4など)
  4. このホスト側LILOのバージョンにあわせて、 ここを参考に、first.Sを修正する
  5. SH4としてmakeする: 'make CROSS_COMPILE=sh4-linux-'
  6. boot.bができるので、これを /mnt/sh/rootfs/boot/ にコピーする(boot.b.2104のようにLILOのバージョン番号をつけるといいかも)

LILO設定ファイルの準備

CF用のrootfsをつくって、あとでCFにコピーする。 このCF用rootfsには、次のものを入れる。

lilo.conf

lilo.conf-nfsboot
linear
boot=/dev/sda
disk=/dev/sda
bios=0x80
install=/boot/boot.b.2104
image=/boot/zImage
label=nfsboot
root=/dev/hda1
read-only
append="console=ttySC1,115200 mem=64M root=/dev/nfs rw ip=::::::bootp"
こんなlilo.conf-nfsbootを/mnt/sh/rootfs-cf/etc/につくっておく。 ちなみにappend内の/dev/nfsは、実在しなくても書いておけばOK。 またboot, diskは、ホストPCからみたCFのデバイスファイル。 (USB接続CFリーダだと、/dev/sdaとなることが多いようだ)

/dev の構築

/dev以下のデバイスファイルを用意する。 参考
# cd /mnt/sh/rootfs-cf
# mkdir -p bin boot dev etc home lib proc root sbin tmp usr var dev/pts usr/bin usr/lib usr/sbin lib/modules var/log
# cd /dev
# cp -a console hda hda? kmem mem null rtc sda sda? tty tty? urandom ptyp? ttyp? /mnt/sh/rootfs/dev/
# cd /usr/src/LANDISK/rootfs/dev
# ln -s ../proc/self/fd/0 ./stdin
# ln -s ../proc/self/fd/1 ./stdout
# ln -s ../proc/self/fd/2 ./stderr
# mknod ttySC0 c 204 8
# mknod ttySC1 c 204 9

NFSブート用CFの用意

CFをマウント(以下の例では/mnt/cf/に)して、必要ファイルをコピーする。
# mount /dev/sda1 /mnt/cf
# cp -auf /mnt/sh/rootfs-cf/* /mnt/cf/
# lilo -r /mnt/cf -C /etc/lilo.conf-nfsboot
最後のliloは、ホストPCにはいっているLILOでOK。 ただし-C以下は、-rで書いたルートパスからの相対パスになるので、 この場合は、/mnt/cf/etc/lilo.conf-nfsboot、つまり CF内にコピーしたNFSブート用のlilo.conf-nfsbootを使って LILOを打ち込むことになる。

DHCPサーバとNFSサーバを立てておく

固定IPでNFSブートが、なかなかうまくいかない ので、とりあえずのDHCPサーバを立てたほうが早そう。 以下、RedHat8でDHCPサーバ、NFSサーバをたてるときの覚書。 これで、/mnt/sh/rootfs/ 以下にbase-sh4-...を展開し、 これをUSL-5P側からNFSマウントしてブートできる。 ちなみにCFだけでブートさせたいときは、 こんなかんじ

コンソールの接続

ここを参考に シリアルコンソールをつけると、ブートの様子が見られるので まずはこれをつけ、PCでシリアルのターミナル(TeraTermなど)で様子をみる。

開発環境の構築

開発環境は、クロス開発(PC側でSH4用コンパイラを使う)と セルフ開発が可能。 当然だが、前者のほうが、コンパイルその他は速い。

クロス開発環境の場合

LinuxがインストールされているPCを用意し、 ここから クロス用のGCCを持ってきてインストールする。 RedHat LinuxならばRPMがあるので、rpm -ivhするだけ。

ただしiohackのディストリビューションを使うならば、 ライブラリその他がgcc-3.0.4でコンパイルされているため、 gcc-3.0.4を使うべき。 (http://www.sh-linux.org/index-j.html の http://www.sh-linux.org/readme-eucJP.txt を参考にインストールする)

ちなみにCygwin上でもインストールできて、カーネル構築もできるが、 いろいろと手動でなおさないといけないことがあった。 →Cygwinの場合のカーネル構築メモ

セルフ開発環境の場合

ここからありがたく頂戴できる。 iohackのuserlandを(NFSマウントして)ブートしたあとであれば、 Debian GNU/LinuxがUSL-5P上で動いているわけで、 以下のものをpkg-installするだけ。

kernelの構築

iohack (SourceForge)から LANDISK用のカーネルのソース(HDL-SRC.TGZ)をもってくる。 これを/usr/srcなどで展開して、あとは普通のLinuxのカーネル構築と同じ。 (以下は/mnt/sh/usr/src/ 以下でクロスコンパイルした場合の例で、 /mnt/sh/rootfs/ が、USL-5PにとってのNFSマウントされた / (ルートディレクトリ)の場合)
# cd /mnt/sh/usr/src/
# make menuconfig
# make dep
# make clean
# make zImage
# make modules
# make INSTALL_MOD_PATH=/mnt/sh modules_install
# cp arch/sh/boot/zImage /mnt/sh/boot/
これで、/mnt/sh/boot/に、zImage (カーネルの圧縮イメージ)ができる。 これを使ってブート。 あるいはhosoさんの.configをありがたく使わせていただく(/usr/src/.configにコピーして、make dep以降を行う) ちなみにUSBディスクなどをさしたときに自動的にmountさせたければ カーネル構築時にFile Systemの中の automountを 選択しておくのを忘れずに。 ちなみにautofsはapt-get install autofsでインストール。 (メモVFAT領域を読み書き)

ちなみにUSL-5P用のカーネルのソースも、 アイ・オー・データにrequestすると 実費(500円分の切手)で分けてくれる。 この中のカーネルのほうがいいかも。 ボタン関連のbuttondなどのモジュールのシンボルが定義されているので 使えるかも、ということらしい (hosoさんの日記のコメント)。

uselandの構築

iohackのディストリビューションを使う場合

iohackの LANDISK用ユーザランド(base-sh4-for-landisk-...)をいただいてきて、 展開するだけ。(NFSマウントする場合も、CF単独でブートする場合も)

そのほか、先人たちがコンパイルしてくださったDebianパッケージの数々が Unofficial Debian Packages for LANDISK にあるので、ありがたく頂戴できる。

busyboxを使ってみる

busyboxは、よく使うlsやcpなどといったコマンドを1個のコマンドファイルに まとめて、ファイル名を変えてリンクを張ることでそれぞれのコマンドとして 動いてくれる、とっても便利なコマンド。 たとえば /bin/busyboxをつくっておいて、/bin/ls -> /bin/busybox という シンボリックリンクをつくっておけば、lsコマンドが使えてしまう。

busybox-1.00を もってきて、makeする(クロスorセルフ)。 カーネルの構築っぽく作れる。

# make menuconfig
---
...
General Configuration
 - [*] Build BusyBox as static binary
 - [*] Do you want to build Busybox with a Cross Compiler?
       -> sh4-linux-
Installation Options
 - (/mnt/sh/rootfs) BusyBox installation prefix

Login/Password Management Utilities
[*] getty

Networking Utilities
[*] ifupdown

Debian utilities
[*] run-parts
...
---
# make dep
# make
# make PREFIX=/mnt/sh/rootfs install
いくつか良く使うコマンドをmakeするように設定をしておく。 ただしgettyとかだと、次のようなwarningが出る。
--------------------------------------------------
You will probably need to make your busybox binary
setuid root to ensure all configured applets will
work properly.
--------------------------------------------------
そこでsetuidを立てておく。
# chmod 4755 busybox
or
#chmod u+s busybox
が、実行時にこのwarningが原因と思われるwarningが出てしまう。 なんで?とりあえず気にしない。 → きんねこさんから情報をいただく。 /etc/busybox.confに設定を書かないといけないようだ。

しかしbusyboxのinitとshは、「オリジナル」(base-sh4-...)のやつとは 動きがどうも違うようだ。 特にinitはだいぶ違って、runlevelの概念がない、など かなり違うので、設定ファイル(inittab)は大幅に変えないといけない。 詳しくはこちら

CF単体でブート

基本的にNFSマウントした状態で動いたら、 次のようにまるごとコピーして、不必要なものを削って、 カーネルを入れ替えて、liloを打ち込めばおしまい。

USL-5Pでデジカメのシャッターを切る

こちらへ。

USL-5Pのボタンを使う(未完了)

こちらへ。

オリジナルのCFをベースにした改造

こちらへ。

Debian memo

Debian初心者(=自分)向け。

miscellous

その他の細かいメモ。
お問い合わせはこちらへ: akita(at)is.t.kanazawa-u.ac.jp