hhirayama
2022年2月17日 21時15分
お世話になっております。平山と申します。
Armadillo-X1でCONTECのAI-1608AY-USBをつなぎたいのですがうまくいきません。
Armadillo-X1でCONTECからダウンロードしたドライバをMakeすると下記のようなエラーが出ました。
make -C /lib/modules/`uname -r`/build M=`pwd` V=1 modules
make[2]: Entering directory '/home/guest/caio490F/contec/caio/module_usb'
make[2]: *** /lib/modules/4.9.133-at21/build: No such file or directory. Stop.
make[2]: Leaving directory '/home/guest/caio490F/contec/caio/module_usb'
make[1]: *** [Makefile:18: caiousb.ko] Error 2
make[1]: Leaving directory '/home/guest/caio490F/contec/caio/module_usb'
make: *** [Makefile:5: all] Error 2
過去のフォーラムを見ると、X1実機上ではなくArmdilloの開発環境であるATDE上でドライバをビルドした方がいいと書かれていましたが、ATDE上でのビルド方法が分かりません。
ATDE上でのビルド方法を教えて頂けないでしょうか。
コメント
hhirayama
古賀さん
> 一点確認ですが、ビルドしようとしていらっしゃるのは、こちらのページからダウンロードできる「Linux版アナログ入出力ドライバ API-AIO(LNX) 開発環境(フルセット) Ver. 5.01」でしょうか?
> https://www.contec.com/jp/download/donwload-list/?itemid=8fc50126-0f98-…
ビルドしようとしているのは、Linux版アナログ入出力ドライバ API-AIO(LNX) 開発環境(フルセット)になります。最近更新されているのを知らなかったので、Ver.5.01ではなくVer4.90でビルドしようとしていました。
koga
アットマークテクノの古賀です。
平山さん:
>>一点確認ですが、ビルドしようとしていらっしゃるのは、こちらのページからダウンロードできる「Linux版アナログ入出力ドライバ API-AIO(LNX) 開発環境(フルセット) Ver. 5.01」でしょうか?
>> https://www.contec.com/jp/download/donwload-list/?itemid=8fc50126-0f98-…
>
>ビルドしようとしているのは、Linux版アナログ入出力ドライバ API-AIO(LNX) 開発環境(フルセット)になります。最近更新されているのを知らなかったので、Ver.5.01ではなくVer4.90でビルドしようとしていました。
了解しました。上記ページには Ver4.90 へのダウンロードリンクがありませんので、Ver.5.01 をダウンロードして内容を見てみました。
平山さん(2022年2月17日 21時15分):
>Armadillo-X1でCONTECのAI-1608AY-USBをつなぎたいのですがうまくいきません。
>Armadillo-X1でCONTECからダウンロードしたドライバをMakeすると下記のようなエラーが出ました。
>make -C /lib/modules/`uname -r`/build M=`pwd` V=1 modules
>make[2]: Entering directory '/home/guest/caio490F/contec/caio/module_usb'
>make[2]: *** /lib/modules/4.9.133-at21/build: No such file or directory. Stop.
>make[2]: Leaving directory '/home/guest/caio490F/contec/caio/module_usb'
>make[1]: *** [Makefile:18: caiousb.ko] Error 2
>make[1]: Leaving directory '/home/guest/caio490F/contec/caio/module_usb'
>make: *** [Makefile:5: all] Error 2
エラー行の
>make[2]: *** /lib/modules/4.9.133-at21/build: No such file or directory. Stop.
については、その上の行で移動しているディレクトリ
/home/guest/caio490F/contec/caio/module_usb
にある Makefile をご覧になれば分かります。この Makefile では
/lib/modules/`uname -r`/build
に該当するディレクトリが存在することを期待しており、Armadillo-X では `uname -r` が 4.9.133-at21 になりますので、該当するディレクトリは
/lib/modules/4.9.133-at21/build
となり、このディレクトリが存在しないのでエラーする、というわけです。
このエラーですが、「Linux版アナログ入出力ドライバ API-AIO(LNX) 開発環境(フルセット)」のアーカイブを展開して出来たディレクトリで、
caio501F/contec/caio/help/jp/usage/
にある installation_procedure.htm を見て頂くと、以下の記述があるかと思います:
モジュールをコンパイルする際には、Linuxのカーネルヘッダが必要になります。
事前にカーネルヘッダのインストールを行ってください。
この準備作業において、
/lib/modules/`uname -r`/build
に該当するディレクトリの直下に、Linux カーネルのヘッダファイルのディレクトリがあることを期待した Makefile 記述になっていますので、そのようにしなければいけません。ここで、
caio501F/contec/caio/
にある Makefile を見ると、以下の行があります(※Ver.5.01 の場合です)。これが、build ディレクトリの作り方のヒントになるでしょう。
all: ifeq ($(shell uname -r), 4.9.140-tegra) cd /lib/modules/4.9.140-tegra/ && ln -sf /usr/src/linux-headers-4.9.140-tegra-ubuntu18.04_aarch64/kernel-4.9 build endif
実際に試していないのですが、at21 なカーネルの X1 でセルフビルドする場合は、次のページから「Linuxカーネル (Linux 4.9対応)」のアーカイブを X1 にダウンロードして展開するか、または、PC にダウンロードして展開したのち、
linux-4.9-x1-at21/
に入っているディレクトリ群のうち include/ 以外のディレクトリを削除してから X1 にコピーしたうえで、以下を行なえばよいのではないかと思います:
1.) /lib/modules/4.9.133-at21/ ディレクトリを作る。
2.) (1) のディレクトリに cd で移動する。
3.) ln -s で、linux-4.9-x1-at21/ ディレクトリを指す build というシンボリックリンクを作る。
これを行ってからビルドすると、エラーなくビルドできるかも知れません。
>過去のフォーラムを見ると、X1実機上ではなくArmdilloの開発環境であるATDE上でドライバをビルドした方がいいと書かれていましたが、ATDE上でのビルド方法が分かりません。
>ATDE上でのビルド方法を教えて頂けないでしょうか。
ATDE でビルドする場合は、「Linuxカーネル (Linux 4.9対応)」のアーカイブを ATDE にダウンロードして展開した後、上の (1)~(3) と同様の手順で、ATDE 上に linux-4.9-x1-at21/ ディレクトリへのシンボリックリンク
/lib/modules/4.9.133-at21/build
を作り、そして、make を実行する際に CC=arm-linux-gnueabihf-gcc オプションを指定すればよいのではないかと思います:
https://stackoverflow.com/a/2969244
hhirayama
古賀さん
教えていただいたやり方でやってみました。
以前よりは先に進んだのですが、下記のようなエラーが出て止まってしまいました。
-c -o /root/contec/caio/module2/Ccom_module.o /root/contec/caio/module2/Ccom_module.c
In file included from :
././include/linux/kconfig.h:4:10: fatal error: generated/autoconf.h: No such file or directory
#include
^~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
make[3]: *** [scripts/Makefile.build:309: /root/contec/caio/module2/Ccom_module.o] Error 1
X1の中に上記のヘッダーファイルが無くてエラーが出ていると思うのですが、対処法などご存じでしたら教えて頂けないでしょうか。
at_shinya.koga
アットマークテクノの古賀です。
hhirayamaさん:
>教えていただいたやり方でやってみました。
>以前よりは先に進んだのですが、下記のようなエラーが出て止まってしまいました。
> -c -o /root/contec/caio/module2/Ccom_module.o /root/contec/caio/module2/Ccom_module.c
>In file included from :
>././include/linux/kconfig.h:4:10: fatal error: generated/autoconf.h: No such file or directory
> #include
> ^~~~~~~~~~~~~~~~~~~~~~
>compilation terminated.
>make[3]: *** [scripts/Makefile.build:309: /root/contec/caio/module2/Ccom_module.o] Error 1
>
>X1の中に上記のヘッダーファイルが無くてエラーが出ていると思うのですが、対処法などご存じでしたら教えて頂けないでしょうか。
include/ の中に generated/ サブディレクトリが存在していない状況ですね。単純にカーネルのソースアーカイブを展開した状態だと、include/generated/ は存在していませんので、コンフィグレーションする必要があります。カーネルのソースアーカイブを展開したディレクトリで、マニュアルの「10.2 Linuxカーネルをビルドする」に記載されているように
$ make ARCH=arm x1_defconfig
としてみて下さい。
https://manual.atmark-techno.com/armadillo-x1/armadillo-x1_product_manu…
hhirayama
古賀さん
指摘頂いたように
make ARCH=arm x1_defconfig
を実行すると下記のようなエラーが出ました。
root@armadillo:/home/atmark/linux-4.9-x1-at21# make ARCH=arm x1_defconfig
HOSTCC scripts/basic/fixdep
HOSTCC scripts/kconfig/conf.o
SHIPPED scripts/kconfig/zconf.tab.c
SHIPPED scripts/kconfig/zconf.lex.c
SHIPPED scripts/kconfig/zconf.hash.c
HOSTCC scripts/kconfig/zconf.tab.o
HOSTLD scripts/kconfig/conf
init/Kconfig:1331: can't open file "usr/Kconfig"
make[1]: *** [scripts/kconfig/Makefile:112: x1_defconfig] Error 1
make: *** [Makefile:544: x1_defconfig] Error 2
このような時はどのように対処したらよろしいでしょうか。
hhirayama
古賀さん
下記のエラーが出る件は解決しました。X1の中で展開したので空き容量が無くusrフォルダが作られていませんでした。
> init/Kconfig:1331: can't open file "usr/Kconfig"
> make[1]: *** [scripts/kconfig/Makefile:112: x1_defconfig] Error 1
> make: *** [Makefile:544: x1_defconfig] Error 2
しかし、include/generated/ ができていませんでした。ビルドも必要なのでしょうか?
hhirayama
古賀さん
度々申し訳ございません。
include/generated/ はできました。
そのあと、cd でcaio501F/contec/caio/に移動し、makeを実行すると下記のエラーが出ました。
対処法などご存じでしたら教えて頂けないでしょうか
-c -o /root/contec/caio/module2/.tmp_Ccom_module.o /root/contec/caio/module2/Ccom_module.c
In file included from ./include/asm-generic/int-ll64.h:10,
from ./arch/arm/include/asm/types.h:4,
from ./include/uapi/linux/types.h:4,
from ./include/linux/types.h:5,
from ./include/linux/list.h:4,
from ./include/linux/module.h:9,
from /root/contec/caio/module2/Ccom_module.c:12:
./include/uapi/asm-generic/int-ll64.h:11:10: fatal error: asm/bitsperlong.h: No such file or directory
#include
^~~~~~~~~~~~~~~~~~~
compilation terminated.
make[3]: *** [scripts/Makefile.build:297: /root/contec/caio/module2/Ccom_module.o] Error 1
koga
アットマークテクノの古賀です。
平山さん:
>度々申し訳ございません。
>include/generated/ はできました。
>そのあと、cd でcaio501F/contec/caio/に移動し、makeを実行すると下記のエラーが出ました。
>対処法などご存じでしたら教えて頂けないでしょうか
asm/bitsperlong.h が存在しないというエラーですね。この bitsperlogn.h は、
include/uapi/linux/types.h
がインクルードしている
arch/arm/include/asm/types.h
と同じく、arch/arm/include/asm/ に存在しているはずですが、存在していないかまたは、参照できずにエラーになっているようです。
> -c -o /root/contec/caio/module2/.tmp_Ccom_module.o /root/contec/caio/module2/Ccom_module.c
>In file included from ./include/asm-generic/int-ll64.h:10,
> from ./arch/arm/include/asm/types.h:4,
> from ./include/uapi/linux/types.h:4,
> from ./include/linux/types.h:5,
> from ./include/linux/list.h:4,
> from ./include/linux/module.h:9,
> from /root/contec/caio/module2/Ccom_module.c:12:
>./include/uapi/asm-generic/int-ll64.h:11:10: fatal error: asm/bitsperlong.h: No such file or directory
> #include
> ^~~~~~~~~~~~~~~~~~~
>compilation terminated.
>make[3]: *** [scripts/Makefile.build:297: /root/contec/caio/module2/Ccom_module.o] Error 1
確認ですが、ディレクトリ
/lib/modules/4.9.133-at21/build/arch/arm/include/asm/
の下に bitsperlong.h は存在しているでしょうか?
もし存在していない場合、types.h は存在しているでしょうか?
hhirayama
koga
アットマークテクノの古賀です。
平山さん:
>>確認ですが、ディレクトリ
>> /lib/modules/4.9.133-at21/build/arch/arm/include/asm/
>>の下に bitsperlong.h は存在しているでしょうか?
>>もし存在していない場合、types.h は存在しているでしょうか?
>
>確認したところ、bitsperlong.h は存在していませんでした。types.hの方は存在しています。
ごめんなさい。手元の環境(ATDE 上で Linux カーネルをビルドしたソースツリー)で確認したところ、
arch/arm/include/asm/bitsperlong.h
は存在しておらず、存在しているのは
arch/arm/include/generated/asm/bitsperlong.h
でした。
だいぶ乱暴なやり方ですが、以下のコマンドで
arch/arm/include/generated/asm/bitsperlong.h
へのシンボリックリンクを作るか、または、この bitsperlong.h を
/lib/modules/4.9.133-at21/build/arch/arm/include/asm/
にコピーしてからビルドすると、どうなるでしょうか?
# cd /lib/modules/4.9.133-at21/build/arch/arm/include/asm/ # ln -s ../generated/asm/bitsperlong.h .
hhirayama
古賀さん
アーカイブを X1 にダウンロードして展開するときに色々とエラーが出ていたみたいでしたので、アーカイブを X1 にダウンロードして展開からやり直してみました。
すると、
>./include/uapi/asm-generic/int-ll64.h:11:10: fatal error: asm/bitsperlong.h: No such file or directory
のではなく
-c -o /root/contec/caio/module2/.tmp_Ccom_module.o /root/contec/caio/module2/Ccom_module.c
/bin/sh: 1: scripts/basic/fixdep: Exec format error
make[3]: *** [scripts/Makefile.build:297: /root/contec/caio/module2/Ccom_module.o] Error 2
make[2]: *** [Makefile:1510: _module_/root/contec/caio/module2] Error 2
が出るようになりました。
以前、linux-4.9-x1-at21/に入っているディレクトリ群のうち include/ 以外のディレクトリを削除してから X1 にコピーと教えて頂きましたが、cd でcaio501F/contec/caio/に移動し、makeを実行するとエラーが出たため、linux-4.9-x1-at21/内にあったarchとscriptsをx1にコピーしてmakeを実行すると上記のエラーが出ました。archとscriptsをx1にコピーするやり方はあってますでしょうか?
at_shinya.koga
アットマークテクノの古賀です。
平山さん:
>アーカイブを X1 にダウンロードして展開するときに色々とエラーが出ていたみたいでしたので、アーカイブを X1 にダウンロードして展開からやり直してみました。
>すると、
>>./include/uapi/asm-generic/int-ll64.h:11:10: fatal error: asm/bitsperlong.h: No such file or directory
>のではなく
> -c -o /root/contec/caio/module2/.tmp_Ccom_module.o /root/contec/caio/module2/Ccom_module.c
>/bin/sh: 1: scripts/basic/fixdep: Exec format error
>make[3]: *** [scripts/Makefile.build:297: /root/contec/caio/module2/Ccom_module.o] Error 2
>make[2]: *** [Makefile:1510: _module_/root/contec/caio/module2] Error 2
>が出るようになりました。
>以前、linux-4.9-x1-at21/に入っているディレクトリ群のうち include/ 以外のディレクトリを削除してから X1 にコピーと教えて頂きましたが、cd でcaio501F/contec/caio/に移動し、makeを実行するとエラーが出たため、linux-4.9-x1-at21/内にあったarchとscriptsをx1にコピーしてmakeを実行すると上記のエラーが出ました。archとscriptsをx1にコピーするやり方はあってますでしょうか?
上記エラーの
scripts/basic/fixdep: Exec format error
ですが、これは、クロスビルド環境(ATDE)からコピーしたためのようです。ごめんなさい:
https://qiita.com/ikwzm/items/e31ecb099d0d50cb027c
X1 でセルフビルドする場合ですが、inux-4.9-x1-at21/ ディレクトリに cd で移動した後、
# make scripts
を実行してみて下さい。その後、再度 /root/contec/caio/ に cd で移動して make を実行すればよいでしょう。
先ほど、ATDE 上でカーネルのソースツリーをビルドして、ビルドした後のソースツリー一式を実機にコピーしたのち、上記の make scripts を行ったうえで contec/caio/ に移動して make を実行したところ、エラーなくビルドできました。
# なお、実機でのセルフビルドにあたっては、ブート SD ディスクを作り、SD ブートで行いました(容量不足の心配をなくすため)。
以上、参考になりましたら幸いです。
hhirayama
koga
アットマークテクノの古賀です。
平山さん:
>教えて頂いたようにSDブートでおこなったら、make、make installできて、機器を認識するようになりました。
>ありがとうございました。
ドライバの動作も問題なかったようですね。良かったです。
>今後もSDブートだと使えないので、通常のブートにするためにはSDカードのデータをx1本体に移動させるとよいのでしょうか?
>その辺が分かってなくどのようにしたらいいか分かりません。SDカードからどのデータを移動させたらよいのか教えて頂けないでしょうか。
make install で何が起きたのかは、
/home/guest/caio490F/contec/caio/
にある Makefile で、ターゲット install に対するルールを見てみて下さい。以下のサブディレクトリを make コマンドの -C オプションで指定して、順に make install を実行するようになっていますよね:
config
module_usb
module
module2
library
で、これらのサブディレクトリに対する make install で何が起きたのかは、各サブディレクトリにある Makefile で、ターゲット install に対するルールを見ればよいというわけです。
実際に試してはいないのですが、たぶん、次の手順で、SD カード上のルートファイルシステムでビルドしてできたドライバを eMMC 上のルートファイルシステムにインストールできるのではないかと思います:
(1) Armadillo をシャットダウン&電源断する。
(2) ブート SD カードを Armadillo に装着したままの状態で、eMMC ブートの設定に戻す。
(3) eMMC ブートする。
(4) ブートしたら、ログインして以下のコマンドを実行する(※root でログインしたものとしています。一般ユーザーの場合は sudo 付きで実行して下さい)。
# mount /dev/usb2 /mnt # mkdir -p /lib/modules/4.9.133-at21/kernel/drivers/usb # cd /mnt/home/guest/caio490F/contec/caio/ # make install
ただし、config/Makefile では、Armadillo-X1 の場合 caio490F/contec/caio/config/arm32/config を caio490F/contec/caio/config/ にコピーするようになっており、コピーした caio490F/contec/caio/config/config を、以後どのように使うのか僕は理解していません(caio490F/contec/caio/help/ 配下にあるドキュメントに記載されていると思いますが、ちゃんと読んでいません)。サンプルコードを動かす場合に必要なものかも知れませんが、それらも eMMC 上のルートファイルシステムへ移したい場合は、caio490F/contec/caio/ を eMMC 上のルートファイルシステムのディレクトリへ cp -rp でコピーしてみて下さいませ。
ここから先の、このドライバに依存した疑問などは、ドライバ提供元の CONTEC 社に質問して頂くのが、より確実かと思います。
以上、もし参考になりましたら幸いです。
koga
先ほどのコメントで例示したコマンドに、間違いがありました。ごめんなさい。
古賀:
>実際に試してはいないのですが、たぶん、次の手順で、SD カード上のルートファイルシステムでビルドしてできたドライバを eMMC 上のルートファイルシステムにインストールできるのではないかと思います:
>
>(1) Armadillo をシャットダウン&電源断する。
>(2) ブート SD カードを Armadillo に装着したままの状態で、eMMC ブートの設定に戻す。
>(3) eMMC ブートする。
>(4) ブートしたら、ログインして以下のコマンドを実行する(※root でログインしたものとしています。一般ユーザーの場合は sudo 付きで実行して下さい)。
# mount /dev/usb2 /mnt ...
mount コマンドの第一引数は、'/dev/usb2' ではなく '/dev/sdb2' の間違いです。ごめんなさい。
hhirayama
koga
アットマークテクノの古賀です。
平山さん:
>SDブートでおこなってmake、make installできたのですが、実際に物を動かそうとしたときに、lookup_builtin_file() could not open builtin fileというエラーが出て先に進みませんでした。このエラーが出る原因、対策等ご存じでしたら教えて頂けないでしょうか。
>物がなく動作確認までできていませんでした。申し訳ありませんが、宜しくお願いします。
このエラーメッセージは、libkmod が出しており、カーネルモジュールをロードしようとした際にエラーしているようです:
https://git.kernel.org/pub/scm/utils/kernel/kmod/kmod.git/tree/libkmod/…
で、このエラーが起きた原因ですが、Armadillo-X1 に
/lib/modules/4.9.133-at21/
というディレクトリが存在していないことが原因だと思われます。おそらく、上記のエラーメッセージの後には、存在していないファイル名が出力されており、その中には modules.builtin.bin などがあると思います。これらのファイルは、Armadillo-X1 のカーネルをビルドした環境で生成して Armadillo-X1 の /lib/modules/ 配下に配置しなければいけないようです。このページが参考になるでしょう:
http://nahitafu.cocolog-nifty.com/nahitafu/2019/09/post-e84457.html
なお、このページでは、modules と modules_install をターゲットにして make を実行する例が提示されていますが、ATDE (および、それ以外のクロスビルド環境)で Armadillo-X1 のカーネルをビルドしている場合には、例示されているのと同じコマンドを実行するとエラーになります。クロスビルド環境の場合は、こちらの質問の回答で提示しているように、'CROSS_COMPILE=arm-linux-gnueabihf-' を付けて下さい:
https://armadillo.atmark-techno.com/forum/armadillo/3948
lib/modules/4.9.133-at21/ ディレクトリですが、2/20 のコメントで、「「Linux版アナログ入出力ドライバ API-AIO(LNX) 開発環境(フルセット) 」をビルドする際に手作業で作成して下さいと書きましたが、これが正しくありませんでした。ごめんなさい。
https://armadillo.atmark-techno.com/forum/armadillo/11052#comment-10673
modules と modules_install を make すると、INSTALL_MOD_PATH で指定したディレクトリの下に lib/modules/4.9.133-at21/ が生成され、生成された /lib/modules/4.9.133-at21/ の下には build/ ディレクトリも生成されます(※build は、Linux カーネルのソースディレクトリのへのシンボリックリンクです)。従って、この
lib/modules/4.9.133-at21/
ディレクトリに対して、/lib/modules からシンボリックリンクを張ってからビルドすればよい、というわけでした。不十分な対応手順を書いてしまい、申し訳ありませんでした。
ということで、modules と modules_install を make したら、
http://nahitafu.cocolog-nifty.com/nahitafu/2019/09/post-e84457.html
に記載されているように、INSTALL_MOD_PATH で指定したディレクトリに生成された
lib/modules/4.9.133-at21/
ディレクトリを、Armadillo-X の
/lib/modules/4.9.133-at21/
に配置して下さい。Linux カーネルをセルフビルドしている場合は、シンボリックリンクを張ればよいですし、クロスビルドした場合(および、セルフビルドした時とは違うストレージ上のルートファイルシステムで動かす場合)は、このディレクトリを一式コピーするか、または
/lib/modules/4.9.133-at21/modules*
だけをコピーすればよいでしょう(※build, source, kernel は不要なはずなので)。
hhirayama
koga
2022年2月18日 7時40分
アットマークテクノの古賀です。
平山さん:
>Armadillo-X1でCONTECのAI-1608AY-USBをつなぎたいのですがうまくいきません。
>Armadillo-X1でCONTECからダウンロードしたドライバをMakeすると下記のようなエラーが出ました。
>make -C /lib/modules/`uname -r`/build M=`pwd` V=1 modules
>make[2]: Entering directory '/home/guest/caio490F/contec/caio/module_usb'
>make[2]: *** /lib/modules/4.9.133-at21/build: No such file or directory. Stop.
>make[2]: Leaving directory '/home/guest/caio490F/contec/caio/module_usb'
>make[1]: *** [Makefile:18: caiousb.ko] Error 2
>make[1]: Leaving directory '/home/guest/caio490F/contec/caio/module_usb'
>make: *** [Makefile:5: all] Error 2
>
>過去のフォーラムを見ると、X1実機上ではなくArmdilloの開発環境であるATDE上でドライバをビルドした方がいいと書かれていましたが、ATDE上でのビルド方法が分かりません。
>ATDE上でのビルド方法を教えて頂けないでしょうか。
一点確認ですが、ビルドしようとしていらっしゃるのは、こちらのページからダウンロードできる「Linux版アナログ入出力ドライバ API-AIO(LNX) 開発環境(フルセット) Ver. 5.01」でしょうか?
https://www.contec.com/jp/download/donwload-list/?itemid=8fc50126-0f98-…