はじめに
Ubuntu Linux 16.04LTS のカーネル(執筆時点では 4.4.0-78-lowlatency)に, インタフェース社のインタフェースボードのドライバを再コンパイルしてイ ンストールする手順の記録をまとめました.lowlatency カーネルでテスト はしていますが,generic カーネルにもインストールは行えました.
インタフェース社のドライバをインストール
ここでは DA コンバータ用の gpg3300 という 64bit Linux 用ドライバ (gpg3300_x86_64_047043.tgz) を例にします.イン タフェースボードの Linux 用のドライバをダウンロードし,手順に従って インストールを行います.標準の設定通りに実行すると /usr/src/interfaceの下に commonとドライバ固有のディレクトリ gpg3300が作成されます.
インタフェース社のドライバの再コンパイル
共通用ドライバ(dpg0100)の再コンパイル
まず,各種ボードに共通となるドライバの再コンパイルとインストールを 行いますが,コンパイルを実行する前に Makefile と dpg0100.c を修正する必要があります。
配布された Makefile も後で参照する場合があ りますので,別名で残しておきます.新しい Makefile や patch はダウロー ドしたあとソースディレクトリにコピーしてください.
$ sudo mv Makefile Makefile.dist $ sudo cp Makefile.dpg0100 Makefile $ sudo patch -b -i dpg0100.patch $ sudo make $ sudo make install
dpg0101 の再コンパイル
インタフェースボードの設定を行うため に dpg0101 の再コンパイルとインストールも必要 ですが,C のソースコードの修正は必要なく,Makefile を作り替えればコンパイルとインストールが行えます.この作業は, dpg0100 の例を参考にしてもらえれば簡単に行え ると思いますので省略します.
ボード用ドライバ(gpg3300)の再コンパイル
DA ドライバをコンパイルする際には Makefile の置き換えと,C のソースコードの修正が必要です.新しい Makefile や patch はダウロードしたあとソー スディレクトリにコピーしておきます.また,コンパイル時に参照されるヘッ ダファイルと,ドライバの本体のバイナリファイルへのシンボリックリンク を作成しておきます.
$ cd /usr/src/interface/gpg3300/x86_64/linux/drivers/src $ sudo mv Makefile Makefile.dist $ sudo cp Makefile.gpg3300 Makefile $ sudo ln -s `pwd`/../ver26/bocp3300noreg.o . $ sudo ln -s /usr/include/fbida.h . $ sudo patch -b -i da_drventry.patch $ sudo make $ sudo make install
kernel 4.4.0 でも interruptible_sleep_on_timeout() という関 数が無くなってしまっているため, patch では interruptible_sleep_on_timeout() の替りに wait_event_interruptible_timeout() を呼び出す ための関数をソースコードに追加していますが,関数そのものを置き換えるよ うにしても良いかもしれません.
モジュールの読み込みのための設定
インストールされたモジュールは /lib/modules/4.4.0-*-lowlatency/extraに保存 されます.モジュールの依存関係を更新するため, depmod コマンドを使用します.
$ sudo depmod -A
depmod -A でうまく行かない場合には,全モジュール のチェックを行ってください.
$ sudo depmod -a
モジュールの確認
$ sudo modprobe cp3300 $ lsmod | head $ dmesg | tail
cp3300 がロードされていれば成功です.以前は dpg0100 も表示されたのですが, 16.04LTS では表示されなくても大丈夫なようです.
その他
ランタイム・ライブラリ用のディレクトリの設定
ドライバを使用するプログラムをコンパイルするには libgpg3300.so をリ ンクする必要がありますが,デフォルトでインストールされるディレクトリ /usr/lib64 は,ld の管理下には無いようで, /etc/ld.so.conf.dに 設定ファイルを追加し, /etc/ld.so.cacheを更新する必要があります.
$ sudo ldconfig
DKMSによるドライバの自動再インストール
Ubuntu はカーネルのアップグレードが盛んに行われますが,カーネルを更新 する度に,ドライバの再コンパイルとインストールが必要になります.この 作業を自動化するために DKMS を使用することができます.
うまいやり方ではないかもしれませんが,各モジュールのソースディレクトリを /usr/src の下にリンクすることにしました.
$ ln -s /usr/src/interface/common/dpg0100/src/ /usr/src/dpg0100-1.0/usr/src/dpg0100-1.0 の下に, dkms.conf を用意します.
またMakefileの設定でカーネルリリース名を uname -rで取得している部分を, makeコマンドに渡す変数を参照するように書き換える 必要があります。変更内容は次のようになります.
-KDIR := /lib/modules/$(shell uname -r)/build +KDIR := /lib/modules/$(KVER)/build
dkms への登録,モジュールのビルド,インストールは次のようにして行えます.
$ sudo dkms add -m dpg0100 -v 1.0 $ sudo dkms build -m dpg0100 -v 1.0 $ sudo dkms install -m dpg0100 -v 1.0
生成されたモジュールは /lib/modules/*/updates/dkms に保存されるため, extraに保存されていたモジュールは削除しておく必要 があります.
dpg0101, gpg3300 につ いても同様の設定をおこなうことで,カーネルの更新にあわせて必要なモジュール が全て自動的に再コンパイルされ,インストールされるようになります.