HOME/ NetBSD/ OpenBlockS/ build
OpenBlockSでNetBSDを動かしてみようとするページ。
このページは改造中です。最新の情報が完全に反映されていません。
事前にT_DIR, R_DIR, D_DIR, O_DIRを定義しておくこと。
# ftp ftp://nandra.iri.co.jp/pub/NetBSD/macppc/macppc-031101.tar.gz
# ftp ftp://nandra.iri.co.jp/pub/NetBSD/mpc860/mpc860-031101.tar.gz
# ftp http://www.tokuda.net/NetBSD/OBS/patch/031101/mpc860-031101add.tar.gz
# ftp http://www.tokuda.net/NetBSD/OBS/patch/031101/mpc860-031101.diff
# cvs -d /usr/CVS/NetBSD/cvsroot checkout -D "20031101-UTC" src
# cd src
# rm -rf lib/libc/arch/powerpc
# pax -rvzpe -f ../macppc-031101.tar.gz
# pax -rvzpe -f ../mpc860-031101.tar.gz
# pax -rvzpe -f ../mpc860-031101add.tar.gz
# patch -p1 < ../mpc860-030517.diff
# ./build.sh -T ${T_DIR} -R ${R_DIR} -D ${D_DIR} -O ${O_DIR} -a powerpc -m mpc860 release
必要になるファイルをあらかじめftp://nandra.iri.co.jp/pub/NetBSD/ からダウンロードしておく。
| macppc-031101.tar.gz | macppcのカーネルソース (mpc860を動かすために必要です) | mpc860-031101.tar.gz | mpc860のカーネルソース |
ここではNetBSD/i386を想定して話を進める。 今回build対象とするsource treeがNetBSD-current 20031101 なのでそれなりに新しいものがよいだろう。
まず、CVSを用いて/usr/srcにチェックアウトする。/usr/CVS/NetBSD/cvsrootにCVSリポジトリがある場合は次のようになる。
# mkdir /usr/src # cvs -d /usr/CVS/NetBSD/cvsroot checkout -D "20031101-UTC" src
手元にNetBSDのリポジトリがない場合には、
# mkdir /usr/src # cvs -d :pserver:anoncvs@sup.jp.netbsd.org:/cvs/cvsroot checkout -D "20031101-UTC" src
などと入力する。が、どうせ今後-current を追いかけるので手元にリポジトリを持つのが良いだろう。 詳しくはNetBSDの 本家Webサイトのドキュメントを参考にしてほしい。
ちなみに、ソースの準備には非常に時間がかかる。
無事にソースが準備できたらOpenBlockS用のカーネルソースを追加する。
ただし、lib/libc/arch/powerpcは削除しておく。
# cd /usr/src/ # rm -rf lib/libc/arch/powerpc # tar xvzf ~/macppc-031101.tar.gz # tar xvzf ~/mpc860-031101.tar.gz
コンパイルに際して、テンポラリで使用するディレクトリを作成しておく。
# cd /usr # mkdir o d r t
リリース作業はnew toolchainになったおかげで大変簡単である。
# cd /usr/src # ./build.sh -O /usr/o -D /usr/d -R /usr/r -T /usr/t -a powerpc -m mpc860 release
リリースにはかなりの時間がかかる。
リリースが終了すると/usr/rにファイルができあがっているはずである。
LinuxではOpenBlockSの前面にあるLEDが点滅してくれる。 健気に動いているのを「よしよし、動いているな」と見守ることができる。
NetBSDでもLEDを光らせたいということでLEDドライバを書いた。 といってもpseudoな手抜きドライバである。
LEDドライバはカーネルソースにパッチを当てる (led20021223.diff)。
# cd /usr/src/sys/arch/mpc860 # patch < led20021223.diff
で、カーネルを再コンパイルする。 build.shにkernel=MPC860という引き数を渡してやればよい。
パッチを見るとわかるがLEDドライバはデバイス/dev/ledでメジャー番号が26 であることを期待して作成されているため、 手動でデバイスを作成してやる必要がある。
# mknod /dev/led c 26 0
デバイスを使う準備ができたので、簡単なプログラムを作って遊んでみよう (happy.c)。
#include <fcntl.h>
#include <stdio.h>
#include <sys/ioctl.h>
int main()
{
int i;
int skel_dev;
int str[] = {0xEC, 0xEE, 0xE6, 0xE6, 0xDC, 0x00};
if ((skel_dev = open("/dev/led", O_RDONLY, 0)) < 0) {
fprintf(stderr, "Failed to open /dev/led\n");
exit(2);
}
for (i = 0; i < 6; i++) {
if (ioctl(skel_dev, str[i], 0) < 0) {
perror("ioctl failed");
exit(2);
}
sleep(1);
}
exit(0);
}
プログラムは非常にシンプルである。
ioctlに送るデータの下位8bitがLEDのそれぞれのセグメントに対応している。 LEDと各bitの関係は次の図のとおりである。
-(1)- | | (6) (2) | | -(7)- | | (5) (3) | | -(4)- .(0)
つまりすべてのLEDを点灯させたければ0xFF (11111111) だし、 数字の5を点灯させたければ、0xDA (11011010) である。
OpenBlockSにloginし、happy.cをコンパイルする。
# gcc -o happy happy.c
コンパイルが終ったらhappyを実行するとLEDがHAPPyと表示されるはず。
LEDを点灯させるにはIMMR (In Memory Map Register?) を取得し、 PIP (Parallel Interface Port) のPort B Data Register に直接値を書き込んでいる。
LEDのセグメントに対するレジスタは次の図のようになっている。
それぞれのレジスタにビットを立てればLEDが光る。