passive log strage

バイク , モバイルガジェット , アウトドア用品 , 腕時計 ・・・等。

La Foneraで遊ぶ その4

SDカードスロットとシリアルコネクタ

SDカードスロットについては内蔵を前提にすればロック無しタイプの方がコンパクトに収まる。

もうひとつ、どうせ改造するなら、メンテナンス用にシリアルコネクタを追加したい。D-Sub9ピンだと大きいし、レベルが本来のRSー232Cと違うのに同じコネクタにしてしまうのには気分的に抵抗がある。つまりちょうど良いコンパクトなコネクタが見つからない。
ピンは3極あればいいので、最終的に2.5φのステレオヘッドホンジャックにした。『コネクタ選定に困ったらヘッドホンジャック』というのは古き良き電子工作文化の一つである(ほんとか)。

とりあえず組み込み完了。
チップコンデンサ4本を外さないと認識しないということなので、半田ゴテで半田を溶かして外すつもりが、ランドごとはがれてしまったが気にしないことにする。ぱっと見、接続用ランドへの回路が切れてしまうように見えるが、実は裏側にチップ抵抗がありちゃんと結線されているので問題ない。SDカード接続用ランドへはケーブルを直付けした。スルーホールにはすでに半田が盛ってあり6ピンをたてられる自信がなかったため。配置上、SDカードが放熱フィンに近く、熱の影響が心配だがやむおえない。

シリアルTxD・RxD・Vcc・GNDへの接続はサンハヤトの「DOS/V ピン付きリード線」を使用した。ピンコネクタの根本を折り曲げることができ、上部カバーをかぶせても干渉しない。そのかわり、ピンコネクタは金属面が露出しているので、隣のピンと短絡する可能性がある。このため伸縮チューブをかぶせて絶縁してみた。Vccのケーブルが赤から橙色に変わっているのは、赤のケーブルのピンを折り切ってしまったから(汗)。

シリアル用2.5φのステレオジャックはシリアルピンの隣のケースに穴をあけてとりつけた。この位置はもしかすると放熱フィンへのエアフローを阻害しそうな気がしないこともないのだが、ほかにちょうどいい位置がなかった。
購入したジャックの首が短く、びみょうにケースの厚さに足らなかったので、穴を大きめにして根本をねじ込むように組み付ける。

なんというか、やっつけにもほどがあるだろうよ、と我ながら思わずにいられない仕事だなぁ。

SDカードドライバの導入

ipkg install kmod-nls-cp437 kmod-nls-iso8859-1
ipkg install http://fon.testbox.dk/packages/mmc/phrozendriver/2.6.21.5/26215-4pinfon2100Driver7143.ipk
ipkg install kmod-fs-vfat kmod-fs-ext2

mmcドライバについては新しいバージョンがリリースされていたが、実績がありそうなあえて日経Linux掲載のバージョンを適用してみる。

再起動し、dmesgをチェックするも、ドライバロード後にカード情報が表示されていない、つまり認識していない。配線の不備だろうか?

日経Linux2008年12月号p34をもう一度じっくり見てみる・・・と、図5のピン結線図とピンアサインの表に食い違いがある。結線図を見ながら回路を組んだのだが、pin5とpin6が逆になっているな。

日経Linuxの公式サイト、2008年12月号の補足で確認すると、ピンアサイン表の方が正しいらしい。ちゃんと読んでいれば発見できた誤植のはずだ。もっと良く読めよ、俺。


pqi 1GBを差したとき。

mmc : MMC Driver Version 2.5 (050507) Built for Legend (john@phrozen.org)
mmc : Card Found
mmc : card in op mode
mmc : SIZE : 222, nMUL : 6, COUNT : 3831, NAME : SD   
mmc : Card Initialised
mmc : The inserted card has a capacity of 1004273664 Bytes
mmc : adding disk
 mmc: mmc1
 mmc: p1 exceeds device capacity
mmc : Card was Found

pqi 2GBを差したとき。

mmc : MMC Driver Version 2.5 (050507) Built for Legend (john@phrozen.org)
mmc : Card Found
mmc : card in op mode
mmc : SIZE : 222, nMUL : 6, COUNT : 3829, NAME : SD
mmc : Card Initialised
mmc : The inserted card has a capacity of 1003749376 Bytes
mmc : adding disk
 mmc: mmc1
 mmc: p1 exceeds device capacity
mmc : Card was Found

挿入するSDカードが1GBだろうが2GBだろうが、メディアの先頭1GBまでしか認識しない。1GBといったら、昔SL-C760でメインストレージとして使用していた程度の容量だ。ファイルサーバにするつもりはないので、今後もこれ以上必要になることはないだろう。認識されることは確認できたので、1GBを差してふたを閉めることにする。

SDカードのmount

さて、さっそくSDカードをmountしてみる。
と、そのまえに/etc/init.d/mmcの修正。これは日経Linux2008年12月号p36と同じ作業。たしかにこのデバイスノード名は分かりづらい。

日経Linux2008年12月号p36では、SDカードを「/mnt」へ直接mountしているが、これはちょっと(慣例的に)気持ち悪いので「/mnt/sd」としてmountする。

cd /mnt
mkdir sd
mount -t vfat -o sync /dev/mmc1 /mnt/sd

これで/mnt/sdがSDカードの領域となる。

root@OpenWrt:/mnt# mount
rootfs on / type rootfs (rw)
/dev/root on /rom type squashfs (ro)
none on /proc type proc (rw)
none on /sys type sysfs (rw)
none on /tmp type tmpfs (rw,nosuid,nodev)
tmpfs on /dev type tmpfs (rw)
none on /dev/pts type devpts (rw)
/dev/mtdblock2 on /jffs type jffs2 (rw)
mini_fo:/jffs on / type mini_fo (rw)
/dev/mmc1 on /mnt/sd type vfat (rw,sync,fmask=0022,dmask=0022,codepage=cp437,iocharset=iso8859-1)

root@OpenWrt:/mnt# df -h
Filesystem                Size      Used Available Use% Mounted on
none                      6.6M     24.0k      6.6M   0% /tmp
tmpfs                   512.0k         0    512.0k   0% /dev
/dev/mtdblock2            5.9M    536.0k      5.4M   9% /jffs
mini_fo:/jffs             1.0M      1.0M         0 100% /
/dev/mmc1               957.4M         0    957.4M   0% /mnt/sd

通常のLinuxであれば、/etc/fstabと/etc/mtabに設定を記述するわけだが、OpenWrtにはこの2つのファイルは存在しない。追加してもいいのだけど、ディスクを頻繁に交換するわけではないし「mount -a」が起動時に呼ばれるわけではなさそうなので、直接どこかに記述してしまってもいいだろう。今回は(面倒なので)「/etc/init.d/mmc」内に記述した。

/etc/init.d/mmc

#!/bin/sh /etc/rc.common

start() {
        if [ -f /lib/modules/mmc_drv.ko ]; \
        then \
                mv /lib/modules/mmc_drv.ko /lib/modules/`uname -r`/mmc_drv.ko; \
        fi
        mknod -m 0660 /dev/mmc b 126 0
        mknod -m 0660 /dev/mmc1 b 126 1
        mknod -m 0660 /dev/mmc2 b 126 2
        mknod -m 0660 /dev/mmc3 b 126 3
        mknod -m 0660 /dev/mmc4 b 126 4
        insmod mmc_drv

        mount -t vfat -o sync /dev/mmc1 /mnt/sd
}

stop() {

        sync;umount /mnt/sd

        rmmod mmc_drv
}

stop()セクションのumountの前にsyncをつけたのは個人的な気分の問題。mount時にsyncオプションを付けているので本来は必要ない(はず)。ちなみに電源OFFの概念がない(切るときには電源コネクタを抜くだろう、普通は)ためinittabにはランレベルshutdownが存在するが呼ばれることは無いだろう。つまりstop()セクションが実行されるのはrebootコマンド実行時ぐらいのはずだ。あんまり意味はないような気もするけど、まぁ念のため。