安かったので思い切って買ってきたが、やはりそのままでは使えなかった。環境は RedHat Linux 7.3
webを検索すると、ここの情報がヒット。しかしもはや、ここからリンクされたサイトからはソースをダウンロード出来ない模様。 ソースツリーを確認すると、rtl8150.c は存在したが、ありがちなことに、VENDOR-ID, DEVICE-ID が設定されていないようだ。また、redhatのカーネルに取りこまれたことで、ソースがだいぶ変更されているようで、上記サイトのパッチもそのまま適用することはできない。
さらに、rtl8150.c をキーワードにweb全体を検索。色々なところにソースがあった。
ここの、rtl8150.c は、上記のものに近いようだ。しかも、すでにデバイスのリストに LUA-KTX が含まれている!! 早速これを
gcc -D__KERNEL__ -I/usr/src/linux/include -DMODULE -c -o rtl8150.o rtl8150.c
っとやって、コンパイル。あとは
んで、USBポートに LUA-KTX を差しこんで再起動すると … 起動中に "Unresolved symbol" とエラーがでるものの、通信ができるようになっており、モジュールは正常に動いているようだ。
しかし、起動時のエラーが気にくわないし、せっかくカーネルにソースが含まれているのだから、これを使えるように挑戦してみる。
まず、/usr/src/linux/drivers/usb/rtl8150.c を適当な場所にコピーして、
/* table of devices that work with this driver */ static struct usb_device_id rtl8150_table [] = { { USB_DEVICE(VENDOR_ID_REALTEK, PRODUCT_ID_RTL8150) }, { USB_DEVICE(0x0411, 0x0012) }, /* この行を追加 */ { } };
のように、LUA-KTX の ID を追加して、上記と同じように単体でコンパイルしてみた。コンパイルは通るものの、モジュールを組みこもうとするとエラー。なので、あっさりこの方法はやめにして、目茶苦茶ええかげんやなあと思いつつも
/*#define VENDOR_ID_REALTEK 0x0bda*/ /*この行と次の行をコメントアウト*/ /*#define PRODUCT_ID_RTL8150 0x8150*/ #define VENDOR_ID_REALTEK 0x0411 /*この行と次の行を追加*/ #define PRODUCT_ID_RTL8150 0x0012
のように、元々定義されているIDの部分を置き換えてごまかしたらうまく動いた。(どなたかまっとうな方法を教えてください…)。しかしながら、やはり起動中にエラーが出て気持ち悪いので、今度はソースツリーの中のファイル /usr/src/linux/drivers/usb/rtl8150.c を直接上記のように編集して、
とやって、モジュールを作成(時間かかったぁ…)。でき上がった rtl8150.o を使ったら 問題なくエラーも出さずに動くようになった。
しかし、今後 kernel のアップデートなんかがある度に毎回この作業をやるのはたまらないので、 上記コンパイル作業のログから、コンパイルオプションを確認すると
cc -D__KERNEL__ -I/usr/src/linux-2.4.18-5/include -Wall -Wstrict-prototypes \ -Wno-trigraphs -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -Wno-unused \ -pipe -mpreferred-stack-boundary=2 -march=i686 -DMODULE -DMODVERSIONS \ -include /usr/src/linux-2.4.18-5/include/linux/modversions.h -DKBUILD_BASENAME=rtl8150 \ -c -o rtl8150.o rtl8150.c
となっており、これを試すと、単体でも正常なモジュールをコンパイル出来た。
ちなみにこのデバイス、「USBハブに未対応」とあるが、今のところ ELECOM の UH-V4SWH 経由で問題無く使用できている。
redhatからカーネルのアップデート kernel-2.4.18-10 が出たので入れ替えた。さて、rtl8150も作り直さねば…でももう大丈夫だもんねっ…っと思ったら、何もせんと動いた。rtl8150.cを見てみると、
static struct usb_device_id rtl8150_table [] = { { USB_DEVICE(VENDOR_ID_REALTEK, PRODUCT_ID_RTL8150) }, { USB_DEVICE(VENDOR_ID_MELCO, PRODUCT_ID_LUAKTX) }, { } };
となっておりましたとさ。ちゃんちゃん。