2015年4月25日土曜日

Debian Wheezy の rt2800usb ドライバを再ビルド

バッファロー WLP-UC-AG300 やアイ・オー・データ WN-AG300U で使用する無線LAN用ドライバの rt2800usb を修正して、再ビルドすることによって、正式に rt2800usb ドライバに対応させることとしました。

rt2800usb へデバイス ID の追加となった WLP-UC-AG300(下)と WN-AG300U(上)です。

デバイス ID の簡易登録の限界

以前は、簡易にデバイス ID を rt2800usb ドライバへ登録することによって対応させていました。以下の記事を参照してください。
Buffalo WLP-UC-AG300 を入手しました
http://near-unix.blogspot.jp/2015/03/buffalo-wlp-uc-ag300.html
I-O DATA WN-AG300U を入手しました
http://near-unix.blogspot.jp/2015/04/i-o-data-wn-ag300u.html

しかしこの方法では、これから増え続けるであろう無線LANアダプタに対応することが難しくなっています。現在、上記の二種類の無線LANアダプタを簡易登録していますが、個人的にはこれが限界のように感じています。

rt2800usb ドライバの再ビルド

そこでカーネルのソースコードの中の当該ドライバのソースコードを編集して、デバイス ID を追加して対応させることとしました。以下は作業を行ったときの記録です。

ソースコード(linux-source-3.2)のダウンロード

"aptitude search source" とコマンドを実行すると、ダウンロード可能な各種のソースコードが表示されます。その中から "linux-source-****" を探し出します。backports の設定をしていなければ、現在使用中のカーネルと同じバージョンのものだけが表示されるはずです。Debian Wheezy の場合には linux-kernel 3.2 を使用しているので、linux-source-3.2 をダウンロードしてくることとなります。
# aptitude install linux-source-3.2

/usr/src のディレクトリへソースコードの圧縮ファイルがダウンロードされているはずです。これを解凍します。
# cd /usr/src
# tar jxvf linux-source-3.2.tar.bz2

ちょっと順番が前後しますが、ビルドに必要なツール類をダウンロードしておきます。
# aptitude install build-essential
# aptitude install linux-headers-3.2.0-4-686-pae
build-essential をインストールしようとすると、関連したパッケージ類も一緒にインストールされます。結構大量です。

rt2800usb ドライバの編集

rt2800usb ドライバのソースコードが存在するディレクトリへ移動したあと、デバイス ID の追加編集を行います。

# cd /usr/src/linux-source-3.2/drivers/net/wireless/rt2x00
# vi rt2800usb.c


この rt2800usb.c の中を観察してみると、WLP-UC-AG300 の "0411:0150" や WN-AG300U の "04bb:094b" のデバイス ID が登録されていました。しかし登録されている項目が "CONFIG_RT2800USB_UNKNOWN" という項目で、ドライバが非対応の扱いとなっていました。

今回、この "CONFIG_RT2800USB_UNKNOWN" の中に登録されている WLP-UC-AG300 と WN-AG300U のデバイス ID を所定のデバイス ID テーブルの部分へ移動させる編修を行いました。

rt2800usb.c の中では、具体的には WLP-UC-AG300 が "{ USB_DEVICE(0x0411, 0x0150) }," として、そして WN-AG300U が "{ USB_DEVICE(0x04bb, 0x094b) }," として登録されています。注意点として行末の ", (カンマ)" も含まれていますので注意してください。

この二つのデバイス ID を "CONFIG_RT2800USB_UNKNOWN" の項目から削除するか、コメントアウトします。
コメントアウトの事例
/* { USB_DEVICE(0x0411, 0x0150) }, */
/* { USB_DEVICE(0x04bb, 0x094b) }, */
そしてデバイス ID テーブルの部分へ追加します。以下の部分がデバイス ID テーブルのはじまり部分です。Debian Wheezy 版の rt2800usb.c の場合、 883 行目からとなります。
/*
 * rt2800usb module information.
 */
static struct usb_device_id rt2800usb_device_table[] = {
この中から /* Buffalo */ と /* I-O DATA */ の項目の中へ、先ほど削除したデバイス  ID を追加しておきます。
/* Buffalo */
{ USB_DEVICE(0x0411, 0x00e8) },
{ USB_DEVICE(0x0411, 0x0158) },
{ USB_DEVICE(0x0411, 0x015d) },
{ USB_DEVICE(0x0411, 0x016f) },
{ USB_DEVICE(0x0411, 0x01a2) },
{ USB_DEVICE(0x0411, 0x01ee) },
{ USB_DEVICE(0x0411, 0x0150) },

/* I-O DATA */
{ USB_DEVICE(0x04bb, 0x0945) },
{ USB_DEVICE(0x04bb, 0x0947) },
{ USB_DEVICE(0x04bb, 0x0948) },
{ USB_DEVICE(0x04bb, 0x094b) },

編集した rt2800usb.c を保存したあと、再ビルドを行います。

rt2800usb.c の再ビルド

正確には rt2800usb.c を含めた rt2x00 ドライバ全体の再ビルドとなります。以下の手順となります。再ビルドの作業は、rt2800usb.c が存在しているディレクトリで行います。

作業ディレクトリへの移動。上記の作業ですでに移動済みのはずです。
# cd /usr/src/linux-source-3.2/drivers/net/wireless/rt2x00
ドライバのビルドを行います。
# make -C /lib/modules/$(uname -r)/build M=$(pwd)
出来上がったドライバの rt2800usb.ko をカーネルの所定のディレクトリへコピーします。インストール作業となります。
# cp rt2800usb.ko /lib/modules/3.2.0-4-686-pae/kernel/drivers/net/wireless/rt2x00/rt2800usb.ko
カーネルモジュールの依存関係の解決
# depmod -a

以上で再ビルドとインストールが終了しました。WLP-UC-AG300 や WN-AG300U を USB ポートへ装着して動作確認をしてください。なお、簡易なデバイス ID 登録を行なっている場合には、そのすべてを削除しておいてください。

動作確認の注意点

rt2x00 のドライバは一般的に不安定なことが多く、装着時は問題ありませんが、脱着時にはフリーズする可能性があります。普通は一度取り付けた無線 LAN アダプタ類は、パソコンの電源を切るまで外すことは稀ですが、今回のように動作確認のときには、無線 LAN アダプタを脱着する前に関連するドライバ(rt2800usb)を以下のように解除しておくことを強くお奨めします。
# modprobe -r rt2800usb
rt2800usb へデバイス ID の追加となった WLP-UC-AG300(左上)と WN-AG300U(右下)です。

ダウンロード

次の URL から今回再ビルドした rt2800usb.ko ドライバをダウンロードすることができます。Debian Wheezy で使用可能なはずです。自己責任でどうぞ!

rt2800usb.ko ドライバ・モジュール
https://drive.google.com/file/d/0B5QdaY5lu2e3dy1SY3NOaXpvOVE/view?usp=sharing

rt2800usb.c 編集済みソースコード
https://drive.google.com/file/d/0B5QdaY5lu2e3WlVaYlR6ajF6cVU/view?usp=sharing

参考ウェブサイト

miyou55maneのブログ
無線LAN - ソースからドライバーをビルドする
http://ameblo.jp/miyou55mane/entry-11971452202.html

カーネル・アップデート時

カーネルがアップデート(バージョンが変更となるアップグレードではない) したときには、コピーによってインストールしたドライバ・モジュールが上書きされて元の状態に戻ってしまいます。そこで再度ドライバ・モジュールをコピーによってインストールをしてください。
# cd /usr/src/linux-source-3.2/drivers/net/wireless/rt2x00
# cp rt2800usb.ko /lib/modules/3.2.0-4-686-pae/kernel/drivers/net/wireless/rt2x00/rt2800usb.ko
# depmod -a

注記:2016-01-04 ツールのインストール部分の一部間違えを修正しました。

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。