
ビーグルボーンブラック(BBB)にTIバッテリモニタBQ76PL536用のデバイスドライバを使用しようとしています。ドライバコードは次の場所にあります。https://github.com/tommessick/bq76pl536。
著者がUbuntuツールチェーンのクロスコンパイルをテストしている間、私はBBBから直接カーネルモジュールをコンパイルしてみました。
私がやった
sudo apt-get install linux-headers-4.4.9-ti-r25
関連カーネルヘッダファイルをインストールしたら、次のコマンドを使用します。Makefile
DRIVER = bq76pl536
ifneq ($(KERNELRELEASE),)
obj-m += $(DRIVER).o
else
PWD := $(shell pwd)
default:
ifeq ($(strip $(KERNELDIR)),)
$(error "KERNELDIR is undefined!")
else
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif
私はそれを定義しましたKERNELDIR=/lib/modules/4.4.9-ti-r25/build/
。ここの指示に従いました。http://derekmolloy.ie/writing-a-linux-kernel-module-part-1-introduction/
私の結果make
は次のとおりです
make
make -C /lib/modules/4.4.9-ti-r25/build/ M=/var/lib/cloud9/bq76_driver/bq76pl536 modules
make[1]: Entering directory '/usr/src/linux-headers-4.4.9-ti-r25'
Building modules, stage 2.
MODPOST 1 modules
WARNING: "crc8_populate_msb" [/var/lib/cloud9/bq76_driver/bq76pl536/bq76pl536.ko] undefined!
WARNING: "crc8" [/var/lib/cloud9/bq76_driver/bq76pl536/bq76pl536.ko] undefined!
make[1]: Leaving directory '/usr/src/linux-headers-4.4.9-ti-r25'
.o、.koなどのファイルを生成するとき。モジュールをロードしようとするとinsmod
エラーが発生します。
sudo insmod ./bq76pl536.ko
insmod: ERROR: could not insert module ./bq76pl536.ko: Unknown symbol in module
私のdmesg
出力は次のとおりです
dmesg | tail
[ 21.564768] eqep 48304180.eqep: failed to get clock
[ 21.605265] c_can_platform 481cc000.can: c_can_platform device registered (regs=fa1cc000, irq=207)
[ 21.661309] c_can_platform 481d0000.can: c_can_platform device registered (regs=fa1d0000, irq=208)
[ 21.768584] eqep: probe of 48304180.eqep failed with error -2
[161381.366409] bq76pl536: Unknown symbol crc8 (err 0)
[161381.366768] bq76pl536: Unknown symbol crc8_populate_msb (err 0)
[162501.175612] bq76pl536: Unknown symbol crc8 (err 0)
[162501.175973] bq76pl536: Unknown symbol crc8_populate_msb (err 0)
このエラーの原因を理解できません。コンパイラはcrc8.hで定義されている関数:crc8
とを見つけることができず、crc8_populate_msb
ヘッダからアクセスできます:/linux/crc8.h
答え1
エラーはコンパイラではなくリンカで発生します。ヘッダファイルには関数のコードではなく関数の宣言だけが含まれているため、ヘッダファイルに関数を宣言するだけでは実行に十分ではありません。ビルド時間コネクタ関数が定義された場所が見つからないことを警告します。モジュールをロードしようとすると、カーネルは最終接続ステップを実行します。この手順では、ロードされたモジュールで使用されるすべての機能を実行しているカーネルで定義する必要があります。あなたの場合はcrc8
モジュールが必要ですが、カーネルによって定義されていないため、モジュールをロードできません。
このcrc8
機能はオプションで、次の方法で有効にする必要があります。CONFIG_CRC8
(「ライブラリルーチン」の下の「CRC8機能」)ビルド時に。とも呼ばれるモジュールにロードできますcrc8
。努力する
modprobe crc8
これがうまくいけば、インストールにcrc8
モジュールがあります。をコンパイルしてインストールしたbq76pl536
後に/lib/modules
実行するdepmod -a
と依存関係ファイルが生成され、その後正常にロードbq76pl536
(つまりmodprobe bq76pl536
直接使用するのではなく)するとモジュールinsmod
もロードされます。crc8
これがうまくいかない場合は、インストールにモジュールがないため、そのモジュールをcrc8
使用してカーネルを再コンパイルする必要があります。 Ubuntuのパッケージングと設定を使用します(この設定項目の変更を除く)。よりUbuntu Wiki訓練を行います。構成を変更したので、debian.master/changelog
Wikiで説明されているようにバージョン修飾子を追加する必要があります。次に、新しいカーネルから再起動し、bq76pl536
新しいカーネルのモジュールを再コンパイルします。