crc8 undefined при компиляции модуля ядра Linux на Beaglebone black / Debian

Я пытаюсь использовать драйвер устройства для монитора батареи TI BQ76PL536 на моем beaglebone black (BBB). Код драйвера находится здесь: https://github.com/tommessick/bq76pl536 .

Хотя, автор протестировал для кросс-компиляции Ubuntu toochain, я попытался скомпилировать модуль ядра непосредственно на моем 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 и crc8_populate_msb , когда они определены в файле crc8.h, который доступен в заголовках: /linux/crc8.h

One Solution collect form web for “crc8 undefined при компиляции модуля ядра Linux на Beaglebone black / Debian”

Ошибка не исходит от компилятора, она исходит от компоновщика. Заголовочные файлы содержат только декларации функций, они не содержат код функции, поэтому наличие функции, объявленной в заголовке, недостаточно для ее выполнения. Компилятор времени сборки предупреждает вас о том, что он не нашел места, где определена функция. Когда вы пытаетесь загрузить модуль, ядро ​​выполняет последние шаги связывания. На этом этапе все функции, используемые загруженным модулем, должны определяться запущенным ядром. В вашем случае crc8 требуется модулю, но не определяется ядром, поэтому модуль не может быть загружен.

Функция crc8 является необязательной функцией, которая должна быть включена с помощью CONFIG_CRC8 («Функция CRC8» в разделе «Библиотечные процедуры») во время сборки. Он может быть загружен как модуль, также называемый crc8 . Пытаться

 modprobe crc8 

Если это работает, то ваша установка имеет модуль crc8 . После компиляции bq76pl536 и установки его в /lib/modules запустите depmod -a ; это генерирует файл зависимостей, и после этого загрузка bq76pl536 обычно (то есть с modprobe bq76pl536 , а не напрямую с insmod ) также загрузит модуль crc8 .

Если это не сработает, то в вашей установке не будет модуля crc8 , и вам потребуется перекомпилировать ядро ​​с ним. Используйте упаковку и конфигурацию Ubuntu (за исключением изменения одного элемента конфигурации). См. Вики Ubuntu для прохода. Поскольку вы изменили конфигурацию, обязательно добавьте модификатор версии в debian.master/changelog как описано в wiki. Затем перезагрузитесь под новым ядром и перекомпилируйте модуль bq76pl536 против нового ядра.

  • Будут ли компилировать модули make-kpkg?
  • не может перенастроить virtualbox-dkms
  • Как определить, какой модуль повреждает ядро?
  • Как создать заголовки ядра Linux из ядра ядра Linux?
  • Как отключить системный звуковой сигнал LMDE?
  • BSD Kernel Vs. Ядро Linux?
  • Что решает, какие модули ядра встроены в ядро ​​статически во время компиляции?
  • Linux Vs UNIX - ядро ​​- как понять разницу?
  • Как отключить модуль ядра настойчиво?
  • Что изменяет mkinitrd при добавлении модулей ядра в initrd?
  • Как получить дополнительную информацию об устройствах ACPI?
  • Linux и Unix - лучшая ОС в мире.