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が光る。