困ったときのkenyaさん頼み(笑)ってことで話をしてみると、どうもyasuさんも同様の現象でお困りの模様。ただkenyaさん曰く『ほぼ同じ仕様のCF-100TXは使えているので、ドライバにパッチを当てれば使えるのではないか』と非常に頼もしいお言葉。
ということで、いつものように『ないものは作る』といきましょう。
CF-10Tで使用すべきドライバは pcnet_cs らしいので、まずはこのソースを見てみることにします。ファイル名はpcnet_cs.cです。
1755〜1756行目に、CF-100TX用の記述がありました。
PCMCIA_DEVICE_PROD_ID123("Fast Ethernet", "CF Size PC Card", "1.0",
0xb4be14e3, 0x43ac239b, 0x0877b627),
0xb4be14e3, 0x43ac239b, 0x0877b627),
で、いったいこれは何を定義しているのやら…と思いつつソースを上の方に辿っていくと、どうやら構造体を定義している模様。(1554行目)
static struct pcmcia_device_id pcnet_ids[] = {
ではこの pcmcia_device_id ってのはどんな構造体?と定義を捜索すると、mod_devicetable.h というヘッダファイルに定義されていることが分かりました。
201行目以降に以下のように定義されています。
struct pcmcia_device_id {
__u16 match_flags;
__u16 manf_id;
__u16 card_id;
__u8 func_id;
/* for real multi-function devices */
__u8 function;
/* for pseudo multi-function devices */
__u8 device_no;
__u32 prod_id_hash[4]
__attribute__((aligned(sizeof(__u32))));
/* not matched against in kernelspace*/
#ifdef __KERNEL__
const char * prod_id[4];
#else
kernel_ulong_t prod_id[4]
__attribute__((aligned(sizeof(kernel_ulong_t))));
#endif
/* not matched against */
kernel_ulong_t driver_info;
#ifdef __KERNEL__
char * cisfile;
#else
kernel_ulong_t cisfile;
#endif
};
__u16 match_flags;
__u16 manf_id;
__u16 card_id;
__u8 func_id;
/* for real multi-function devices */
__u8 function;
/* for pseudo multi-function devices */
__u8 device_no;
__u32 prod_id_hash[4]
__attribute__((aligned(sizeof(__u32))));
/* not matched against in kernelspace*/
#ifdef __KERNEL__
const char * prod_id[4];
#else
kernel_ulong_t prod_id[4]
__attribute__((aligned(sizeof(kernel_ulong_t))));
#endif
/* not matched against */
kernel_ulong_t driver_info;
#ifdef __KERNEL__
char * cisfile;
#else
kernel_ulong_t cisfile;
#endif
};
これだけ見ても全然分からないですね。(汗)
気を取り直して pcnet_cs.c を見ると、構造体の配列に値をセットするのに単なる代入ではない方法を使っています。例えばCF-100TXであれば、
PCMCIA_DEVICE_PROD_ID123("Fast Ethernet", "CF Size PC Card", "1.0",
0xb4be14e3, 0x43ac239b, 0x0877b627),
0xb4be14e3, 0x43ac239b, 0x0877b627),
とこんな感じ。この PCMCIA_DEVICE_PROD_ID123 が何をする人なのか…と調べたところ、device_id.h に以下のような定義がありました。(46行目)
#define PCMCIA_DEVICE_PROD_ID123(v1, v2, v3, vh1, vh2, vh3) { \
.match_flags = PCMCIA_DEV_ID_MATCH_PROD_ID1| \
PCMCIA_DEV_ID_MATCH_PROD_ID2| \
PCMCIA_DEV_ID_MATCH_PROD_ID3, \
.prod_id = { (v1), (v2), (v3), NULL },\
.prod_id_hash = { (vh1), (vh2), (vh3), 0 }, }
.match_flags = PCMCIA_DEV_ID_MATCH_PROD_ID1| \
PCMCIA_DEV_ID_MATCH_PROD_ID2| \
PCMCIA_DEV_ID_MATCH_PROD_ID3, \
.prod_id = { (v1), (v2), (v3), NULL },\
.prod_id_hash = { (vh1), (vh2), (vh3), 0 }, }
なるほど、引数を構造体のメンバに代入するようになってたんですね。
(こんな技初めて見たのでちょっと感動しました)
どうもこの代入式を見ると、
・プロダクトIDが3つ
・それに対応するhashが3つ
が必要らしいです。そこで pccardctl コマンドで情報を表示してみると、
# pccardctl info
PRODID_1="Ethernet"
PRODID_2="CF Size PC Card"
PRODID_3="1.0"
PRODID_4=""
MANFID=0149,c1ab
FUNCID=6
PRODID_1="Ethernet"
PRODID_2="CF Size PC Card"
PRODID_3="1.0"
PRODID_4=""
MANFID=0149,c1ab
FUNCID=6
ビンゴ!ちゃんとプロダクトIDを3つ持っています。
ではそのhashは…と考えてしばし固まってしまったのですが、そこは困ったときのkenyaさん、ちゃんと答えを見つけてきてくれました。devicetable.txt というドキュメントによると、
You can determine the hash of the product ID strings by catting the file "modalias" in the sysfs directory of the PCMCIA device. It generates a string in the following form:
pcmcia:m0149cC1ABf06pfn00fn00pa725B842DpbF1EFEE84pc0877B627pd00000000
The hex value after "pa" is the hash of product ID string 1,after "pb" for string 2 and so on.
pcmcia:m0149cC1ABf06pfn00fn00pa725B842DpbF1EFEE84pc0877B627pd00000000
The hex value after "pa" is the hash of product ID string 1,after "pb" for string 2 and so on.
とのことです。
ではザウルスで modalias はどこにあるのかと捜索したら…ありました!
# cat /sys/devices/platform/sharp-scoop/pxa2xx-pcmcia/0.0/modalias
pcmcia:m0149cC1ABf06fn00pfn00pa00B2E941pb43AC239Bpc0877B627pd00000000
pcmcia:m0149cC1ABf06fn00pfn00pa00B2E941pb43AC239Bpc0877B627pd00000000
出力された結果から、
pcmcia:m0149cC1ABf06fn00pfn00pa00B2E941pb43AC239Bpc0877B627pd00000000
ということで、きちんと3つのhashが出力されています。
あとはこれを pcnet_cs.c に追加してあげるだけです。
CF-100TXに関する記述のあとに以下の記述を追加します。
PCMCIA_DEVICE_PROD_ID123("Ethernet", "CF Size PC Card", "1.0",
0x00b2e941, 0x43ac239b, 0x0877b627),
0x00b2e941, 0x43ac239b, 0x0877b627),
そしたらいよいよコンパイル!
・・・こんばいる・・・・・・・・。
無理!(涙)
カーネルドライバのコンパイルなんて、私には完全にお手上げでした…。
困ったときのkenyaさんにお願いして、無事コンパイル終了。
作ったファイルはkenyaさんが公開されております。
pcnet_cs.ko.gz — Proto_Type001
http://comomo.shacknet.nu/files/pdaxrom/r121/pcnet_cs.ko.gz/view
ファイルをダウンロードしたら、既存の pcnet_cs と置き換えて、モジュールの依存関係を修正します。(ファイルは /tmp に置いたと仮定)
cd /lib/modules/2.6.16/kernel/drivers/net/pcmcia
mv pcnet_cs.ko pcnet_cs.ko.org
gunzip /tmp/pcnet_cs.ko.gz
mv /tmp/pcnet_cs.ko ./
depmod -a
mv pcnet_cs.ko pcnet_cs.ko.org
gunzip /tmp/pcnet_cs.ko.gz
mv /tmp/pcnet_cs.ko ./
depmod -a
これでCF-10Tを差し込めば、無事に認識してくれるはずです。
ただし、このままだとデバイスは認識してもネットワークには繋がってくれません。r121にはネットワーク関連でちょっと不具合があるので、kenyaさんが公開されている手順に従って修正してください。
pdaXrom 1.1.0r121でネットワークアダプターの設定をする — Proto_Type001
http://comomo.shacknet.nu/blog/55
ちなみにDHCPな環境であれば以下のコマンド一発でOKです。
echo "DHCP=y" > /etc/sysconfig/netconfig/eth0.conf
kenyaさん、何から何までありがとうございました!
−追記:2006/10/16−
kenyaさんのサイトがトラブルで停止してしまっているのでファイルを代理公開しておきます。 → pcnet_cs.ko.gz
あとドライバの配置先が間違っていたので訂正しました。(失礼しました)
てか、自分の名前出すぎです(笑
ホント困ったときのkenyaさんです。ありがと!!