まったく見つけることが出来ないせらくんです。
さて、現在ざうもにのサーチ中に電源を切られても、
安全に動作する方法を捜索中です。
案として、
$cardctl status
からsuspendかbusyかを受け取って調べてみる方法を考えてみました。
が、標準出力を受け取るだけなんてかっこ悪い(俺基準)ので、
cardctlのソースコードの中にもっと簡単な方法がないか探って見ます。
■ソースコード
http://pcmcia-cs.sourceforge.net/から
pcmcia-csのソースを落として展開するとcardmgrの中に入っています。
■発見
ソースを覗いていくと、ioctl(fd, DS_GET_STATUS, &status)というやり方で、
カードの情報をゲットしていることが分かりました。
ioctlはシステムコールなんでいいとして、他のパラメータが意味不明です。
ひとつづつ、調べてみます。
■fd
何をopenした結果なんでしょうか。
ソースをひたすら追っていくと
static int open_sock(int sock)
という関数の中でopenした結果を返しているみたいです。
fd = open(fn, O_RDONLY);
謎なパスを開いています。「fn」。いったいなんでしょうか。
追ってみることにします。
謎はすぐ上の行にありました。
mknod(fn, (S_IFCHR|S_IREAD|S_IWRITE), dev)
どうやらシステムコールmknodを使って、新しくデバイスを作成して開いているようですね。
どんなデバイスでしょうか?
これもすぐ上にありました。
dev_t dev = (major<<8) + sock;
ここでmajorという数字を追ってみましょう。
ソースを追うと/proc/devicesにある下の数字のようです。
$cat /proc/devices
Character devices:
<略>
253 pcmcia
254 corgi-bl
Block devices:
<略>
pcmciaの頭の頭にある253を拾っているようです。
ここで253という数字はデバイスのメジャー番号を表しているようです。
■デバイスについてあれこれ
では、少し話しが分かりにくくなってきたので、LINUXのデバイスに
ついて調べてみたいと思います。
LINUXのデバイスは二つの種類に分けることが出来ます。
それは、ブロックデバイスとキャラクタデバイスです。
ブロックデバイスは、ブロック単位で読み書きするデバイスで
例えば「1ブロック512バイトでハードディスクから読み出す」といったことが
可能なようです。ハードディスクなんかに使われるようです。
そして、キャラクタデバイスとは1バイトずつ読み書きするデバイスと
なります。キーボードとかに使われるようです。
■メジャー番号についてあれこれ
さて、続きましてメジャー番号です。
デバイスを認識する番号には、メジャー番号とマイナー番号があります。
メジャー番号はカーネルがデバイスを認識するための番号。
マイナー番号はデバイスのドライバ内で使用するための番号です。
■閑話休題(話を元に戻すと)
上記の話を統合すると、俺のZaurusはPCMCIAをキャラクタデバイスとして
メジャー番号253で認識しているようです。
さて、もう一度mknod()を見てみましょう。
dev_t dev = (major<<8) + sock;
mknod(fn, (S_IFCHR|S_IREAD|S_IWRITE), dev)
sockはSocket番号を表しているようです。
($cardctl suspend 0 とかで0)
つまり、mknodで使うdevは、上位8ビットがメジャー番号、
下位8ビットがマイナー番号を表しているようです。
そして、上記のmknod()の引数にS_IFCHRとあります。
なんかキャラクタデバイスを設定しているように見えます。
つまり、パス「fn」に読み書き可能でキャラクタ型の
メジャー番号253、マイナー番号0のデバイスファイルを作れ!
と言う事をやっているようです。
本当かな?
ためしに作ってみます。
■ソース
#include
#include
#include
#include
のようです。
さて、検証用のソースです。
#include
#include
#include
#include
#include
int main()
{
int fd;
char * fn = "/var/lib/pcmcia/testtest";
int dev = (253<<8);
if (mknod(fn, (S_IFCHR|S_IREAD|S_IWRITE), dev) == 0) {
fd = open(fn, O_RDONLY);
// unlink(fn);
if (fd >= 0) printf("fd =%d\n" ,fd);
}
return 0;
}
■コンパイル
次にコンパイルです。
$gcc pcmcia.c -o pcmcia_test
/tmp/ccPE0qKD.o: In function `main':
/tmp/ccPE0qKD.o(.text+0x3c): undefined reference to `mknod'
/tmp/ccPE0qKD.o(.text+0x3c): relocation truncated to fit: R_ARM_PC24 mknod
collect2: ld returned 1 exit status
うげー、俺の環境(dev_img1.3)ではmknodがみつからねぇ・・・。
調査、しゅーりょう。
>まじっすか。
まじです。

