ART-Linux/Ubuntu 10.04 へのドライバのインストール

Index > 趣味 > Computer > ART-Linux

はじめに

Ubuntu 10.04 に ART-Linux 2.6 カーネルパッケージをインストールして使っ ていますが,インタフェース社のインタフェースボードのドライバの再コンパ イルとインストールの手順の記録をまとめました.

ART-Linux のインストール

産業技術総合研究所の ART-Linux のページから,linux-imagelinux-headerslinux-sourceの全てのパッケージをダウンロード し,インストールします.カーネルのソースはアーカイブがインストールされるだけなので, /usr/src/linux-source-2.6.32-art.tar.bz2 を手動で展開します.

インタフェース社のドライバをインストール

使用するインタフェースボードの Linux 用のドライバをダウンロードし,手 順に従ってインストールを行います./usr/src/interfaceの下に common とドライバ固有のディレクトリが作成されます. ここでは gpg3100 という AD コンバータのドライ バを例にします.

ART-Linux の開発環境の修正

インタフェース社から提供されているドライバのバイナリはカーネルのバージョ ンチェックで弾かれるため,ソースコードから再コンパイルする必要があるの ですが,ART-Linux のインストール直後の状態では,コンパイルが通らないた め,次のように修正を行います.

$ cd /lib/modules/2.6.32-art
$ sudo ln -s /usr/src/linux-headers-2.6.32-art build
$ cd build/include
$ sudo mv asm asm.dist
$ sudo ln -s /usr/src/linux-source-2.6.32-art/arch/x86/include/asm asm

インタフェース社のドライバの再コンパイル

先程の修正で,ドライバの再コンパイルが可能になるはずですが,次のように確認します.

$ cd /usr/src/interface/common/dpg0100/src
$ sudo make

コンパイルに成功することを確認したら、次に Makefile を修正します.配布された Makefile も後で参照する場合がありますので,別名で残 しておきます.新しいファイルは各ソースディレクトリにコピーしてください. Makefile の詳細は/usr/src/linux-source-2.6.32-art/Documentation/kbuild/kbuild.txt を参照してください.

$ sudo mv Makefile Makefile.dist
$ sudo mv Makefile.dpg0100 Makefile
$ sudo make
$ sudo make install

AD ドライバをコンパイルする際には dpg0100 で 提供されている関数の情報が必要になるので,Module.symvers をコピーして来ておく必要があります.

$ cd /usr/src/interface/gpg3100/i386/linux/drivers/src
$ sudo mv Makefile Makefile.dist
$ sudo mv Makefile.gpg3100 Makefile
$ cp /usr/src/interface/common/dpg0100/src/Module.symvers .
$ sudo make
$ sudo make install

モジュールの読み込みのための設定

インストールされたモジュールは /lib/modules/2.6.32-art/extraに保存されますが,既に インストールされていたバイナリと置き換える作業が必要になります.

$ cd /lib/modules/2.6.32-art
$ sudo rm -rf misc
$ sudo depmod -A

depmod -A でうまく行かない場合には,全モジュール のチェックを行ってください.

$ sudo depmod -a

モジュールの確認

$ sudo modprobe cp3100
$ lsmod 

cp3100 と dpg0100 がロードされていれば成功です.

その他

インタフェースボードの設定を行うためには dpg0101 の再コンパイルとインストールが必要ですが, これ用の Makefile の作成やインストール作業は, 上記の例を参考にしてもらえれば簡単に行えると思います.

インターフェースボードを認識するには root 権限でプログラムを実行する必 要があります.setup.sh の実行(あるいは /usr/bin/dpg0101 を手動で実行す る場合)も sudo の元で行います。

Kernel 3.x への適用

上記の手順は Ubuntu 12.04LTS の kernel 3.2 までは,ほぼ問題なく適用でき るようです.

正確な境目は分かりませんが,Ubuntu 14.04LTS で採用されている kernel 3.13.x 以降で は interruptible_sleep_on_timeout() という関数 が無くなってしまっているため,配布されている C のソースコード自体にも手 を加える必要が出てきました.

interruptible_sleep_on_timeout() の替りに wait_event_interruptible_timeout() を呼び出す ための関数を,ドライバのエントリーの為のソース (*_entry.c*_drventry.c など)に追加します.下記に patch の一部を示します.

+inline long interruptible_sleep_on_timeout(wait_queue_head_t * q, long timeout)
+{
+    return wait_event_interruptible_timeout(*q, 0, timeout);
+}
+

また,module_param() 関数の最後の引数の意味合 いも変わっているようで,これが 1 になっている部分は 0 あるいは 0444 等 に書き換える必要があるようです.

-module_param(cp3300_version_disp, int, 1);
+module_param(cp3300_version_disp, int, 0);