はじめに
Ubuntu 10.04 に ART-Linux 2.6 カーネルパッケージをインストールして使っ ていますが,インタフェース社のインタフェースボードのドライバの再コンパ イルとインストールの手順の記録をまとめました.
ART-Linux のインストール
産業技術総合研究所の ART-Linux のページから,linux-image,linux-headers, linux-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);