비글본 블랙(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
새 커널에 대해 모듈을 다시 컴파일하십시오.