Ubuntu 16.04LTS でのインターフェース社ドライバの使用

Index > 趣味 > Computer > Ubuntu + interface board

はじめに

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)の再コンパイル

まず,各種ボードに共通となるドライバの再コンパイルとインストールを 行いますが,コンパイルを実行する前に Makefiledpg0100.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 につ いても同様の設定をおこなうことで,カーネルの更新にあわせて必要なモジュール が全て自動的に再コンパイルされ,インストールされるようになります.