Como compilar o kernel Linux com multimídia como módulo no Odroid C2

1

Eu estou tentando compilar o kernel Linux no Odroid C2 e instalar drivers DVB-T usando media_build . Eu segui os passos descritos no wiki oficial e fórum . De acordo com o fórum, é necessário fazer Device Drivers -> Amlogic Device Drivers -> Multimedia Support compilar como módulos se eu quiser usar os drivers back-media_build de DVB-T.

Primeiro, obtive a fonte do Linux:

git clone --depth 1 https://github.com/hardkernel/linux.git -b odroidc2-3.14.y

Então eu configurei a configuração para o Odroid C2:

make odroidc2_defconfig

E, finalmente, eu segui os passos para compilação do kernel e dependências V4L desativadas da seguinte forma:

$make menuconfig
Device Drivers
    Amlogic Device Drivers
  ION Support
     ION memory management support = no
  Amlogic ion video support
     videobuf2-ion video device support = no
     Amlogic ion video devic support = no
  V4L2 Video Support
     Amlogic v4l video device support = no
     Amlogic v4l video2 device support = no
  Amlogic Camera Support
     Amlogic Platform Capture Driver = no
  Multimedia support = m

Esta configuração compila sem erros, e então eu posso compilar e instalar drivers media_build. O problema é que, com essa configuração, o Odroid C2 não é capaz de reproduzir arquivos de vídeo no Kodi com a decodificação de hardware. Minha impressão é que desabilitei uma dependência que é necessária para a decodificação do hardware amlogic. Eu tentei modificar a configuração e marcar como módulos todas as dependências que eu desabilitei anteriormente. Infelizmente, com essa configuração, o kernel não pôde ser compilado e a compilação falhou com o seguinte erro:

drivers/built-in.o: In function 'v4l2_device_release':
odroid-battery.c:(.text+0x1731c0): undefined reference to 
'media_device_unregister_entity'
odroid-battery.c:(.text+0x1731c0): relocation truncated to fit: 
R_AARCH64_CALL26 against undefined symbol 'media_device_unregister_entity'
drivers/built-in.o: In function '__video_register_device':
odroid-battery.c:(.text+0x173c4c): undefined reference to 
'media_device_register_entity'
odroid-battery.c:(.text+0x173c4c): relocation truncated to fit: 
R_AARCH64_CALL26 against undefined symbol 'media_device_register_entity'
drivers/built-in.o: In function 'v4l2_device_register_subdev':
odroid-battery.c:(.text+0x1797b0): undefined reference to 
'media_device_register_entity'
odroid-battery.c:(.text+0x1797b0): relocation truncated to fit: 
R_AARCH64_CALL26 against undefined symbol 'media_device_register_entity'
drivers/built-in.o: In function 'v4l2_device_unregister_subdev':
odroid-battery.c:(.text+0x179a58): undefined reference to 
'media_entity_remove_links'
odroid-battery.c:(.text+0x179a58): relocation truncated to fit: 
R_AARCH64_CALL26 against undefined symbol 'media_entity_remove_links'
odroid-battery.c:(.text+0x179a60): undefined reference to 
'media_device_unregister_entity'
odroid-battery.c:(.text+0x179a60): relocation truncated to fit: 
R_AARCH64_CALL26 against undefined symbol 'media_device_unregister_entity'
drivers/built-in.o: In function 'subdev_close':
odroid-battery.c:(.text+0x180c10): undefined reference to 'media_entity_put'
odroid-battery.c:(.text+0x180c10): relocation truncated to fit: 
R_AARCH64_CALL26 against undefined symbol 'media_entity_put'
drivers/built-in.o: In function 'subdev_open':
odroid-battery.c:(.text+0x1814f4): undefined reference to 'media_entity_get'
odroid-battery.c:(.text+0x1814f4): relocation truncated to fit: 
R_AARCH64_CALL26 against undefined symbol 'media_entity_get'
odroid-battery.c:(.text+0x181540): undefined reference to 'media_entity_put'
odroid-battery.c:(.text+0x181540): relocation truncated to fit: 
R_AARCH64_CALL26 against undefined symbol 'media_entity_put'
Makefile:831: recipe for target 'vmlinux' failed
make: *** [vmlinux] Error 1

Como posso compilar o kernel com o Suporte Multimídia como módulos e ainda ser capaz de usar a decodificação de hardware para arquivos de vídeo?

    
por Jan Pichl 14.01.2018 / 18:31

1 resposta

1

Eu finalmente faço funcionar. Eu criei um repositório git com um script, patches e instruções. Se alguém também estiver lidando com esse problema, clone este repositório e siga os seguintes passos (estes também são descritos no README em o repositório):

Linux

Repositório do Clone Hardkernel Linux

git clone --depth 1 https://github.com/hardkernel/linux.git -b odroidc2-3.14.y
cd linux

Aplique o patch que permite que você compile um driver de vídeo como um módulo (tomei este passo em LibreELEC media_build edition )

patch -p1 < ../odroidC2-kernel/allow_amlvideodri_as_module.patch

Aplicar configuração padrão do Odroid C2

make odroidc2_defconfig

Agora modifique a configuração

make menuconfig

E defina os seguintes valores (pressione Y para selecionar, N para remover e M para selecioná-lo como um módulo)

Device Drivers
   Amlogic Device Drivers
      ION Support
         ION memory management support = Yes
      Amlogic ion video support
         videobuf2-ion video device support = M
         Amlogic ion video devic support = no
      V4L2 Video Support
         Amlogic v4l video device support = M
         Amlogic v4l video2 device support = no
      Amlogic Camera Support
         Amlogic Platform Capture Driver = no
   Multimedia support = M

Compile o kernel

make -j5 LOCALVERSION=""

O parâmetro LOCALVERSION é apenas para evitar o sinal "+" no nome do kernel. Após a compilação bem sucedida, instale os módulos, kernel e reinicie o sistema

sudo make modules_install
sudo cp -f arch/arm64/boot/Image arch/arm64/boot/dts/meson64_odroidc2.dtb /media/boot/
sudo sync
sudo reboot

Criação de mídia

Clone o repositório media_build e tente criá-lo.

git clone https://git.linuxtv.org/media_build.git
cd media_build
./build

O comando de compilação provavelmente falha. Ignore este erro e continue com as etapas a seguir. O script a seguir também é inspirado na edição media_build do LibreELEC e inclui apenas o driver de vídeo no módulo de mídia.

../odroidC2-kernel/add_video_driver_module.sh

Para evitar possíveis problemas com a compilação, tente desativar o suporte ao controlador remoto e todo o adaptador USB que você não precisa. Tente executar:

make menuconfig

Isso provavelmente resultará em um erro semelhante ao seguinte:

./Kconfig:694: syntax error
./Kconfig:693: unknown option "Enable"
./Kconfig:694: unknown option "which"

Você precisa editar o arquivo v4l/Kconfig e alinhar com os espaços as linhas impressas no erro. As linhas precisam estar alinhadas com as anteriores. Em seguida, execute o make menuconfig novamente. Provavelmente, você precisa fazer este passo várias vezes.

Se você vir um menu em vez do erro, poderá modificar a configuração da seguinte maneira:

Remote Controller support = no
Multimedia support
    Media USB Adapters
        ## Disable all driver you don't need ##

Aplique o seguinte patch

patch -p1 < ../odroidC2-kernel/warning.patch

Faça a seguinte alteração para evitar erros e compilar o kernel

sed -i 's/#define NEED_PM_RUNTIME_GET 1/\/\/#define NEED_PM_RUNTIME_GET 1/g' v4l/config-compat.h
make -j5

Possivelmente, você precisa executar a etapa anterior (sed e make) várias vezes antes de ser bem-sucedida.

Após a compilação, instale os módulos e reinicie o sistema

sudo make install
sudo reboot

A etapa final é adicionar o módulo amlvideodri em /etc/modules para que seja carregado na inicialização.

sudo echo "amlvideodri" >> /etc/modules

Isso é tudo. Agora você pode assistir seus vídeos acelerados com DVB-T e HW no Kodi.

    
por 18.02.2018 / 15:39