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と違うみたいなので,注意が必要.

raspberry pi が無反応になる問題の解析

投稿日: Leave a comment

ここ最近,数週間おきにRaspberry Piのsshdやntpdが無反応になって,仕方なく電源OFF-ONしちゃっていたけど,いい加減なんとかしなきゃと思い,シリアルコンソールで様子を見てみた.

OS自体は動いていているが,IPアドレスがなくなって応答できなくなっていたらしい.

で,ログを調べてみたらこんな記録を発見.

Mar 15 07:55:53 rose kernel: [1194220.313105] usb 1-1.1: USB disconnect, device number 3
Mar 15 07:55:53 rose kernel: [1194220.315727] smsc95xx 1-1.1:1.0 eth0: unregister 'smsc95xx' usb-bcm2708_usb-1.1, smsc95xx USB 2.0 Ethernet
Mar 15 07:55:53 rose kernel: [1194220.316023] smsc95xx 1-1.1:1.0 eth0: hardware isn't capable of remote wakeup
Mar 15 07:55:53 rose kernel: [1194220.415560] Indeed it is in host mode hprt0 = 00001101
Mar 15 07:55:53 rose kernel: [1194220.661689] usb 1-1: reset high-speed USB device number 2 using dwc_otg
Mar 15 07:55:53 rose kernel: [1194220.661919] Indeed it is in host mode hprt0 = 00001101
Mar 15 07:55:54 rose kernel: [1194221.241525] usb 1-1.1: new high-speed USB device number 4 using dwc_otg
Mar 15 07:55:54 rose kernel: [1194221.341807] usb 1-1.1: New USB device found, idVendor=0424, idProduct=ec00
Mar 15 07:55:54 rose kernel: [1194221.341846] usb 1-1.1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
Mar 15 07:55:54 rose kernel: [1194221.355314] smsc95xx v1.0.4
Mar 15 07:55:54 rose kernel: [1194221.423235] smsc95xx 1-1.1:1.0 eth0: register 'smsc95xx' at usb-bcm2708_usb-1.1, smsc95xx USB 2.0 Ethernet, b8:27:eb:02:f1:08
Mar 15 07:55:54 rose kernel: [1194221.634993] smsc95xx 1-1.1:1.0 eth0: hardware isn't capable of remote wakeup
Mar 15 07:55:54 rose kernel: [1194221.636275] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
Mar 15 07:55:56 rose kernel: [1194223.215749] smsc95xx 1-1.1:1.0 eth0: link up, 100Mbps, full-duplex, lpa 0xC1E1
Mar 15 07:55:56 rose kernel: [1194223.219246] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready

どうやら,何らかの理由でUSBの接続が切れて,USB HUB内蔵のNICがリセットしてしまって,IPアドレスの設定が吹っ飛んだらしい.

そういえば,このRaspberry Piに電源を供給しているMicroUSBケーブル,スマートフォンで使うと急速充電にならないので,5V電源が怪しそうと思い,このケーブルで電流を流した時の負荷側の電圧を測ったところ,700mA流した状態で4.5Vになっていた.往復で0.7Ωもあってダメダメなケーブルとわかって,このダメケーブルは捨てて,急速充電の実績のあるケーブルに変えてしばらく様子を見ることにした.

384kHz/32Bit PCM5102A DAC

投稿日: Leave a comment

Interface 9月号に触発されてPCM5102Aの載ったI2S DACボードを買って動かしてみた.

買ったのはこれではなくてこっち.香港のDIY系通販サイトから直接購入.発注して1週間くらいで届いた.

Raspberry Pi Type Bは実験用に2台目を購入済み.

今回はオーディオ用ということで,Volumioというディストリビューションを入れてみた.

続きを読む 384kHz/32Bit PCM5102A DAC

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にマウントされているので,動作中に置き換え出来る.

FreeBSD/arm build

投稿日: Leave a comment

FreeBSD 10-STABLE / arm のビルドメモ.

1. ソースの取得

10-STABLE用のフォルダをzfsで用意して,svnで持ってくる.

# zfs create -o compression=lz4 -o exec=off -o setuid=off rpool/usr/src_stable10
# cd /usr
# svn co https://svn0.us-west.freebsd.org/base/stable/10 src_stable10

2. ビルドツールの取得

crochet-freebsdというFreeBSD/armのブートイメージを作成するためのスクリプトが用意されているので,それを持ってくる.また,展開したフォルダにu-bootのソースも置いておく必要があり,合わせて取得.

# cd /usr/local
# git clone https://github.com/kientzle/crochet-freebsd.git
# cd crochet-freebsd
# git clone https://github.com/gonzoua/u-boot-pi.git u-boot-rpi

3. 設定ファイルを用意する

crochet-freebsdのconfig.sh.sampleをコピーして編集する.

# diff -uN config.sh.sample config.sh
--- config.sh.sample 2014-05-14 00:09:50.436616000 +0900
+++ config.sh 2014-05-14 00:15:05.937593000 +0900
@@ -25,7 +25,7 @@
 #board_setup GenericI386
 #board_setup PandaBoard
 #board_setup Soekris
-#board_setup RaspberryPi
+board_setup RaspberryPi
 #board_setup VersatilePB
 #board_setup ZedBoard
 #board_setup Wandboard
@@ -45,7 +45,7 @@
 # Suggested: option ImageSize
 #option ImageSize 100mb # for kernel-only images
 #option ImageSize 1950mb # for 2 Gigabyte card
-#option ImageSize 3900mb # for 4 Gigabyte card
+option ImageSize 3900mb # for 4 Gigabyte card

 #
 # How to Customize Your Build
@@ -85,7 +85,7 @@
 # couple of extra reboots, which can make this occasionally perplexing
 # to use.
 #
-#option AutoSize
+option AutoSize

 # Enable emailed status notifications.
 # This can also be enabled via the -e command-line flag.
@@ -147,7 +147,7 @@
 # it will tell you how to get appropriate sources into this directory.
 # (I find FREEBSD_SRC=${TOPDIR}/src to be useful.)
 #
-#FREEBSD_SRC=/usr/src
+FREEBSD_SRC=/usr/src_stable10

 # You will probably never override this, but you may need to
 # understand it: WORKDIR holds all of the created and temporary files

4. ビルド実行

crochet-freebsdのフォルダでスクリプトを実行し,しばし待つ.

# sh crochet.sh -c config.sh

5. 出来上がり

出来上がったイメージをSDに焼いてブート.イメージは work/FreeBSD-armv6-10.0-RPI-B-r.img  として出来上がる.

FreeBSD/arm

投稿日: Leave a comment

Raspberry pi をちょっとしたサーバー(ntpdとかリゾルバとか)にしようと思って、FreeBSD 10-STABLE を自前ビルドして、ここ数日動かしてみた。

が、どうにも安定しない。sshdが突然signal 11で落ちる。これじゃ、使いものにならない。

SDカードが壊れてるのかなぁとも思ったけど、色々試す気力もなく、再びNetBSDに戻ってみることにする。

FreeBSD/armのビルドは追々まとめようと思う。

 

Raspberry PiのRTCを設定

投稿日: Leave a comment

ここのつづき.

rtcの設定を/etc/rc.localに書いてあったけど,起動時の処理が

  1. fake_hwclock
  2. ntpdate (時間がかかる)
  3. ntpd (ntpdateが動いていると待たされる)
  4. rc.localでRTCを設定

とntpdateが動いてRTCの意味がない感じがするので,最初の方でhwclock.shが走るように改造した.

まずはhwclock.shの改造.I2Cバス上のRTCを認識させて時刻をとれるようにする.

root@raspberry:/etc/init.d# diff -u hwclock.sh.orig hwclock.sh
--- hwclock.sh.orig     2014-05-10 09:41:36.171639671 +0900
+++ hwclock.sh  2014-05-10 10:31:32.134145549 +0900
@@ -61,8 +61,15 @@
                printf "0.0 0 0.0\n0\nUTC" > /etc/adjtime
            fi

-           if [ -d /run/udev ] || [ -d /dev/.udev ]; then
-               return 0
+           #load i2c and RTC kernel modules
+           modprobe rtc-m41t80
+           echo m41t62 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
+
+           if [ -e /dev/$HCTOSYS_DEVICE ]
+           then
+               log_action_msg "RTC device found"
+           else
+               echo 0x68 > /sys/class/i2c-adapter/i2c-1/delete_device
            fi

            if [ "$HWCLOCKACCESS" != no ]; then

hwclock.shを有効化

# update-rc.d hwclock.sh enable

ついでに,ntpdateのパッケージを削除してこんな感じにした.

  1. fake_hwclock (RTCをつながなかったときのための保険)
  2. hwclock.sh
  3. ntpd

あとはfirewallを入れれば,常時起動のサーバーとして使えそうなのでもう少し試験したら1台買い増そうかな.

RTC M41T62 を Raspberry Pi につなぐ

投稿日: Leave a comment

先日秋葉原で衝動買いした,M41T62が載ったRTCボードをRaspberry piにつないでみた.

データシートを見るとレジスタの仕様がDS1307と違っていてどうしたものかと思ったが,カーネルモジュールのリストを眺めてみたらm41txxが使えそう.

% ls /lib/modules/3.10.25+/kernel/drivers/rtc
rtc-bq32k.ko   rtc-ds3232.ko    rtc-m41t80.ko   rtc-pcf8523.ko  rtc-rv3029c2.ko
rtc-ds1305.ko  rtc-ds3234.ko    rtc-m41t93.ko   rtc-pcf8563.ko  rtc-rx4581.ko
rtc-ds1307.ko  rtc-em3027.ko    rtc-m41t94.ko   rtc-pcf8583.ko  rtc-rx8025.ko
rtc-ds1374.ko  rtc-fm3130.ko    rtc-max6900.ko  rtc-r9701.ko    rtc-rx8581.ko
rtc-ds1390.ko  rtc-isl12022.ko  rtc-max6902.ko  rtc-rs5c348.ko  rtc-s35390a.ko
rtc-ds1672.ko  rtc-isl1208.ko   rtc-pcf2123.ko  rtc-rs5c372.ko  rtc-x1205.ko

データシートを見ると,M41T93とM41T94はSPIで,M41T80はI2CでM41T62と時刻レジスタの仕様はほぼ同じ.

で,rtc-m41t80.koのソースコードを見るとM41T62もサポートされているようなので,さくっと使えそう.

 72 static const struct i2c_device_id m41t80_id[] = {
 73 { "m41t62", M41T80_FEATURE_SQ | M41T80_FEATURE_SQ_ALT },
 74 { "m41t65", M41T80_FEATURE_HT | M41T80_FEATURE_WD },
 75 { "m41t80", M41T80_FEATURE_SQ },
 76 { "m41t81", M41T80_FEATURE_HT | M41T80_FEATURE_SQ},
 77 { "m41t81s", M41T80_FEATURE_HT | M41T80_FEATURE_BL | M41T80_FEATURE_SQ },
 78 { "m41t82", M41T80_FEATURE_HT | M41T80_FEATURE_BL | M41T80_FEATURE_SQ },
 79 { "m41t83", M41T80_FEATURE_HT | M41T80_FEATURE_BL | M41T80_FEATURE_SQ },
 80 { "m41st84", M41T80_FEATURE_HT | M41T80_FEATURE_BL | M41T80_FEATURE_SQ },
 81 { "m41st85", M41T80_FEATURE_HT | M41T80_FEATURE_BL | M41T80_FEATURE_SQ },
 82 { "m41st87", M41T80_FEATURE_HT | M41T80_FEATURE_BL | M41T80_FEATURE_SQ },
 83 { }
 84 };

早速やってみた.

% sudo su
# modprobe rtc-m41t80
# echo m41t62 0x68 > /sys/class/i2c-adapter/i2c-1/new_device

これでM41T62が認識されてdmesgにログが出力される.

% dmesg | tail
[ 13.109501] i2c /dev entries driver
[ 13.378915] Driver for 1-wire Dallas network protocol.
[ 21.233753] smsc95xx 1-1.1:1.0 eth0: hardware isn't capable of remote wakeup
[ 21.234343] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
[ 22.855768] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
[ 22.857117] smsc95xx 1-1.1:1.0 eth0: link up, 100Mbps, full-duplex, lpa 0xC5E1
[ 35.406699] Adding 102396k swap on /var/swap. Priority:-1 extents:1 across:102396k SSFS
[ 36.812102] rtc-m41t80 1-0068: chip found, driver version 0.05
[ 36.813680] rtc-m41t80 1-0068: rtc core: registered m41t62 as rtc0
[ 36.814748] i2c i2c-1: new_device: Instantiated device m41t62 at 0x68

時刻もしっかりとれる.

# hwclock -r; date
Tue 06 May 2014 08:11:49 AM JST -0.906676 seconds
Tue May 6 08:11:49 JST 2014

I2C温度センサー

投稿日: Leave a comment

ちょっと前にI2Cの温度センサー基板を買っておいたので,朝からちょっと工作をして Raspberry Piとつないでみた.

20131027_rpi_temp

 

I2C以外にもHDMI,Ether,USBがつながっている状態.I2Cの結線は回路図(PDF)から以下のようにした.

  • RPIのP1: 1 (3.3V) → 温度センサーのV+端子
  • RPIのP1: 3 (SDA1) → 温度センサーのSDA端子
  • RPIのP1: 5 (SCL1) → 温度センサーのSCL端子
  • RPIのP1: 9 (GND) → 温度センサーのGND端子

ちなみに使った温度センサーはここのTMP102という温度センサーチップの載った基板.マニュアルによるとADD0ピンの接続先でアドレスが変わるというので,基板のレジストをはがしてGNDとショートさせて,アドレスを0x48に設定した (C1の右下の半田の盛ったところ).また,SDAとSCLはRaspberry Pi上でプルアップされているので,この基板のプルアップ抵抗 R1,R2 (ともに1608サイズの1kΩ)は取り外した.

20131027_i2c_temp

で,Raspbianから動作確認.i2cdetectでアドレスを確認.

# i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

確かに0x48で見えている.

次に,レジスタの読み出し.

  • レジスタ0: 温度
  • レジスタ1: コンフィギュレーションレジスタ
  • レジスタ2: T_LOW
  • レジスタ3: T_HIGH

だそうなので,順に読みだしてみた.

# i2cget -y 1 0x48 0 w
0xd015
# i2cget -y 1 0x48 1 w
0xa060
# i2cget -y 1 0x48 2 w
0x004b
# i2cget -y 1 0x48 3 w
0x0050

レジスタ0の読み出し結果が0xd015になっているが,バイト0の下4ビットは0のはずなので,エンディアンが逆っぽい。0x15d0だとすると,0x15d0 = 5584, 5584/256 = 21.8125℃.ほぼ室温.

読み出しはi2cdumpでもいいみたい.

# i2cdump -y -r 0-3 1 0x48 w
     0,8  1,9  2,a  3,b  4,c  5,d  6,e  7,f
00: f015 a060 004b 0050

温度がちょっと変わったらしい.

今回はテスト用に短めの線でつないだけど,もう少し長くして情報盤 (LAN SWとTVブースターが入っている) の内部温度をモニターしようと思う.