Beaglebone black / DebianでLinuxカーネルモジュールをコンパイルするときにcrc8が定義されていません。

Beaglebone black / DebianでLinuxカーネルモジュールをコンパイルするときにcrc8が定義されていません。

ビーグルボーンブラック(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/changelogWikiで説明されているようにバージョン修飾子を追加する必要があります。次に、新しいカーネルから再起動し、bq76pl536新しいカーネルのモジュールを再コンパイルします。

おすすめ記事