2006年10月11日

pdaXrom 1.1.0r121:Planex CF-10Tを使えるようにする

r121を導入したら、今まで使っていたCF型LANカードであるPlanexCF-10Tが使えなくなってしまいました。USBケーブルを使ったネットワーク接続もWindows側で必要なドライバが変わってしまったらしく使えません。非常に困った事態。

困ったときの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),

で、いったいこれは何を定義しているのやら…と思いつつソースを上の方に辿っていくと、どうやら構造体を定義している模様。(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
};

これだけ見ても全然分からないですね。(汗)

気を取り直して pcnet_cs.c を見ると、構造体の配列に値をセットするのに単なる代入ではない方法を使っています。例えばCF-100TXであれば、
PCMCIA_DEVICE_PROD_ID123("Fast Ethernet", "CF Size PC Card", "1.0",
        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 }, }

なるほど、引数を構造体のメンバに代入するようになってたんですね。
(こんな技初めて見たのでちょっと感動しました)

どうもこの代入式を見ると、

・プロダクト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

ビンゴ!ちゃんとプロダクト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.

とのことです。
ではザウルスで modalias はどこにあるのかと捜索したら…ありました!
# cat /sys/devices/platform/sharp-scoop/pxa2xx-pcmcia/0.0/modalias
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),

そしたらいよいよコンパイル!

・・・こんばいる・・・・・・・・。

無理!(涙)

カーネルドライバのコンパイルなんて、私には完全にお手上げでした…。
困ったときの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

これで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

あとドライバの配置先が間違っていたので訂正しました。(失礼しました)
posted by 月水和尚 (とも) at 19:27 | Comment(2) | TrackBack(0) | りなざう
この記事へのコメント
まとめおつかれさまでした!
てか、自分の名前出すぎです(笑
Posted by kenya at 2006年10月12日 18:18
実際おいら何にもしてないし。(笑)
ホント困ったときのkenyaさんです。ありがと!!
Posted by tomo at 2006年10月12日 20:41
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。