Linux 化した BBR-4MG に LCD ディスプレイを付けてみた。元ネタは "Connecting an LCD display to the Sweex/Edimax router" (http://sunspot.co.uk/Projects/SWEEX/files/LCD/LCDonSWEEX.html, http://www.ipb-halle.de/~ronald/ADM5120/)。写真は Thomas 版 Linux にこの GPIO(LED) ドライバ(led.c)をカーネルに組み込んでテストプログラム(lcd_out.c)を動かしているところ。
GPIO ドライバの組み込みと LCD 表示プログラム
Thomas 版の build 環境を用意したら、カーネルのソースディレクトリ以下の arch/mips/adm5120/bbr4 以下に led.c と led.h をコピーし、Makefile を修正してカーネルを make する。driver.zip (修正済ドライバ)
デバイスファイル /dev/gpio* は README の説明にしたがってメジャー番号 167、マイナー番号は 0 から 22 まで用意するが、ioctl で操作するなら gpio0 だけで良い。
i=0 while [ $i != 23 ] do mknod /dev/gpio$i c 167 $((i++)) done
GPIO ドライバを組み込むとブートログに次のような内容が表示される。
adm5120gpio: Checking GPIO pins: GPIO 0: INPUT: 0 normal GPIO 1: INPUT: 1 inverted GPIO 2: INPUT: 0 normal GPIO 3: INPUT: 1 inverted GPIO 4: INPUT: 0 normal GPIO 5: INPUT: 0 normal GPIO 6: INPUT: 0 normal GPIO 7: INPUT: 0 normal GPIO 8: LINK_ACT GPIO 9: SPEED GPIO 10: DUPLEX_COL GPIO 11: LINK_ACT GPIO 12: SPEED GPIO 13: DUPLEX_COL GPIO 14: LINK_ACT GPIO 15: SPEED GPIO 16: DUPLEX_COL GPIO 17: LINK_ACT GPIO 18: SPEED GPIO 19: DUPLEX_COL GPIO 20: LINK_ACT GPIO 21: SPEED GPIO 22: DUPLEX_COL adm5120gpio: ADM5120 GPIO driver V2.5 ready.
この内容は起動後に "cat /proc/driver/led" としても得ることができる。 各 GPIO ポートの状態は echo "コマンド" > /dev/gpio0 のようにして設定しても良いし、gpiodemo サンプルプログラムを使うこともできる。9-22 番の GPIO は LED 用でデフォルトで上記のような Ether ポートの状態出力になっているから、プログラムからは GPIO_output_0(0001)、GPIO_output_1(0011)に state を設定することで出力とする(例えば ./gpiodemo 20 3 とすれば WAN の LED が点灯する)。0-7 番とは操作方法が異なっている。
BBR-4MG では GPIO/LED は次のように使用されている。FPGA タイプで GPIO4-7 についてはピンが割り当てられていない。
| 名称:GPIO番号 | CPU ピン番号 | 接続 |
|---|---|---|
| GPIO0:0 | 148 | - |
| GPIO1:1 | 149 | - |
| GPIO2:2 | 150 | INIT SW |
| GPIO3:3 | 151 | DIAG LED |
| LED0-0:8 | 166 | port 4 LED (link/activity) |
| LED0-1:9 | 165 | port 4 LED (speed) |
| LED0-2:10 | 164 | - |
| LED1-0:11 | 163 | port 3 LED (link/activity) |
| LED1-1:12 | 162 | port 3 LED (speed) |
| LED1-2:13 | 161 | - |
| LED2-0:14 | 160 | port 2 LED (link/activity) |
| LED2-1:15 | 158 | port 2 LED (speed) |
| LED2-2:16 | 147 | - |
| LED3-0:17 | 146 | port 1 LED (link/activity) |
| LED3-1:18 | 145 | port 1 LED (speed) |
| LED3-2:19 | 144 | - |
| LED4-0:20 | 143 | WAN LED (link/activity) |
| LED4-1:21 | 142 | WAN LED (speed) |
| LED4-2:22 | 141 | - |
各ポートのステータス LED は link/activity が ON の場合にのみ点灯し、speed が 100Mbps で緑、10Mbps で橙となっている。
GPIO0-2と各LEDの2番は未使用と思われるので、これらを使えばBBR-4MGのLED 表示をそのままにできるが、オリジナルのままLED1-4の1番をLCDのデータに、LED0の1,2番をRSとENに割り当てている。配線の引き出しは「玄箱でNetBSDを動かす」のかわうちさんのページ(http://www5.atwiki.jp/kuro-bsd/pages/237.html)にある解析情報の位置から取ったが、論理が反転していたため、プログラム内で対応している。(LCD 表示プログラム )。使用した GPIO ポートを元の状態に戻すオプションも用意してみた。文字列を表示させた後で設定を戻しておけば、LED は通常通りに Ether ポート状態表示になる。LCD モジュールは秋月電子で販売されている超小型LCDキャラクタディスプレイモジュール SD1602HUOB を3.3Vで使っている。バックライトは点けていないが、こちらは定格4.5V?であるから、ACアダプタ入力の5.xVから適当な抵抗を挟んで供給する。
Please press Enter to activate this console. BusyBox v1.2.1 (2009.07.21-02:09+0000) Built-in shell (ash) Enter 'help' for a list of built-in commands. / $ cd root ~ $ ./lcd_out -i ~ $ ./lcd_out "Hello, World!" ~ $ ./lcd_out -2 ~ $ ./lcd_out "Linux on BBR-4MG" ~ $ cat /proc/driver/led 0: INPUT: 0 normal 1: INPUT: 1 inverted 2: INPUT: 0 normal 3: INPUT: 1 inverted 4: INPUT: 0 normal 5: INPUT: 0 normal 6: INPUT: 0 normal 7: INPUT: 0 normal 8: LINK_ACT 9: OUTPUT_1 normal 10: DUPLEX_COL 11: LINK_ACT 12: OUTPUT_1 normal 13: DUPLEX_COL 14: LINK_ACT 15: OUTPUT_1 normal 16: DUPLEX_COL 17: LINK_ACT 18: OUTPUT_0 normal 19: DUPLEX_COL 20: OUTPUT_1 normal 21: OUTPUT_1 normal 22: DUPLEX_COL ~ $ ./lcd_out -r ~ $ cat /proc/driver/led 0: INPUT: 0 normal 1: INPUT: 1 inverted 2: INPUT: 0 normal 3: INPUT: 1 inverted 4: INPUT: 0 normal 5: INPUT: 0 normal 6: INPUT: 0 normal 7: INPUT: 0 normal 8: LINK_ACT 9: SPEED 10: DUPLEX_COL 11: LINK_ACT 12: SPEED 13: DUPLEX_COL 14: LINK_ACT 15: SPEED 16: DUPLEX_COL 17: LINK_ACT 18: SPEED 19: DUPLEX_COL 20: LINK_ACT 21: SPEED 22: DUPLEX_COL ~ $
GPIO の2番は INIT スイッチにつながっているため、スイッチを押すと状態が変わる。後は Web インターフェースで操作するなりご随意に。ネタ切れにつきアイディア募集中。
Posted by masato at 10:01 PMBBR-4MG面白そうですね。つられてオークションで入手しちゃいました。何かセンサーをつなげられると面白いと思いました。
まずUSBポートの増設を試す予定です。
もあさん、コメントありがとうございます。BBR-4MGは中古で数百円で転がっていたりするので何台にもなってしまいました。
NetBSD での動作がうまく行っていないので、Linux にしてしまいました。GPIOをビット毎の操作でI2Cに仕立てて各種センサをつなぐ例がありました。BBR-4MGはフラッシュメモリが少ないのでUSB拡張をしておくと便利ですが、とりあえずは開発NFSルートでもOK。びんずめ堂版LinuxはUSBなしで動きます。結構ギリギリで厳しいですけれど、GPIO/LEDドライバが組み込みまれてますから、操作プログラムをRAMディスクに載せるだけで動くかもしれません。上で紹介したものはドライバのバージョンが違っています。
Posted by: masato at 08/01, 2009 10:10 PM私も少しずつ調べ始めました。知りませんでしたが、数年前から続いている、結構歴史のある(?)ハックなのですね。
私は、単独で、センシング結果をサーバにアップロードするような装置が作りたいと思っています。
サーバと行ってもtwitterなので、httpが話せればオーケーです。APは自分でCで書いても良いのですが、perlとかが動けばそのほうが簡単です。
このあいだ出たLa Fonera 2.0ならそのまま無線LANで使える装置ができそうですね。
LaFonera のほうがメモリをたくさん積んでいるので楽ですし、DD-WRT や OpenWrt で先人のハックも数多くあります。日経 Linux 誌でも連載されていますね。
どちらにしても Perl は厳しいと思います。IO-DATA の USL-5P や USB 付きの NAS 箱くらいのスペックが欲しいところです。
情報ありがとうございます。まずはシリアルコンソールあたりから開始します。8MBのメモリは使いでがありそうな、なさそうな。でもH8でLinuxを動かすのに比べれば楽そうです。
夏休みの課題かな。夏休みないけど。。。
シリアルコンソールとU-Bootまで出来ました。 Linuxのブートまで後一息です。USBの増設用に48MHzのOSCも買って来ました。
BBR-4MG ハック仲間が増えて嬉しいです。USB 無しでもカーネル起動までは確認できますよ。NFSルートにする手もありますし。
Posted by: masato at 08/10, 2009 11:00 AMmacosxのtftpを起動して、thomas版のkernelをフラッシュにいれました。kernelを起動してルートファイルシステムのマウント失敗で止まるところまで確認できました。
今度はnfs-rootのためのnfsサーバの立ち上げです。いきなりUSB増設でも良いのですけど、手順を踏みたいと思います。
CPUが結構熱くなりますね。小さな放熱版が欲しいかもです。
また進んだら報告します。
Posted by: もあ at 08/11, 2009 01:03 AM昨晩、USBを増設して正常なブートまで確認できました。
アドバイスありがとうございます。
#ハードの方が早そうだったので、NFS rootはパスしました。
http://web.mac.com/kuwatay/morecat_lab./Blog/%E3%82%A8%E3%83%B3%E3%83%88%E3%83%AA%E3%83%BC/2009/8/13_Linux_on_BBR-4MG.html
ただし、なぜかeth0のリンクが上がらなくなってしまいました。調査中です。
Posted by: もあ at 08/13, 2009 07:24 PMもあさん、さすがに仕事が早いです。
eth0 の件は謎ですね。他のポートはどうでしょう。
eth0はリンクアップしていて、単にIPアドレスの設定を忘れていただけでした。手動でifconfigしたら動きました。(失礼しました。)
カーネルのコンパイルはやはりdebianが良いのでしょうか?手元にはdebianのマシンがありません。
当初 debian (serge) を開発に使いましたが、今は ubuntu にしています。
Windows に vmware でもいいのですが、速い機械が無い代わりに古い機械がゴロゴロしているので、そういったものを使ってます。
NetBSD や FreeBSD の Linux 互換モードでも出来ないことはありませんよ。びんずめ堂さんは FreeBSD 上で作業していたようです。
ftp サイトが移動していたりするため、build の際にいくつかエラーが出ると思いますが、その辺りは適当に対処してください。
Posted by: masato at 08/13, 2009 11:46 PM情報、ありがとうございます。このあいだ別の用途に用意したubuntu(の仮想マシン)を使うことにします。ちなみにこちらはLeopaed上のVMware fusionです。
何かのセンサを付けるのに、2番目のシリアルが欲しいのですけど、これはCPUから直だししかないようですかね。別の方法としてはUSBのもう一方にPepperでも付けることも考えています。
いずれにしても、開発環境を用意してカーネルを作り直さないとダメですね。。
いっそ、たくさん並んでるGPIOのLEDを全部捨てて、外付けでA/Dを付ける、とか。
こんにちは。
私も最近BBR-4MG/HGを手に入れました。
秋葉原じゃないので数百円では手に入りませんでしたが、1000円位でハードオフでGetして、今では4台所有しています。
私が目指しているのは、ローカルネットワーク内での高性能ルータ化です。
BBR-4MG/HGに搭載されているADM5120Pって
VLAN設定できるし、L2レベルの帯域制御機能まであるよう?です。
これにIPv6とIEEE802.1Q でのTAG-VLAN、iptableによるNAT機能を持たせることを目標としてます。
いろいろ情報交換できればありがたいです。
Posted by: TTT at 09/29, 2009 08:50 PMTTT さん、メッセージありがとうございます。気合が入ってますね。
ワタシはルータとしてよりもネットワーク機能付デバイスとして IO デバイスを操作したいという方向ですが、いろいろなアイディアがあると楽しいです。
びんずめ堂さん方式の場合、カーネルサイズの制限からこれ以上の機能拡張はローダブルモジュールにする必要があるかと思います。Thomas さん方式で U-Boot + USB ストレージ拡張をおこなえばカーネルサイズも大きくできます(512K→960K)。
早速のレス、恐れ入ります。
VMWare上にdebian 3.1 入れて BR-6140とthomasさんtool-chain が出来てます。
目下のところ、びんずめ堂さん方式で何とかやれないか、悪戦苦闘中です。
VLANは びんずめ堂さんkernel 2.4.18をswdrv.cのソースを直接書き換える方式で対応できていますが、VLANを動的に操作できるadmconfig というツールがあり、 これを使うため、びんずめ堂さんとthomasuさんそれぞれのソースをカット&ペーストで 、AMiLDA の kernel 2.4.35.3 のソースに貼り付けつつ、修正入れているところです。
Kernel 2.4.35.3 は XMODEMを使ったメモリからのkernel起動は出来ていて、
flash上のramdisk.bz2 を展開したところで、 No init found で Kernel panicしてます。
ユーザランド側のbusyboxの設定が悪いのか、移植した flashからの展開ルーチンが悪いのか切り分け中です。
USB改造も考えているのですが、3.3V 48MHz オシレータの入手が難しいですね。
masatoさんももあさんも サンエレクトロで購入されたのでしょうか?
びんずめ堂版はファームウェアに最小限のRAMDISKディスクイメージを含んでいますから、/dev/mtd5 に ramdisk.bz2 がなくとも起動は出来ます。ただし、それが壊れていると調子が悪いようです。
Thomas 版は U-Boot でネットワークブートができるため、カーネルをいじってのテストは楽です。NFS ルートにしておけばとりあえずは USB 増設をしなくともいいですし。
発信器はサンエレクトロから通販で購入しましたが、他のものと併せて digikey などからでも良いでしょう。
ご希望の方には wiki のアカウントも用意しますのでご連絡ください。wiki の内容はちょっと古くなっていて、訂正なども滞っています。
Posted by: masato at 09/30, 2009 11:29 AMmasatoさん
TTTです。
ご連絡遅くなりました。
びんずめ堂版は確かに/dev/mtd5のイメージに不具合があると手も足も出なくなりますね。
私は復旧用に/dev/mtd3の簡易rootfsを優先的に読む mtd5 復旧用カーネルを作って、
それをXMODEM経由で起動して対応してました。
私の目論見としてはできればUSB増設をしないで高機能ルータを実現したいと思っています。
(何台かは改造すると思いますが)
ただflash容量が足りないので、標準bootloaderの代わりにthomasさんの移植したu-bootを先頭128kbのflash 0 の領域に入れられれば、残りをinitrd付きkernel領域にできるのではないかと考えました。
ただ、試すためにはJTAGでbootloaderを復旧できる環境がどうしても必要になります。
この1週間の情報収集と試行の結果、urJTAGを使ったbootloader復旧に目処がつきました。
それなりに有益な情報と思えますので、公開のため、wikiのアカウントを頂戴できませんでしょうか?
連絡用にメアドのご連絡が必要でしょうか?
よろしくお願いいたします。
BBR-4MG はやはりフラッシュの容量が少ないのが厳しいです。開発時は u-boot でも NFS root でも効率の良い手段でおこなって、最終的な形に持っていければ楽だと思いますが、やはり JTAG が利用できれば便利ですね。
Wiki のアカウントを御希望でしたら、お名前等を添えてmasato at bird.email.ne.jp までメールで連絡下さい。
Posted by: masato at 10/08, 2009 09:12 AMmasatoさん
urJTAGを使ったBBR-4MG/HGのflashバックアップ/復旧方法をwikiの方に記載させていただきましたm(__)m
http://bird.dip.jp/fswiki/wiki.cgi?page=Linux%2FBBR%2D4HG#jtag-rescue
発表の場を設けていただき、ありがとうございました。
Posted by: TTT at 10/13, 2009 10:58 PMおそらく携帯電話等からは投稿できません。日本語文字列を含まないコメントやトラックバック、および当サイトへの言及を含まないトラックバックは御遠慮いただいております。また、90日以上経過した記事へのコメントはできません。