HOME/ NetBSD/ OpenBlockS

OpenBlockS de NetBSD

OpenBlockSでNetBSDを動かしてみようとするページ。

このページは改造中です。最新の情報が完全に反映されていません。

OpenBlockSでNetBSDの現在の状況

ごく最近いろいろと動きがあります。port-powerpc-jaなMailing Listを読むと、 IDEや10BASE-TなEtherも動作しているようです。

OpenBlockSの各種デバイス動作状況は次のとおりです。

デバイス 対応状況
ブート bootp + NFS
100BASE-TX LAN OK
10BASE-T LAN OK (N/A)
CF or HDD IDE HDD OK, CF N/A
LED OK
Serial OK (N/A)
リセットSW 未検証

メーリングリスト

NetBSD/openblocksに関するメーリングリスト (netbsd-obs@freeml.com)を作りました。

自由に参加でき、流れたメールは一般公開されます。 メーリングリストへの発言は、メーリングリストへの参加が必要です (事前にメーリングリストに参加してください)。

メーリングリストの詳しい情報はFreeMLのページ から参照できます。

FreeMLのサービスを利用しています。 ですから、メールの最後の数行には広告が入ります。

参加方法

参加方法は二通りあります。

Majordomoのコマンドメールで参加する場合には、 次のようなメールを送信してください。

宛先 majordomo@freeml.com
件名 (Subject) 空のまま
本文 subscribe netbsd-obs あなたのメールアドレス

一旦確認メールがくるので、返信すると登録完了です。

詳細なヘルプはFreeML のコマンドメールについてのページに書かれています。

コンテンツ

ネタとしてはこんなところです。

正式なPort (NetBSD/openblocks) について

ここにある情報はなんですか?

このページで紹介しているNetBSDのOpenBlockSへのPortはメーリングリスト port-powerpc-jaに流れた Tsubai Masanariさんのメール とそのメールに対する一連のスレッドを参考にして作ったものです。

じゃぁ、正式なPortはどうなってるの?

正式なPortとしてのNetBSD/openblocksは OpenBlockSの販売を行っているぷらっとホームの細川さんが正式なメンテナとして 登録されています。 ちゃんとしたNetBSD/openblocksのWebページも http://www.netbsd.org/Ports/openblocks/ (日本語ページ) にあったりします。

てことで、そのうちNetBSDのCVSリポジトリに OpenBlockSのPortが正式にお目みえすることでしょう。 そういう意味で、このページは正式版がリリースされるまでの予告というか、 つなぎというかそういう位置づけです。 私はつい手がすべってNetBSD/openblocksと記述したりしますが、 正式なものではないので誤解なきようお願いします。

NetBSD/openblocksのメンテナである細川さんにはメールを送ったり、 OpenBlockS S東京製品発表展示会でお目にかかったりしました。 ちなみに 展示会の模様をレポートしたページのどこかに細川さんが写っています。

細川さんに実際に話をうかがったところ、 作業は行っているもののNetBSD-currentに追従する (というかpmapが変わったらしい?) のは非常に大変で、 なかなか安定動作しないそうです。 細川さんは非常に多忙な中、多くの作業をされており、 シリアルコンソールまわりの改善や FPUエミュレーションがらみの問題解決をされているそうです。

最近はどうなってるの?

最近 (2002-06) になってTsubaiさんが最新のNetBSD への追従とその他のデバイス (IDE, 10M Ether) を動かしたというメールが流れています。

NetBSD-1.6Aの2002-06-14 UTCなソースを取り出して、 build.shをかけたのですがユーザランドがうまく作れません。 kernelだけはなんとかcompileできたので、 NetBSD-1.5Yなuserlandのkernelだけ入れ換えてbootしてテストしてみました。

IDE HDDは認識され、disklabelを書いてnewfsしてmountできました。 ファイルの読み書きなども問題ありません。すばらしい!

10BASE-TのEtherは私の環境では認識はされるものの、動作していません。

これでほとんどのデバイスが動作し始めたと言えるのではないでしょうか

しかも最新のNetBSDに対応したおかげでbuild.shが使えるようになることもあり、このページのような面倒な構築手順も不要になるのかもしれません。

いまのところ古い情報として残しておきますが、今後は新しいソースに対応して書き換えたいと思います。

OS環境構築

まずは環境整備から行う。項目としては次のとおりである。

NetBSD/i386のインストール

OpenBlockSではセルフ開発は今のところ不可能なので、 クロスコンパイル環境が必須である。 てことで、まずはクロスコンパイル環境を作る。

クロスコンパイルを行うOSはやはりNetBSDが一番便利である (BSD MagazineによるとFreeBSD上にNetBSD のクロスコンパイル環境を作ることもできるそうだ)。 で、i386マシンをでっちあげNetBSD/i386 1.5.2をフルインストールした。

使い慣れたtcshとソースを取り出すために必要なCVSをインストールした。

ソースのアーカイブが取得できない場合は、前述のftp.jp.netbsd.orgから FTPした。

# cd /usr/pkgsrc/devel/cvs
# make; make install
# cd /usr/pkgsrc/shells/tcsh
# make; make install

CVSはソースをチェックアウトするために必須である。

ソースツリーの準備とビルド用ディレクトリ (DESTDIR) の作成

カーネルソースのチェックアウト

さて、クロスコンパイルするためのソースを用意しなければならない。 今回対象とするソースは2001/05/12のソースなので CVSを用いてチェックアウトする。

ソースは/usr/srcにチェックアウトするのが一般的だろう。

手元のマシンにcvsupしてきたNetBSDのリポジトリを持っていれば、 リポジトリごと/usr/CVS/NetBSDにNFSマウントし、 ローカルマシンでcvs checkoutすればよい。

# mkdir /usr/src
# cvs -d /usr/CVS/NetBSD/cvsroot checkout -D 2001-05-12 src

手元にNetBSDのリポジトリがない場合には、

# mkdir /usr/src
# cvs -d :pserver:anoncvs@sup.jp.netbsd.org:/cvs/cvsroot checkout -D 2001-05-12 src

などと入力する。 詳しくはNetBSDの 本家Webサイトのドキュメントを参考にしてほしい。

ちなみに、ソースの準備には非常に時間がかかる。

OpenBlockS用のカーネルソースの準備

無事にソースが準備できたらOpenBlockS用のカーネルソースを追加する。

カーネルソースは ftp://nandra.iri.co.jp/pub/NetBSD/mpc860/OLD/ にある。そこにあるmpc860-0512.tar.gzを入手し、展開する。

# cd /usr/src
# tar xvzf ~/mpc860-0512.tar.gz

ビルド用ディレクトリの作成

OpenBlockS用のファイルを置くビルドディレクトリを作成する。

ここでは/usr/openbloksというディレクトリを作成する。

# mkdir /usr/openblocks

このディレクトリにはOpenBlockS 用にコンパイルされたソフトウェアがインストールされる (正確にはバイナリ以外のincludeファイルや /etcに置かれる設定ファイルなどのファイルシステムのイメージそのもの)。

ネットワークブートのための設定

現時点ではOpenBlockSのIDEドライバがないため、 OpenBlockS単体でブートすることができない。 そこで、ネットワークブートを利用する。

ネットワークブートにはbootpを使い、 ブート後のファイルシステムはNFSを使う。 ということで、bootpサーバとNFSサーバの設定を行う必要がある。

bootpの設定

bootpサーバに使ったマシン (ppr) のIPアドレスは192.168.100.70である。

bootpでカーネルをロードするのでbootpの設定が必要である。 /etc/bootptabを編集する。なければ作る。

ppr# cat /etc/bootptab 
obs.tokuda.net:\
        :ht=ether:\
        :ha=00806D4729D5:\
        :sm=255.255.255.0:\
        :lg=192.168.100.70:\
        :ip=192.168.100.60:\
        :hn:\
        :bf=netbsd:\
        :bs=auto:\
        :rp=/usr/openblocks:

指定した項目の意味は次のとおり。

/etc/inetd.confでbootpを有効にする (25行目)。

bootps  dgram   udp     wait    root    /usr/sbin/bootpd     bootpd

inetdにHUPシグナルを送って、設定を有効にしておく。

# kill -HUP `cat /var/run/inetd.pid`

NFSの設定

NFSは/usr/openblocksがマウントできるように設定しておく。 /etc/exportsにその旨記述する。私は面倒なので/usr 以下すべてマウントできるような設定にしてしまっている。

ppr# cat /etc/exports 
/usr                   -alldirs -maproot=root 192.168.100.60

OpenBlockSのIPアドレスを192.168.100.60にするので、 OpenBlockSからのアクセスを許可する設定である。

/etc/rc.confにNFSデーモンが起動するような記述を加えておく。

nfs_server="YES"
rpcbind="YES"

クロスコンパイル環境の構築

OpenBlockS用のバイナリをコンパイルするために、

を行う必要がある。

PowerPCのクロスコンパイラはpkgsrcからインストールする訳だが、 includeとlibは自分で作成する必要がある。

クロスコンパイラの導入

まずは、コンパイラと周辺ツール (ar, as, ld, nm, ranlibなど) を作成する。 クロスコンパイラはpkgsrcをつかってmake一発、 あとはビルド用のスクリプトを作ればオッケーである。

PowerPCのクロスコンパイラの導入

OpenBlockSはMPC860というCPUを搭載している。 MPC860はPowerPCシリーズ (統合型らしい) なので、 PowerPC用のクロスコンパイラを用意する必要がある。

NetBSDはさまざまなプラットフォームで利用できるように工夫されており、 FreeBSDのportsに相当する pkgsrcを利用すれば非常に用意にクロスコンパイラがインストールできる。

NetBSDのFTPサイトからpkgsrcの最新版を入手し、 /usrに展開した。目的のクロスコンパイラは、 /usr/pkgsrc/cross/powerpc-netbsdである。

ところが、2001/10/28のpkgsrc.tar.gzを使ったら、egcs-1.1.1.tar.gzが無い、 という理由でストップする。とりあえず、 ftp://ftp.jp.netbsd.org/pub/NetBSD/packages/distfiles/ から必要なファイルを手動でFTPしてきた。

さっそくmakeする。

# cd /usr/pkgsrc/cross/powerpc-netbsd
# make; make install

インストールが終ると/usr/pkg/cross/powerpc-netbsd にクロスコンパイラができあがっているはずである。

makeの更新

i386版のmakeを更新する。ただし、他への影響を防ぐため、 もとのmakeはバックアップしておく。

# cd /usr/src/usr.bin/make
# make
# mv /usr/bin/make /usr/bin/make.bak
# cp make /usr/bin

ビルドスクリプトの作成

OpenBlockS用のビルドスクリプトを用意する (obsmake.sh)。

obsmake.sh
----
#!/bin/sh
NOCLEANDIR=yes; export NOCLEANDIR
NOGCCERROR=yes; export NOGCCERROR
DESTDIR=/usr/openblocks; export DESTDIR
OBJMACHINE=openblocks; export OBJMACHINE
RPCGEN=/usr/bin/rpcgen; export RPCGEN
MKLINT=no; export MKLINT
MKNLS=no; export MKNLS
MKPROFILE=no; export MKPROFILE
STRIPFLAG= ; export STRIPFLAG


MACHINE=mpc860; export MACHINE
MACHINE_CPU=mpc860; export MACHINE_CPU
MACHINE_ARCH=powerpc; export MACHINE_ARCH

TARGET=/usr/pkg/cross/powerpc-netbsd/bin

CPP=`${TARGET}/gcc -print-prog-name=cpp`

make    AR=${TARGET}/ar \
        AS=${TARGET}/as \
        CC=${TARGET}/cc \
        LD=${TARGET}/ld \
        NM=${TARGET}/nm \
        RANLIB=${TARGET}/ranlib \
        SIZE=${TARGET}/size \
        STRIP=${TARGET}/strip \
        OBJCOPY=${TARGET}/objcopy \
        CXX=${TARGET}/c++ CPP=${CPP} $*

パスの通ったディレクトリにobsmake.shを置き、実行権限をつけておく。

# mv obsmake.sh /usr/local/bin
# chmod +x /usr/local/bin/obsmake.sh

以降はこのobsmake.shを使ってビルドを行う。

include, libを作る

いよいよ/usr/srcの下で作業である。

OpenBlockS用のルートディレクトリ (DESTDIR) にディレクトリツリーを作成する

OpenBlockSのルートディレクトリにディレクトリツリーを作成する。 ただ、そのままmake beforeinstallを実行すると namedというユーザおよびグループがないと怒られるので、 namedというユーザとグループを追加する。

# vi /etc/group
----
named:*:5555:
----

# vipw
----
named:*:9:5555::0:0:Domain Name Service:/etc/namedb:/sbin/nologin  
----

準備完了につき、DESTDIRにディレクトリツリーを作成する。

# cd /usr/src
# obsmake.sh beforeinstall

includeファイルを作成する

PowerPCのクロスコンパイラをインストールしただけでは i386のように最初からincludeファイルやlibファイルが存在しない。 そこで、まずはインクルードファイルを作成する必要がある。

これから作成するincludeおよびlib をクロスコンパイラが使えるようにシンボリックリンクを張っておく。

# cd /usr/pkg/cross/powerpc-netbsd
# rmdir include lib
# ln -s /usr/openblocks/usr/include .
# ln -s /usr/openblocks/usr/lib .

また、/usr/src/Makefileの77行目にあるregress ディレクトリをコメントアウトしとく。

76 .ifmake !(install)
77 #SUBDIR+= regress
78 .endif

また、さきほど展開したカーネルソースにinclude ファイルが付属しているが、足りないファイルが存在する。 そこで足りないファイルをpowerpcのincludeファイルから借りてくる。 とりあえずシンボリックリンクを張ることにした。

シンボリックリンクを張るシェルスクリプト (includes.sh) は次のとおり。

includes.sh
----
SRCROOT=/usr/src
DESTDIR=/usr/openblocks
PPCINCLUDE=${SRCROOT}/sys/arch/macppc/include
MPCINCLUDE=${SRCROOT}/sys/arch/mpc860/include

ln -s ${PPCINCLUDE}/adbsys.h ${MPCINCLUDE}
ln -s ${PPCINCLUDE}/bat.h ${MPCINCLUDE}
ln -s ${PPCINCLUDE}/bus.h ${MPCINCLUDE}
ln -s ${PPCINCLUDE}/grfioctl.h ${MPCINCLUDE}
ln -s ${PPCINCLUDE}/ipkdb.h ${MPCINCLUDE}
ln -s ${PPCINCLUDE}/keyboard.h ${MPCINCLUDE}
touch ${MPCINCLUDE}/machine_type.h
ln -s ${PPCINCLUDE}/z8530var.h ${MPCINCLUDE}

ln -s ${MPCINCLUDE} ${DESTDIR}/usr/include/mpc860

.WAITディレクトリがうまく扱えないので、エラーになってしまった。 これはどうやらbsd.subdir.mkファイルが古いのが原因らしいので、 新しいファイルに差し替える。

ppr# mv /usr/share/mk/bsd.subdir.mk  /usr/share/mk/bsd.subdir.mk.org
ppr# cp /usr/src/share/mk/bsd.subdir.mk /usr/share/mk

いよいよincludeファイルを作る。結構時間がかかる。

# obsmake.sh includes

libファイルを作成する

includeファイルができたら次はライブラリを作る。

まずはlib/csuを作る。

# cd /usr/src/lib/csu
# obsmake.sh dependall; obsmake.sh install

libを作る。これまた結構時間がかかる。

# cd /usr/src/lib
# obsmake.sh dependall; obsmake.sh install

ここまでくれば、あとはbuildするだけ。

ブートローダの作成

まだCFやHDDからブートできないので、 bootp+NFSでブートするためのブートローダをbuildする。

# cd /usr/src/sys/arch/mpc860/stand
# obsmake.sh

/usr/CVS/0512/basesrc/sys/arch/mpc860/stand/boot/boot がbootプログラムになる。このbootをOpenBlockSに転送する。 転送するためにWindowsを使ったのは内緒。

CD-ROMのtcpdwl.cをコンパイルしても良い。

# gcc -o tcpdwl tcpdwl.c
# ./tcpdwl -v 192.168.100.60 /usr/src/sys/arch/mpc860/stand/boot/boot

bootをOpenBlockSに転送する作業は最初の一回だけでよい。 転送方法は通常のファームウェアのアップデート手順と同じである。 ぷらっとホームのWebサイト ( ファームウェアアップデート手順) にやりかたが書いてある。

また、このブートローダを転送した後、 元のOpenBlockSに戻すときには再度ファームウェアのアップデートを行えば、 問題なく戻る (実験して確認済み)。

カーネルの作成

さて、いよいよカーネルのbuildである。 がその前に、少し作業がある。

先に展開したOpenBlockS用のカーネルソースをそのままbuild するとシングルユーザモードで起動するようになっている。 そこで、マルチユーザモードにするためにカーネルソースを修正する。

カーネルのソース /usr/src/sys/arch/mpc860/mpc860/machdep.cの591行目の boothowtoにRB_SINGLEを代入してシングルユーザモードにしているので、 この部分をコメントアウトしてカーネルの再構築を行う。

    589         __syncicache((void *)EXC_RST, EXC_LAST - EXC_RST + 0x100);
    590
    591 /*      boothowto = RB_SINGLE; ここをコメントアウトした */
    592
    593 #ifdef DDB

また、/usr/src/sys/arch/mpc860/conf/Makefile.mpc860の121行目で /export/openblocksにカーネルをコピーしているところを /usr/openblocksに変更する。

    120 SYSTEM_LD_TAIL+=; \
    121                 echo cp $@ /export/openblocks; cp $@ /usr/openblocks
    122

修正したら通常のカーネルの構築と同様の手順でmakeを行う。

# cd /usr/src/sys/arch/mpc860/conf
# config MPC860
# cd ../compile/MPC860
# obsmake.sh depend
# obsmake.sh

ユーザランドを作成する

ついにユーザランドの作成に突入である。

例によって、うまくコンパイルできないところがあるので回避する。 本来ならばコンパイルできるようにソースを直すのが正しいのだが、 スキル不足ゆえご容赦くだされ。

まず、usr.bin/fileのコンパイルが通らない。 そこでMakefileから削る。

次に、gnu/usr.bin/egcs/f771もコンパイルが通らなかったので Makefileから削る。

# cp /usr/src/gnu/usr.bin/egcs/Makefile  /usr/src/gnu/usr.bin/egcs/Makefile.org
# vi /usr/src/gnu/usr.bin/egcs/Makefile

7行目のf771を削る。

  6 SUBDIR=         c89 cc cpp collect2 g++ g77 gcov \
  7                 common .WAIT cc1 cc1plus cc1obj
  8 .endif

それ以外にもコンパイルできない物があれば、 Makefileから削って対処する (消極的だなー)。

いよいよbuild。

# cd /usr/src
# obsmake.sh dependall
# obsmake.sh install

/etcを作るためにはetc.mpc860が必要なので、etc.powerpcにシンボリックリン クを張っておく。

# cd /usr/src/etc
# ln -s ./etc.macppc etc.mpc860
# obsmake.sh distribution

デバイスファイルのデバイス番号がだいぶ違うので、 /usr/src/sys/arch/mpc860/mpc860/conf.cを見ながら /usr/openblocks/dev/MAKEDEVを直す。結局、こんなパッチ (MAKEDEV.patch) を作った。

パッチを当ててデバイスファイルを作り直す。

# cd /usr/openblocks/dev
# patch < MAKEDEV.patch
# ./MAKEDEV all

/etc/fstabがないとシングルユーザモードに落ちるので作成する。

# cd /usr/openblocks/etc
# touch fstab

/etc/rc.confを修正する。 18行目のrc_configuredをYESにして、 IPアドレスなどのネットワーク設定を追加する。

 17 #
 18 rc_configured=YES
 19
 20 # Add local overrides below
 21 #
 22 hostname="obs.tokuda.net"
 23 ifconfig_fec0="192.168.100.60"
 24 defaultroute="192.168.100.1"

ftpとtelnetぐらいはできるように/etc/inetd.confを修正する (下の例では7,9行目)。

inetd.conf
----
 7 ftp             stream  tcp     nowait  root    /usr/libexec/ftpd ftpd -ll
 8 #ftp            stream  tcp6    nowait  root    /usr/libexec/ftpd ftpd -ll
 9 telnet          stream  tcp     nowait  root    /usr/libexec/telnetd telnetd
10 #telnet         stream  tcp6    nowait  root    /usr/libexec/telnetd telnetd

telnet経由のrootのログインを許可するためにroot/etc/ttysを修正 (下の例では17から19行目)。

ttys
----
16 tty07   "/usr/libexec/getty std.9600"   unknown off secure
17 ttyp0   none                            network off secure
18 ttyp1   none                            network off secure
19 ttyp2   none                            network off secure
20 ttyp3   none                            network

動作確認

いよいよ動作確認である。

ブートさせてみる

ブートメッセージはシリアルコンソールから出力される。 シリアルコンソールに出力できないとブートが進まないので、 シリアルコンソールのをモニタリングは必須である。

ここではFreeBSDのtipを使った (rootで実行する)。 WindowsならTeraTermとか使うんかな。

ACアダプタを挿してみる。するとコンソールからメッセージがながれる。

tokuda@jetworld> su
Password:
jetworld# tip cuaa0c
connected

>> OpenBlockS Boot, Revision 1.1
>> (tokuda@cutiepie.tokuda.net, Mon Jun 25 11:30:04 JST 2001)
Using IP address: 192.168.100.60
root addr=192.168.100.70 path=/usr/openblocks
993648timeout
+157800 [94+62752+46541]=0x133f8c
 start=0x10000
ssym = 1291d8, esym = 14c000
[ using 142888 bytes of netbsd ELF symbol table ]
Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001
    The NetBSD Foundation, Inc.  All rights reserved.
Copyright (c) 1982, 1986, 1989, 1991, 1993
    The Regents of the University of California.  All rights reserved.

NetBSD 1.5V (MPC860) #0: Tue Nov  6 12:36:54 JST 2001
    tokuda@ppr:/usr/src/sys/arch/mpc860/compile/MPC860
total memory = 16384 KB
avail memory = 13668 KB
using 230 buffers containing 920 KB of memory
mainbus0 (root)
cpu0 at mainbus0: Version 50 (Revision 0)
pbus0 at mainbus0
scc0 at pbus0: console
intr_calculatemask: none ffbf0000, bio ffbf0006, net ffbf0006, high ffff000f
fec0 at pbus0 vec 5: address 00:80:6d:47:29:d5
tqphy0 at fec0 phy 1: 78Q2120 10/100 media interface, rev. 11
tqphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
intr_calculatemask: none ffaf0000, bio ffaf0006, net ffbf0006, high ffff000f
boot device: 
root on fec0
nfs_boot: trying DHCP/BOOTP
ioctl: ENETRESET
nfs_boot: BOOTP server: 192.168.100.70
nfs_boot: my_name=obs.tokuda.net
nfs_boot: my_addr=192.168.100.60
nfs_boot: my_mask=255.255.255.0
ioctl: ENETRESET
ioctl: ENETRESET
root on ppr:/usr/openblocks
Thu Nov  8 04:02:22 UTC 2001
Automatic boot in progress: starting file system checks.
mount: /: unknown special file or file system.
Setting tty flags.
ttyflags: open /dev/tty00: Operation not supported by device
ttyflags: open /dev/tty01: Operation not supported by device
Setting sysctl variables:
Starting network.
Hostname: obs.tokuda.net
add net 127.0.0.0: gateway 127.0.0.1
Configuring network interfaces: fec0ioctl: ENETRESET
ioctl: ENETRESET
.
add net default: gateway 192.168.100.1
Adding interface aliases:
Building databases...
Starting syslogd.
Checking for core dump...
savecore: no core dump (no dumpdev)
Mounting all filesystems...
Clearing /tmp.
Starting virecover.
Checking quotas: done.
Setting securelevel: kern.securelevel: 0 -> 1
/etc/rc: WARNING: No swap space configured!
dmesg: can't get size of msgbuf
Updating motd.
starting local daemons:.
Starting inetd.
Starting cron.
Thu Nov  8 04:03:22 UTC 2001
Nov  8 04:03:26 obs getty[157]: /dev/tty00: Operation not supported by device
Nov  8 04:03:26 obs getty[156]: /dev/ttyE0: Device not configured

やっとここまできた。すなおに感動。

ログインする

ブートメッセージからブートの成功を確認したら、 さっそくtelnetしてみる。

tokuda@jetworld{102}> telnet obs
Trying 192.168.100.60...
Connected to obs.tokuda.net.
Escape character is '^]'.
login: root
Last login: Thu Nov  8 04:05:42 2001 from 192.168.100.70
Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001
        The NetBSD Foundation, Inc.  All rights reserved.
Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
        The Regents of the University of California.  All rights reserved.

NetBSD 1.5V (MPC860) #0: Tue Nov 6 12:36:54 JST 2001
Terminal type is kterm.
We recommend creating a non-root account and using su(1) for root access.
obs# ls /
.cshrc    altroot   dev       home      netbsd    sbin      sys       usr
.profile  bin       etc       mnt       root      stand     tmp       var
obs# ps axw
PID TT STAT TIME COMMAND
  0 ?? DKs  0 :00.02 (swapper)
  1 ?? Is   0 :00.35 init 
  2 ?? IK   0 :04.79 (nfsio)
  3 ?? IK   0 :01.65 (nfsio)
  4 ?? IK   0 :00.42 (nfsio)
  5 ?? IK   0 :00.08 (nfsio)
  6 ?? DK   0 :00.02 (pagedaemon)
  7 ?? DK   0 :01.28 (reaper)
  8 ?? DK   0 :00.11 (ioflush)
  9 ?? DK   0 :00.31 (aiodoned)
 68 ?? Is   0 :01.00 /usr/sbin/syslogd -s 
151 ?? Is   0 :00.25 /usr/sbin/inetd -l 
154 ?? Is   0 :00.37 /usr/sbin/cron 
156 ?? I    0 :00.50 /usr/libexec/getty std.9600 ttyE0 
157 ?? I    0 :00.40 /usr/libexec/getty std.38400 tty00 
213 ?? S    0 :01.28 telnetd 
214 p0 Ss   0 :01.67 -csh 
220 p0 R+   0 :00.03 ps axw 
obs# 

動くコマンドもあり、動かないコマンドもあり。 ifconfigなんかは固まっちゃう。ps auxのuがだめみたい。 dmesgもだめですな。gccもだめ。これはつらい。

mailコマンドでメール送ってみたりできる。/etc/resolv.conf にちゃんとネームサーバ指定してやるとインターネットにもメールが出せる。

/usr/gamesもある。rogueで遊んでみた。遊べるよ、これ。

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

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

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

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

LEDドライバはカーネルソースにパッチを当てる (led.patch)。

# cd /usr/src/sys/arch/mpc860
# patch < led.patch

パッチはconf/MPC860, conf/files.mpc860 にledドライバを使うための記述を追加し、 dev/led.cというドライバ本体のファイルを作成する。

で、カーネルを再コンパイルする。 手順は先のカーネルのコンパイルと同様の手順なので省略するが、 config MPC860してobsmake.sh dependしてobsmake.shすればよい。

パッチを見るとわかるがLEDドライバはデバイス/dev/ledでメジャー番号が24 であることを期待して作成されているため、 手動でデバイスを作成してやる必要がある。

# mknod /dev/led c 24 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) である。

クロスコンパイル環境でhappy.cをコンパイルする。

# cp happy.c /usr/openblocks/root
# cd /usr/openblocks/root
# /usr/pkg/cross/powerpc-netbsd/bin/cc -o happy happy.c

コンパイルが終ったらOpenBlockSにログインしてhappy を実行するとLEDがHAPPyと表示されるはず。

LEDに関係するレジスタ

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

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

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

Webサーバで遊ぼう

せっかく動いているんだから、Webサーバの一つでも動かしてみるか、 ってことでWebサーバをインストールして遊んでみた。

とはいっても、gccが動かないのでセルフコンパイルは無理。 つまりクロスコンパイルできるWebサーバが必要になる。

Apache, publicfile, thttpdなどを試してみたものの、 サクッとコンパイルできるWebサーバは見付からない。 と、そんな中boaというWebサーバはコンパイルが完了し、 うまく動作した。

boaのアーカイブ (今回はboa-0.94.8.3を使用) を展開し、 configureしてobsmake.shを叩くだけである。

# tar xvzf boa-0.94.8.3
# cd ./boa-0.94.8.3/src
# ./configure
# obsmake.sh

コンパイルができたら、boaを適切なディレクトリにコピーして、 いくつか設定ファイルを作成する。

まずは設定ファイルのメインとなるboa.confである。 サンプルはboaのアーカイブを展開したディレクトリにあるものをそのまま使う。

なにも考えないと次のような設定になる。

てことで、準備する (コンパイルしたsrcディレクトリにいるとする)。

# mkdir /etc/boa
# mkdir /etc/www
# mkdir /var/log/boa
# echo text/html html > /etc/mime.types
# cp boa /etc/boa
# cp ../boa.conf /etc/boa

mime.typesはとりあえずhtmlだけ追加しておいた。

さっそくboaを起動しよう。

# cd /etc/boa
# ./boa -c ./boa.conf

適当なHTMLファイルを/etc/wwwに作ってブラウザでアクセスし、 動作の確認を行う。

ということで、Webサーバの一丁あがりである。

SCC Ethernetドライバ

SCC Ethernetドライバ (sce) がTsubaiさんによってサポートされました。

mpc860-020616.tar.gzなカーネルを作るとsceドライバが入ってます。

いまのところ私の手元では動作していないのですが、 まともにNetBSD-1.6Aのユーザランドを作れていなので検証できてない状況です。

CF & HDDインタフェース

IDEドライバがTsubaiさんによってサポートされました。

参考リンク

このページがあるのも皆様のおかげです。

すべて無断リンクです。ごめんなさい。

謝辞

OpenBlockSでNetBSDが動くことを証明し、 そのソースを公開していただいたTsubai Masanoriさん。 Tsubaiさんのおかげでこのページがあります。

NetBSD/openblocksのPortメンテナである細川さん。 細川さんにはメールや展示会でとても親切に対応していただきました。

OpenBlockSというオモチャをこの世に送りだした ぷらっとホームさん。 使い倒すには大変ですが、十分楽しんでおります。

更新履歴


HOME/ NetBSD/ OpenBlockS

$Lastupdate: Tue Dec 24 02:09:10 2002 $