crc8 undefined durante a compilação do módulo kernel do Linux no Beaglebone black / Debian

1

Estou tentando usar o driver de dispositivo para um monitor de bateria TI BQ76PL536 no meu beaglebone black (BBB). O código do driver está localizado aqui: link .

Embora o autor tenha testado uma pasta do Ubuntu de compilação cruzada, tentei compilar o módulo do kernel diretamente no meu BBB.

eu fiz

sudo apt-get install linux-headers-4.4.9-ti-r25

para instalar os cabeçalhos do kernel relevantes e, em seguida, usando o seguinte 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

e eu defini KERNELDIR=/lib/modules/4.4.9-ti-r25/build/ . Estou seguindo as instruções como aqui: link

e minha saída de 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'

Enquanto os arquivos .o, .ko etc. são criados. Quando tento carregar o módulo usando insmod , recebo um erro:

sudo insmod ./bq76pl536.ko 
insmod: ERROR: could not insert module ./bq76pl536.ko: Unknown symbol in module

Minha saída dmesg é como em

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)

Não consigo entender a origem desse erro - o compilador não consegue encontrar funções: crc8 e crc8_populate_msb , quando eles são definidos em crc8.h, que está acessível nos cabeçalhos: /linux/crc8.h

    
por Chintan Pathak 15.08.2016 / 01:15

1 resposta

0

O erro não vem do compilador, ele vem do vinculador. Os arquivos de cabeçalho contêm apenas a declaração de funções, eles não contêm o código da função, portanto, ter a função declarada em um cabeçalho não é suficiente para executá-lo. O linker do tempo de criação avisa que não encontrou um local onde a função esteja definida. Quando você tenta carregar o módulo, o kernel executa as últimas etapas de vinculação. Nesse estágio, todas as funções usadas pelo módulo carregado devem ser definidas pelo kernel em execução. No seu caso, crc8 é requerido pelo módulo, mas não definido pelo kernel, então o módulo não pode ser carregado.

A função crc8 é um recurso opcional que deve ser ativado com CONFIG_CRC8 (“ Função CRC8 ”em“ Rotinas da Biblioteca ”) no momento da criação. Pode ser carregado como um módulo também chamado crc8 . Experimente

modprobe crc8

Se isso funcionar, sua instalação terá o módulo crc8 . Depois de compilar o bq76pl536 e instalá-lo em /lib/modules , execute depmod -a ; isso gera um arquivo de dependência e, após esse carregamento, o bq76pl536 normalmente (ou seja, com modprobe bq76pl536 , não diretamente com insmod ) também carregará o módulo crc8 .

Se isso não funcionar, sua instalação não terá o módulo crc8 e você precisará recompilar um kernel com ele. Use o pacote e a configuração do Ubuntu (exceto para alterar esse item de configuração). Veja o wiki do Ubuntu para um passo a passo. Como você modificou a configuração, adicione um modificador de versão em debian.master/changelog conforme explicado no wiki. Em seguida, reinicialize sob o novo kernel e recompile o módulo bq76pl536 contra o novo kernel.

    
por 16.08.2016 / 03:51