NetBSD/evbarmでRTCを使えるようにする

投稿日: Leave a comment

NetBSD-current/evbarm の RPI のカーネル設定を見ていたら,こんなのを見つけた.

# 'DS3231 Raspberry Pi RTC Board Real Time Clock Module for Arduino'
# sold by linksprite.com
dsrtc* at iic1 addr 0x68 flags 3231

まさに同じRTCを使っているので,7-stableの方に書いてカーネルを作り直してみたら,問題なく使えた.

bcmspi0 at obio0 intr 54: SPI
spi0 at bcmspi0: SPI bus
bsciic0 at obio0 intr 53: BSC0
iic0 at bsciic0: I2C bus
bsciic1 at obio0 intr 53: BSC1
iic1 at bsciic1: I2C bus
dsrtc0 at iic1 addr 0x68: DS3231 Real-time Clock
bcmgpio0 at obio0: GPIO [0...31]
gpio0 at bcmgpio0: 32 pins
bcmgpio1 at obio0: GPIO [32...53]
gpio1 at bcmgpio1: 22 pins

ただ,”年” の扱いが1970年(POSIX_BASE_YEAR)からの差分になっていて,Linuxと違うみたいなので,注意が必要.

/etc/protocols on FreeBSD/NetBSD

投稿日: Leave a comment

FreeBSD機 (Core2 duo),NetBSD機 (Raspberry pi)に同じpf.confを入れたが,FreeBSDでは動いて,NetBSDでは動かず.

具体的には,以下のルールがNetBSDでは弾かれる.icmp6は知らん,と.

pass inet6 proto icmp6 all

man pf.confを見るとicmp6って書いてあるが,その下に/etc/protocolsを見るとも書いてある.

proto <protocol>
      This rule applies only to packets of this protocol. Common
      protocols are icmp(4), icmp6(4), tcp(4), and udp(4). For a list of
      all the protocol name to number mappings used by pfctl(8), see the
      file /etc/protocols.

念のため,FreeBSDとNetBSDでicmp6がどう載っているか比べてみた.

FreeBSD

ipv6-icmp 58 IPV6-ICMP icmp6 # ICMP for IPv6

NetBSD

ipv6-icmp 58 IPv6-ICMP # ICMP for IPv6 [RFC2460]

NetBSDにはicmp6が入っていなかった.NetBSD,FreeBSDどちらもipv6-icmpなら載っているので,pf.confにはipv6-icmpと書くことにした.

pass inet6 proto ipv6-icmp all

NetBSD/evbarm(2) with pf

投稿日: Leave a comment

FreeBSD/armが安定しなかったので,NetBSD/evbarmを入れることにした.出戻り

今回は,http://nyftp.netbsd.org/pub/NetBSD-daily/HEAD/ からスナップショットのSDイメージを持ってきてさくっとインストール.アップデートもここからユーザーランドを持ってこれるので自ビルドする必要はなさそう.

sshdをインターネットにさらそうと思っているので,sshguardを入れるべく,pfを使えるようにする.そのためにはカーネルを作り直さないとダメみたいなので,FreeBSDの母艦PCでクロスビルドする.

1. ソースの取得

ここと同じ.今回は /home/netbsd/current/src に展開.

2. kernel config

/src/sys/arch/evbarm/conf/RPI の末尾を見ると,

% tail RPI

# data mover pseudo-devices
#pseudo-device swdmover # software dmover(9) back-end
#pseudo-device dmoverio # /dev/dmover dmover(9) interface

# userland interface to drivers, including autoconf and properties retrieval
pseudo-device drvctl

# local configuration
cinclude "arch/evbarm/conf/RPI.local"

とあるので,RPI.localを作っていろいろ追加していけばよさそう.ということで,こんなRPI.localにした.

% cat RPI.local
file-system UNION # union file system
pseudo-device pf # PF packet filter 
pseudo-device pflog # PF log if
pseudo-device vlan # IEEE 802.1q encapsulation

※ついでに使うかわからないけど,union file systemとvlanも入れておいた.

3. クロス環境の構築

基本的にはここと同じだが,archとしてearmhf を指定することと,FreeBSD/amd64のclangでコンパイルできなかったので,gccを使うことに注意.

まず,gccを入れてなかったのでインストールから.

# pkg install gcc

gcc-4.7.1がgcc47として入るので,クロス環境の構築時に指定してあげる.earmhfも指定する.

% cd /home/netbsd/current/src
% HOST_CC=gcc47 HOST_CXX=g++47 ./build.sh -O ../objarm -m evbarm -a earmhf -U tools

4. カーネル構築

クロス環境の構築に引き続きカーネルを構築.コマンドはほとんど同じ.

HOST_CC=gcc47 HOST_CXX=g++47 ./build.sh -O ../objarm -m evbarm -a earmhf -U kernel=RPI

基本的にクロスコンパイラーを使うのでHOST_CCとか指定する必要はなさそうだが,一応入れておいた.

5. カーネルの入れ替え

objarm/sys/arch/evbarm/compile/RPI/netbsd.binをコピーして,NetBSD on Raspberry pi の /boot/kernel.img としておいて再起動.

カーネルはSDカード先頭のFATパーティションに置くことになっているが,/bootにマウントされているので,動作中に置き換え出来る.

NetBSD/evbarm

投稿日: Leave a comment

Fedora上でNetBSD/evbarmをビルドしたのでその記録.ここを参照した.

Linux上でのクロスコンパイルなんだけど,見た目Linuxで動作させている感じが全く現れていない.というか何の問題もなくクロスビルドできちゃうところがすごい.

ソースの取得

CVSから.コマンドはこんな感じ.

$ cd work/netbsd/current
$ export CVSROOT=anoncvs@anoncvs.NetBSD.org:/cvsroot
$ export CVS_RSH=ssh
$ cvs checkout -P src

クロスビルド環境の構築

$ cd src
$ ./build.sh -O ../objarm -m evbarm -j 4 -u -U tools

./build.sh –help するといろいろ説明が出てくるけど,-uはcleanしない,-Uは非rootユーザーでビルドを実行する,の意味.

リリースビルド

$ cd src
$ ./build.sh -O ../objarm -m evbarm -j 4 -u -U release

初回ビルドだと結構時間がかかるが一度ビルドすると差分ビルドになるので時間はかなり短縮される.

ビルドが完了すると,../objarm/releasedir/evbarm/binary/gzimg/rpi.img.gz に SDカードのイメージができる.

SDカードの作成

Windows環境でイメージファイルをSDに焼くツールはいろいろあるけど,今回使ったのは win32diskimager というツール.USBメモリーやSDカードなどのフラッシュメモリの消去やチェックができるChkFlshというツールでも書き込み可能.

どのツールを使うにせよ,SDにパーティションが切られているとうまくかけないので,Windows標準(Vista以降?)のdiskpartコマンドでパーティションを消去する.

DISKPART> list disk

  ディスク      状態           サイズ   空き   ダイナ GPT
  ###                                          ミック
  ------------  -------------  -------  -------  ---  ---
  ディスク 0    オンライン     298 GB   0 B
  ディスク 1    オンライン     947 MB   0 B

ここでは1GBのSDカードを入れたのでディスク1を選択する.

DISKPART> select disk 1

ディスク 1が選択されました。

削除する前に,念のためパーティションを確認する.

DISKPART> list part

  Partition ###  Type                Size     Offset
  -------------  ------------------  -------  -------
  Partition 1    プライマリ          56 MB    4096 KB

消して良さそうなら削除する (次のコマンドを実行した瞬間に反映されるのでEnterを押すときは慎重に)

DISKPART> clean

DiskPart はディスクを正常にクリーンな状態にしました。

いよいよrpi.imgの焼きこみ.ドライブ文字とファイルのパスを指定して書き込んでおしまい.

ファームウェアの入れ替え

このままSDカードに焼いても手元のRaspberry Piはブートせず.どうやらファームウェアがダメみたいなので,ファームウェアを最新のものに入れ替える.

ファームウェアはSD上のMSDOSファイルシステム(64MB)においてあるので,GitHubから持ってきて差し替える.

具体的には,bootフォルダのkernel.img以外をダウンロードしてSDに突っ込むだけ.

これで無事カーネルが起動してOSが立ち上がった.

以下,おまけ.

ソースを更新するには

$ cvs update -dP

カーネルを作り直すには?

src/sys/arch/evbarm/conf/ にコンフィグレーションファイルをおいて,

./build.sh -O ../objarm -m evbarm -j 4 -u -U kernel=<コンフィグレーションファイル名>

を実行すると,../objarm/sys/arch/evbarm/compile/<コンフィグレーション>/netbsd.bin ができるので,これを kernel.img にリネームしてSDカードに置く.

Raspberry Pi type B

投稿日: Leave a comment

マイクロサーバー的なものを作って遊ぼうと思っていろいろ調べていたら Raspberry Pi type B (Ether付) が良さそうなので買ってみた.

DebianベースのLinuxを入れるのが一般的のようだけど,何となくNetBSDを入れてみることにした.

とりあえずここにあった 2013-07-30-netbsd-raspi.img をSDカードに書き込んでブート.

最初はUSB-UARTが手元になかったので,HDMIコネクタをプラズマテレビにつないで起動.37インチの画面にブートログがたらたら流れ始めた.さすがに,USBキーボードをつないだりというのは鬱陶しいので,組み立てていなかったUSB-UARTボードにピンを立ててRaspberry Piに立っているピンヘッダーのUART端子とつないでブート.

回路図はここ(PDF)を参考に.2列のピンヘッダー(P1)の6番がGND,8番がTXD0,10番がRXD0なので,それぞれUSB-UARTアダプタのGND,RXD,TXDに接続.ボーレートは115200 bpsに設定.

でこんな感じに表示される.

20130831_NetBSD_RPI_BOOT

dmesgはこんな感じ.エラーがパラパラでているけど,何とか動作している(?)

続きを読む Raspberry Pi type B