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의 패키징 및 구성을 사용합니다(이 구성 항목 변경 제외). 보다우분투 위키훈련을 실시합니다. 구성을 수정했으므로 debian.master/changelog위키에 설명된 대로 버전 수정자를 추가해야 합니다. 그런 다음 새 커널에서 재부팅하고 bq76pl536새 커널에 대해 모듈을 다시 컴파일하십시오.

관련 정보