2007年12月21日金曜日

NetBSDでGPIOを使う(for ALIX) (2)

今回はベースとなるファイルがあるので気を楽にして取り組むことにする。とりあえず手元に用意するものは、

  • OpenBSDのglxpcib.c
  • NetBSD-currentのhead tree
  • OpenBSDのsys source tree
  • AMD CS5536のデータシート
  • 実機(ALIX)
だけ。NetBSD-currentのhead tree、おもむろにopenbsdのglxpcib.cをNetBSDのソースツリーのsrc/sys/arch/i386/pciの下にコピーする。このあたりに新しいファイルを追加したときには、src/sys/arch/i386/conf/files.i386にエントリーを追加する。これをしないとconfigしたときに認識してくれないし依存関係を記述することができない。とりあえず今回は


# AMD Geode CS5536 PCI-ISA bridge
device glxpcib: isabus, sysmon_wdog, gpiobus
attach glxpcib at pci
file arch/i386/pci/glxpcib.c glxpcib

と追加。デバイス名はopenbsdと同じglxpcib。sysmon_wdog, gpiobusは後で説明するけれど、NetBSDのwatchdogおよびgpio busの共通部分のフレームワークを使うことを意味している。glxpcibはpciバス上にアタッチされて、ドライバの実体はglxpcib.cである、という意味になる。

これで、kernelのconfigurationファイルにglxpcibという名前が出てきてもconfigコマンドが処理できるようになる。configファイルには、


glxpcib* at pci? dev ? function ? # AMD CS5536 PCI-ISA bridge w/ GPIO and WDT support
gpio* at glxpcib?
isa0 at glxpcib?


を追加。pciバス上にglxpcibを生成して、その上にisaバスとgpioバスを生やす、という意味になる。
今回はALIXというconfigファイルをつくってそれで作業することにする。
で、おもむろにsrc/sys/arch/i386/confの下でconfig ALIX; cd ../compile/ALIX; make depend; makeなどと打ち込むとエラーメッセージがばりばりと出てくるので(あたりまえ)、それを見ながら今後の方針を考えて作業をする、というのが移植作業の一般的な進み方(だとおもう)。

というわけで、glxpcib.cをどうやって調理するかは続きで。

NetBSDでGPIOを使う(for ALIX) (1)

PC EnginesのALIXを使いこなすためにNetBSD kernelを触っている。ALIXのハードウェア的には実装されているけれどNetBSD-current (4.99.42: 2007/12/20)ではまだ扱えない機能がいくつかあってとりあえずそいつらを見えるようにしよう、とこの2日間ほど作業をしてみた。

まだ扱えない機能でサポートしたいなあ、と強く思ったのは、とりあえず
  • GPIO
  • Watchdog timer
  • I2C bus
の3つだ。カーネルからGPIOが使えたら外付けの回路を触る場合に大変便利だし、watchdogタイマーは組込用途のシステムでは便利だ。I2Cは普通のI2Cセンサーをつなげたり、PSOCなどのマイコンと協調して動くシステムを作る際にきっと役に立つだろう。

カーネルを触るときにはまず先人達の知恵を検索してみるところから始まる。OpenBSDのグループはAMD Geode/LXシリーズに愛があるので、とりあえずその辺で動いているものが無いかと探してみると案の定src/sys/arch/i386/glxpcib.cというファイルがあるのを発見した。中身をざっとみると、ALIXで使われているAMD CS5536のPCI-ISA host bridgeのドライバで、GPIOとWatchdog timerをサポートするコードがはいっている。OpenBSDとNetBSDは比較的カーネルのコンパチビリティが高い(部分が多い)ので、とりあえずこのコードをベースに作業を進めることにした。I2Cはそれらが動いてからでいいだろう。

具体的な作業は次のエントリーで。


2007年12月20日木曜日

ALIX3C.2 (PC Engines)

PC EnginesのALIX3C.2YTWから買ってみた。これは、AMDのLX800+CS5536が乗った160mm*100mmくらいのワンボードPCで、拡張性が高い(MiniPCI*2, USB2.0*2)割に大変お安い(18000円くらい)というお得なボードだ。

最近LX800ベースの機材をつかっていたので、試しに買ってみたのだがなかなかいい感じにうごくので気に入っている。単にOSを入れるだけなら一瞬で動くし、ハードウェア素材として使おうとしてもCS5536などの資料は完璧なものがWebで入手できるので扱い易い。今はNetBSD-current(4.99.42)のカーネルを拡張して遊んでいる。
1チップマイコンも便利だけど、たとえばネットワークスタックを動かそうとすると大変すぎるのでこのくらいのボードも使えるようになっていると便利。

PSoC SMP(Switch Mode Pomp)


電源電圧を自分で昇圧してくれるSMPの実験をしてみました。
ところでこれって、MCUの機能なのに MCUのための電源作れるって面白い回路だな。

あまりにも簡単なサンプルそのままの回路で動いたので回路図は無しですが、一瞬はまったところが1箇所だけ。
VCCをSMP経由で与えるので引き回さないんですが、書き込み器はもちろん普通にMiniProgの電源を与えないといけないので、その配線がなくて、なんで書き込めないんだ!と3分ほどはまりました。配線は極力短くとか言われてましたが、思ったよりも動くもんですね。

2007年12月12日水曜日

キャラクタ型液晶モジュールの電源配線


秋月などで売られているキャラクタ型液晶モジュールの電源は、なぜか1番、2番でVccとGNDが逆になっているタイプがあります。完成品つくる場合には採用する液晶モジュールによって電源を配置すればいいんですが、実験用の汎用基板だと両方に対応させられたら便利だよなーと思って、どうすればいいか考えてたんですがこれがたぶん一番簡単な方法じゃないかと思います。ピンヘッダ2x3とジャンパを2つ使って組み替えられるようにしました。いつもの手書きの配線図です。クロスしている部分はラップ線などでクロスにジャンプさせておきます。
縦と横でVCC/GNDのピンを入れ替えられます。変則的にジャンパを入れるとショートするので注意しましょう。できあがりはこんな感じになりました。それぞれ、縦・横に使うことで、2種類の液晶を使い分けられます。

2007年12月11日火曜日

USB加速度レコーダ(1)


まずは回路図です。今回使ったのはstrawberry-linuxのUSB PSOCモジュールです。チップは24794でUSBのFull-speedに対応しています。
簡単にUSBでシリアルやHIDが作れるこころが特徴です。
加速度センサーは秋月電子の KMX52を使った8pinの3軸加速度センサーモジュールです。たぶん簡単に素人が手にはいる3軸加速度センサーとしては最安値だと思います。
あとは、加速度とは関係ないのですがいつもの温度センサーLM35DZも準備します。

Port0にはアナログ入力の切り替えスイッチがつながっているので、こちらにセンサーを配置します。0,1,2でz,y,x 軸を配置しました。これは 加速度センサーモジュールのピン配置を考えて、ジャンプしない配線を実現するためにZ,Y,Xの順番になっています。
さらに、Port0-3に温度センサをつなぎます。

センサーとしては以上なのですが、動作状況がわかりにくかったのでPort2-7にLEDを配置して、インジケータとして利用します。

電源は、USB-PSoCのモジュールから取り出せますのでそちらを使います。
あとはデカップリング用コンデンサなどは適時配置するとよいでしょう。
最近のお気に入りは 2012サイズのチップコンデンサで、これを裏のランド面にランド間をまたぐように
貼り付けています。
http://akizukidenshi.com/catalog/items2.php?q=%22P-00355%22&s=popularity&p=1&r=&page=

以上でハードウェアの準備が終了です。

追記: 回路図が貼れてなかったので追加しました orz...

2007年12月8日土曜日

マルチチャンネルレコーダー


3軸加速度センサと温度センサからのデータを収集するために、USB PSoCを使ってシリアルからデータが流れてくるシステムを作ってみました。

とくに変わった所はないのですが、サンプリングレートを向上させるためにインクリメンタル型ではなく、sigma-delta 型のADコンバータを使っています。
1ポイント4回サンプリングで4chのデータを 32Hzの割り込みで取り出しています。サンプルレートだけなら、128Hzあたりはとれてもおかしくないんですけど、アナログスイッチの切り替えやシリアル通信があるからなのかできても64Hzでそれ以上はちょっと無理な感じですね。

今日は気力がないので完成品の写真だけですが、また元気なときにプロジェクトともどもアップしていきます。