Pular para conteúdo

Prática 11 - Customizando Kernel e Criando Patches

Note

VERIFICAR COM O INSTRUTOR QUAL CONTAINER DEVERÁ SER UTILIZADO.


QEMU
- ~/treinamento/yp/poky/build-toradex
- ~/treinamento/yp/poky/meta-treinamento


Toradex Colibri iMX8X
- ~/treinamento/yp/oe-core/build
- ~/treinamento/yp/oe-core/layers/meta-treinamento


Note

ANTES DE CONTINUAR CASO TODAS AS PRATICAS COM meta-treinamento FORAM EXECUTADAS NO CONTAINER COM QEMU, COPIAR meta-treinamento PARA ~/treinamento/yp/oe-core/layers/ ANTES DE CONTINUAR!


Antes de criar a receita .bbappend para customização do kernel vamos utilizar o proprio bitbake e descobrir o nome (PN) e a versão (PV) do kernel Linux utilizado no hardware.


Aqui esta uma sacada utilizando virtual/kernel que retornará o kernel utilizado, ele é um alias para a receita do MACHINE para Kernel.

Executar no HOST - CONTAINER QEMU
bitbake -e virtual/kernel | egrep '^PN.|^PV'


Executar no HOST - CONTAINER TORADEX
MACHINE=colibri-imx8x DISTRO=tdx-xwayland bitbake -e virtual/kernel | egrep '^PN.|^PV'

Resultado:

CONTAINER QEMU
PN="linux-yocto"
PV="6.6.123+git"


CONTAINER TORADEX
PN="linux-toradex"
PV="6.6.94+git"


Na camada meta-treinamento criar o diretório meta-treinamento/recipes-kernel/linux e criar o arquivo .bbappend para customização do kernel linux-toradex_6.6-2.2.x.bbappend.


Executar no HOST - CONTAINER QEMU
cd ~/treinamento/yp/poky/meta-treinamento/

mkdir -p recipes-kernel/linux/linux-yocto

touch recipes-kernel/linux/linux-yocto_6.6%.bbappend

cd ~/treinamento/yp/poky/build-qemu


Executar no HOST - CONTAINER TORADEX
cd ~/treinamento/yp/oe-core/layers/meta-treinamento/

mkdir -p recipes-kernel/linux/linux-toradex

touch recipes-kernel/linux/linux-toradex_6.6-2.2.x.bbappend

cd ~/treinamento/yp/oe-core/build


Primeiro limpar qualquer configuração do kernel no build atual:

Executar no HOST CONTAINER QEMU
bitbake -c cleansstate virtual/kernel

Executar no HOST CONTAINER TORADEX
MACHINE=colibri-imx8x DISTRO=tdx-xwayland bitbake -c cleansstate virtual/kernel


Próximo passo executar o comando -c menuconfig para abrir o menu Kconfig para configuração:

Executar no HOST - CONTAINER QEMU
bitbake -c menuconfig virtual/kernel
Executar no HOST - CONTAINER TORADEX
MACHINE=colibri-imx8x DISTRO=tdx-xwayland bitbake -c menuconfig virtual/kernel


Navegue pelo menu de configurações, no exemplo deverá habilitar suporte ao Driver Touchscreen GOODIX, em Device Drivers -> Input Device Support -> Touchscreens -> Goodix I2C touchscreen e deixe marcado como módulo(M).


Em seguida selecione Save, confirme que o nome do arquivo seja .config e selecione Exit e na sequência Exit até sair do Kernel Configuration.


O arquivo .config modificado está salvo mas em uma região temporária do build, caso queira gerar um defconfig com esta modificação para anexar ao projeto, execute o comando -c savedefconfig.

Executar no HOST - CONTAINER QEMU
bitbake -c savedefconfig virtual/kernel

Executar no HOST - CONTAINER TORADEX
MACHINE=colibri-imx8x DISTRO=tdx-xwayland bitbake -c savedefconfig virtual/kernel


No final do comando uma mensagem será exibida dizendo o local onde foi gerado o defconfig para cópia.

CONTAINER QEMU
Saving defconfig to:
/home/b2open/treinamento/yp/poky/build-qemu/tmp/work/qemux86_64-poky-linux/linux-yocto/6.6.123+git/build/defconfig

CONTAINER TORADEX
Saving defconfig to:
/home/b2open/treinamento/yp/oe-core/build/tmp/work/colibri_imx8x-tdx-linux/linux-toradex/6.6.94+git/build/defconfig


Antes de copiar o arquivo abra ele ou visualize no terminal e confirme se CONFIG_TOUCHSCREEN_GOODIX=m está presente no arquivo.

Em seguida copiar o defconfig para meta-treinamento/recipes-kernel/linux/linux-toradex:

Executar no HOST - CONTAINER QEMU
cp /home/b2open/treinamento/yp/poky/build-qemu/tmp/work/qemux86_64-poky-linux/linux-yocto/6.6.123+git/build/defconfig ~/treinamento/yp/poky/meta-treinamento/recipes-kernel/linux/linux-toradex/


Executar no HOST - CONTAINER TORADEX
cp /home/b2open/treinamento/yp/oe-core/build/tmp/work/colibri_imx8x-tdx-linux/linux-toradex/6.6.94+git/build/defconfig ~/treinamento/yp/oe-core/layers/meta-treinamento/recipes-kernel/linux/linux-toradex/


E adicionar a configuração abaixo em linux-toradex_6.6-2.2.x.bbappend.

1
2
3
FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"

SRC_URI += "file://defconfig "

Acima está adicionando o diretório linux-toradex(Variável PN) do diretório atual da camada (Variável THISDIR) e informando para utilizar o defconfig desta camada para o kernel.


Estrutura final da customização da receita do kernel:

Executar no HOST
tree ../meta-treinamento/recipes-kernel/

Resultado:

Executar no HOST - CONTAINER QEMU
1
2
3
4
5
6
7
../meta-treinamento/recipes-kernel/
└── linux
    ├── linux-yocto
       └── defconfig
    └── linux-yocto_6.6%.bbappend

2 directories, 2 files            


Executar no HOST - CONTAINER TORADEX
1
2
3
4
5
6
7
../meta-treinamento/recipes-kernel/
└── linux
    ├── linux-toradex
           └── defconfig
        └── linux-toradex_6.6-2.2.x.bbappend

2 directories, 2 files            


Outra opção importante é não gerar o defconfig completo, mas somente uma configuração parcial com a modificação realizada e gerar o arquivo de fragmento(.cfg).

Novamente execute o comando -c cleansstate na receita do kernel:

Executar no HOST - CONTAINER QEMU
bitbake -c cleansstate virtual/kernel 

Executar no HOST - CONTAINER TORADEX
MACHINE=colibri-imx8x DISTRO=tdx-xwayland bitbake -c cleansstate virtual/kernel 


Executar novamente o bitbake da receita do kernel com a opção -c menuconfig e selecionar a opção B.A.T.M.A.N. em:

Networking Support -> Network Options -> B.A.T.M.A.N. Advanced Meshing Protocol marcar a opção como módulo(M), clicar em Save e Exit.


O próximo passo é o comando para gerar apenas o fragmento desta modificação utilizando -c diffconfig:

Executar no HOST - CONTAINER QEMU
bitbake -c diffconfig virtual/kernel 

Executar no HOST - CONTAINER TORADEX
MACHINE=colibri-imx8x DISTRO=tdx-xwayland bitbake -c diffconfig virtual/kernel 


No final deste comando irá mostrar o caminho que o fragmento foi gerado.

CONTAINER QEMU
Config fragment has been dumped into:
 /home/b2open/treinamento/yp/poky/build-qemu/tmp/work/qemux86_64-poky-linux/linux-yocto/6.6.123+git/fragment.cfg

CONTAINER TORADEX
Config fragment has been dumped into:
 /home/b2open/treinamento/yp/oe-core/build/tmp/work/colibri_imx8x-tdx-linux/linux-toradex/6.6.94+git/fragment.cfg


O próximo passo é copiar o fragment.cfg, renomear para o nome que identifica a configuração, exemplo batman_adv.cfg e copiar junto ao diretório do defconfig.

Executar no HOST - CONTAINER QEMU
cp /home/b2open/treinamento/yp/poky/build-qemu/tmp/work/qemux86_64-poky-linux/linux-yocto/6.6.123+git/fragment.cfg ~/treinamento/yp/poky/meta-treinamento/recipes-kernel/linux/linux-toradex/batman_adv.cfg

Executar no HOST - CONTAINER TORADEX
cp /home/b2open/treinamento/yp/oe-core/build/tmp/work/colibri_imx8x-tdx-linux/linux-toradex/6.6.94+git/fragment.cfg ~/treinamento/yp/oe-core/layers/meta-treinamento/recipes-kernel/linux/linux-toradex/batman_adv.cfg


Edite o arquivo linux-toradex_6.6-2.2.x.bbappend e adicione o nome do fragmento como abaixo:

1
2
3
4
5
6
FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"

SRC_URI += " \
           file://defconfig \
           file://batman_adv.cfg \
           "


Criando Patch e aplicando Patches

Existem diversas formas de se criar patches do kernel ou qualquer software, acessando o diretório de trabalho (WORKDIR) e depois o diretório git e modificar o arquivo ou executar o kernel com a opção -c devshell.

Executando com opção -c devshell:

Executar no HOST - CONTAINER QEMU
bitbake -c devshell virtual/kernel

Executar no HOST - CONTAINER TORADEX
MACHINE=colibri-imx8x DISTRO=tdx-xwayland bitbake -c devshell virtual/kernel


Como exemplo, edite o arquivo init/calibrate.c onde será adicionada uma mensagem que será exibida durante a inicialização, ao abrir o arquivo procure pela função void calibrate_delay(void) e adicione o código abaixo:

    void calibrate_delay(void)
{
       unsigned long lpj;
       static bool printed;
       int this_cpu = smp_processor_id();

       pr_info("*********************************\n");
       pr_info("*             `(°v°)´           *\n");
       pr_info("*********************************\n");

       if (per_cpu(cpu_loops_per_jiffy, this_cpu)) {
    ...
    ...


Salve o arquivo, execute o comando git status para verificar o estado atual.

Executar no HOST
git status

Saída esperada:

CONTAINER TORADEX
On branch toradex_6.6-2.2.x-imx
Your branch is behind 'origin/toradex_6.6-2.2.x-imx' by 1 commit, and can be fast-forwarded.
(use "git pull" to update your local branch)

Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified:   init/calibrate.c

no changes added to commit (use "git add" and/or "git commit -a")


Executar no HOST
git diff

Saída esperada:

diff --git a/init/calibrate.c b/init/calibrate.c
index f3831272f113..3fc2adb7779a 100644
--- a/init/calibrate.c
+++ b/init/calibrate.c
@@ -278,6 +278,10 @@ void calibrate_delay(void)
        static bool printed;
        int this_cpu = smp_processor_id();

+        pr_info("*********************************\n");
+        pr_info("*             `(°v°)´           *\n");
+        pr_info("*********************************\n");

         if (per_cpu(cpu_loops_per_jiffy, this_cpu)) {
                 lpj = per_cpu(cpu_loops_per_jiffy, this_cpu);
                 if (!printed)


Faça git add do arquivo modificado, depois git commit e adicione um comentário e para gerar o patch execute git format-patch -1.

Executar no HOST
git add init/calibrate.c

git commit -m "Add Print Msg"

git format-patch -1

Saída esperada:

0001-Add-Print-Msg.patch


Em seguida, copiar o arquivo de patch gerado 0001-Add-Print-Msg.patch para o diretório junto ao defconfig e o fragmento .cfg, e adicionar o patch no arquivo .bbappend do kernel:

Executar no HOST - CONTAINER QEMU
cp 0001-Add-Print-Msg.patch ~/treinamento/yp/poky/meta-treinamento/recipes-kernel/linux/linux-toradex/

exit


Executar no HOST - CONTAINER TORADEX
cp 0001-Add-Print-Msg.patch ~/treinamento/yp/oe-core/layers/meta-treinamento/recipes-kernel/linux/linux-toradex/

exit



Editar o arquivo da receita do kernel e adicionar o patch criado.

Executar no HOST - CONTAINER QEMU
cd ~/treinamento/yp/poky/meta-treinamento/recipes-kernel/linux
Executar no HOST - CONTAINER TORADEX
cd ~/treinamento/yp/oe-core/layers/meta-treinamento/recipes-kernel/linux


Executar no HOST
FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"

SRC_URI += " \
            file://0001-Add-Print-Msg.patch \
            file://defconfig \
            file://batman_adv.cfg \
            "


Retorno ao diretorio de build e execute o comando para gerar a nova imagem com as alterações no kernel.

Compile o Kernel, na sequência gera a nova imagem b2open-core-image, analise as configurações e customizações após gravação e realizar boot no hardware.

Executar no HOST - CONTAINER QEMU
cd 
bitbake b2open-core-image

Executar no HOST - CONTAINER TORADEX
cd 
MACHINE=colibri-imx8x DISTRO=tdx-xwayland bitbake b2open-core-image


Visualizando as tarefas disponíveis do Kernel

Executar no HOST - CONTAINER QEMU
bitbake -c listtasks virtual/kernel


Executar no HOST - CONTAINER TORADEX
MACHINE=colibri-imx8x DISTRO=tdx-xwayland bitbake -c listtasks virtual/kernel