HOME/ NetBSD/ OpenBlockS/ build

OpenBlockS de NetBSD (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用のカーネルソースの準備

無事にソースが準備できたら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にファイルができあがっているはずである。

LEDで遊ぼう (LEDドライバ)

LinuxではOpenBlockSの前面にあるLEDが点滅してくれる。 健気に動いているのを「よしよし、動いているな」と見守ることができる。

NetBSDでもLEDを光らせたいということでLEDドライバを書いた。 といってもpseudoな手抜きドライバである。

LEDドライバのインストールとカーネルの再構築

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

LEDを光らせるサンプルプログラム

デバイスを使う準備ができたので、簡単なプログラムを作って遊んでみよう (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);
}

プログラムは非常にシンプルである。

  1. /dev/ledをオープンする
  2. ioctlを使ってデータ (点灯させたいLEDのセグメント) を送る
  3. 一秒待つ
  4. すべてのデータを送るまで繰り返す

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に関係するレジスタ

LEDを点灯させるにはIMMR (In Memory Map Register?) を取得し、 PIP (Parallel Interface Port) のPort B Data Register に直接値を書き込んでいる。

LEDのセグメントに対するレジスタは次の図のようになっている。

それぞれのレジスタにビットを立てればLEDが光る。


HOME/ NetBSD/ OpenBlockS/ build

$Lastupdate: Tue Jul 29 23:54:12 2003 $