Yocto boot2qt para Raspberry Pi 4, tanto Qt 5.15 como 6.2

 C Programming >> Programación C >  >> Tags >> Qt
Yocto boot2qt para Raspberry Pi 4, tanto Qt 5.15 como 6.2

En esta guía, construiremos una distribución de Linux para Raspberry Pi 4, usando el proyecto Yocto y el boot2qt pila proporcionada por Qt. Este boot2qt La imagen se puede escribir en una tarjeta SD y, cuando se inicia, Raspberry Pi ejecuta una pila de software que se integra muy bien con Qt Creator (Qt IDE), por ejemplo, implementación con un solo clic en el dispositivo. Puede ejecutar su propia aplicación Qt en la Pi, pantalla completa, se iniciará directamente. Esta guía cubre tanto Qt 5.15 como Qt 6.2. El proceso de compilación 5.15 es un poco complicado debido a algunos problemas anteriores. La guía también cubre el cambio de la aplicación de inicio predeterminada a su propia aplicación y la integración de Qt Creator.

Terminamos con un boot2qt imagen para Raspberry Pi 4. Tengo un modelo de 8 GBaquí, pero funciona igual de bien con menos RAM. Esta guía también cubre el kit QtCreator y la configuración posterior del dispositivo.

Aquí hay un video de boot2qt arrancando directamente en mi aplicación Qt personalizada:

Si un paso es para una versión específica de Qt, eso se menciona. De lo contrario, el paso se aplica a ambas versiones.

Esta guía es para Raspberry Pi 4 pero debería funcionar para cualquiera de los otros modelos de Raspberry Pi compatibles con Qt. Reemplace el MACHINE variable más adelante con un modelo diferente.

Qué es yocto, qué es boot2qt

Hay mucho terreno por cubrir, si no está familiarizado con el proyecto Yocto, aquí hay una forma rápida y simplificada , resumen de todos los términos.

Yocto es un proyecto de código abierto que proporciona un marco de construcción y metadatos para ayudar a crear una imagen personalizada para su tablero de destino. Yocto utiliza las llamadas (meta) capas y recetas. Las recetas son .bb (para bitbake) los archivos que contienen instrucciones de construcción y capas son una colección de recetas, clases y archivos de configuración específicos. Podrías tener una capa llamada meta-raspberry (todas las capas, por convención, comienzan con meta- ) que tiene recetas aplicables solo para Raspberry Pi.

Yocto te ayuda a construir una distribución de Linux, su distribución de referencia se llama poky . La herramienta de compilación principal es una herramienta de línea de comandos de Python llamada bitbake .Analiza todas las recetas y luego, una por una, reúne el código fuente y compila todo el software, luego lo empaqueta en una imagen para su tablero.

Yocto está dirigido a dispositivos linux integrados, en el trabajo lo usamos para crear nuestra propia distribución de Linux (no boot2qt) para ejecutar en las máquinas de café. Se admiten muchas placas diferentes, la mayoría de los proveedores proporcionan el llamado paquete de soporte de placa (bsp). A menudo, esto contiene un núcleo y controladores para su placa. Hay un paquete de soporte de placa para Raspberry Pi, que usaremos.

boot2qt es un conjunto de capas para Yocto que crea un sistema Linux simple que se inicia sin un escritorio, directamente en una aplicación Qt. También crea un SDK de compilación cruzada para su escritorio, que puede usar en Qt Creator para compilar de forma cruzada su aplicación para el dispositivo de destino. A menudo, el dispositivo para el que desarrolla no tiene la misma arquitectura de CPU que su estación de trabajo de escritorio. Para complementar todo esto, también se integra en Qt Creator, lo que le permite implementar y ejecutar su aplicación con un solo clic, a través de la red, en su dispositivo.

Las tres partes le ahorran una gran cantidad de trabajo. Debido a que tenemos nuestro propio yoctobuild, sé qué tipo de trabajo implica, la pila boot2qt ahorra mucho tiempo, siempre que su placa sea compatible. Puede ver la lista de placas aquí Qt 5.15 y aquí para Qt 6.2.

boot2qt también proporciona un conjunto de scripts para hacer el yocto la configuración es muy fácil, por lo que el proceso que ve en esta guía no es el mismo que un yocto predeterminado configuración. Es específicamente para boot2qt y para Raspberry Pi 4.

Para resumir, boot2qt proporciona una capa en la parte superior de yocto que agrega integración entre su dispositivo Linux integrado y el conjunto de herramientas Qt, ahorrando una gran cantidad de tiempo en el trabajo manual.

Host de desarrollo

La máquina que va a construir tu boot2qt image (el host que ejecuta bitbake ) necesita algunos paquetes antes de que podamos comenzar a construir. Necesita al menos 50 GB de espacio libre, pero mi host tiene 300 GB. La compilación cruzada de todos los paquetes requiere una gran cantidad de tiempo, por lo que cuantos más núcleos y RAM tenga, mejor. Mi máquina de compilación de prueba tiene 4 núcleos y 8 GB de RAM, la compilación completa de la imagen tomó 3 días completos. En el trabajo tenemos algunos servidores robustos, allí la construcción toma alrededor de 2 horas. Yocto admite compilaciones incrementales, por lo que si cambia una receta, solo se debe reconstruir esa parte, no todas las demás.

Mi máquina de compilación ejecuta Ubuntu 20.04 para la compilación Qt 5.15 y Debian 11 para la compilación Qt 6. Instale primero los paquetes necesarios:

apt-get install gawk wget git diffstat unzip texinfo gcc build-essential
chrpath socat cpio python3 python3-pip python3-pexpect xz-utils
debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa
libsdl1.2-dev pylint3 xterm python3-subunit mesa-common-dev python
git-lfs g++-multilib gcc-multilib libxkbcommon-dev
libxkbcommon-x11-dev libwayland-cursor++0 libwayland-cursor0

Estos son un poco más paquetes de los que recomienda el sitio de Qt, tuve problemas de compilación al compilar el qbsp capa, que es de donde provienen la mayoría de los paquetes adicionales.

A continuación, necesita repo , una herramienta de gestión de git de Google. Oculta la mayor parte de la complejidad de los submódulos y diferentes repositorios al colocar toda esa información adicional en un archivo de manifiesto. Puedes instalarlo usando apt:

apt install repo

Si no está en el repositorio, consulte las instrucciones, el proceso de instalación es solo una copia simple de un ejecutable.

Cree una carpeta donde residirá todo yocto:

mkdir b2qt
cd b2qt

Usa el repo herramienta para clonar todos los repositorios git del proyecto Yocto y boot2qt En seguida. Primero inicialice para la versión correcta de Qt:

# for Qt 6.2:
repo init -u git://code.qt.io/yocto/boot2qt-manifest -m v6.2.3.xml

# for Qt 5.15
repo init -u git://code.qt.io/yocto/boot2qt-manifest -m v5.15.2.xml

Luego sincroniza los repositorios:

repo sync

Debe indicar para qué placa desea crear y luego obtener el script de origen:

export MACHINE=raspberrypi4 && source ./setup-environment.sh 

Este paso debe repetirse en cada inicio de sesión .

Salida:

### Shell environment set up for builds. ###

You can now run 'bitbake <target>'

Common targets are:
b2qt-embedded-qt6-image
meta-toolchain-b2qt-embedded-qt6-sdk

QBSP target is:
meta-b2qt-embedded-qbsp

For creating toolchain or QBSP for Windows, set environment variable before running bitbake:
SDKMACHINE=x86_64-mingw32

For more information about Boot to Qt, see https://doc.qt.io/QtForDeviceCreation/

Ahora debería estar en una carpeta llamada build-raspberrypi4 . Usando el repo herramienta y obtener este script ha creado una estructura de carpetas ingeniosa para yocto:

  • build-$boardname :directorio de compilación para la placa, se encuentra en esta carpeta después de obtener el setup-environment.sh archivo.
  • sources :tiene todos los bitbake capas y recetas
  • download :carpeta donde se descarga todo el código fuente (git repo's, archivos tar.gz)

En el build-* directorio hay un conf carpeta, que tiene dos archivos importantes. bblayers.conf y local.conf . Tuve problemas con el oom-killer mientras construye la imagen, el do_compile de qtwebengine siguió chocando (matado). Tuve que establecer las siguientes variables en 1 , para hacer el buildpass:

# Default to setting automatically based on cpu count
BB_NUMBER_THREADS ?= "1"
# 
# Default to setting automatically based on cpu count
PARALLEL_MAKE ?= "-j1"

Esto probablemente se deba a mi hardware limitado para la máquina de compilación, pero si experimenta problemas de pérdida de memoria durante una compilación, ya sabe dónde buscar.

Ya está todo listo. Te recomiendo que inicies un screen o tmux sesión ya que la compilación llevará mucho tiempo.

Construyendo boot2qt

Para Qt 6 el siguiente paso se ejecuta sin problemas, para Qt 5 debes hacer algún parcheo manual. Los parches que tuve que hacer están al final de este artículo. Si pagas por Qt 5.15 LTS entonces no tienes problemas. La última versión de Qt 5 de código abierto en este momento es 5.15.2 y la versión comercial es 5.15.8, en la versión comercial estos problemas se solucionan, en la versión de código abierto tenemos que editar algunas recetas nosotros mismos y descargar firmware más nuevo.

El siguiente comando construye el boot2qt completo imagen (y todos los paquetes) que puede flashear en una tarjeta SD:

# for Qt 6
bitbake b2qt-embedded-qt6-image

# for Qt 5
bitbake b2qt-embedded-qt5-image

El proceso de compilación lleva mucho tiempo porque compila todo el código fuente. La salida es como la siguiente para Qt 5:

    remy@host:~/b2qt/build-raspberrypi4$ bitbake b2qt-embedded-qt5-image                                                           
    WARNING: Host distribution "ubuntu-20.04" has not been validated with this version of the build system; you may possibly experience unexpected failures. It is recommended that you use a tested distribution.
    Loading cache: 100% |#################################################################################################| Time: 0:00:00
    Loaded 4132 entries from dependency cache.
    Parsing recipes: 100% |###############################################################################################| Time: 0:00:00
    Parsing of 2779 .bb files complete (2778 cached, 1 parsed). 4132 targets, 299 skipped, 1 masked, 0 errors.
    NOTE: Resolving any missing task queue dependencies

    Build Configuration:
    BB_VERSION           = "1.44.0"
    BUILD_SYS            = "x86_64-linux"
    NATIVELSBSTRING      = "universal"
    TARGET_SYS           = "arm-poky-linux-gnueabi"
    MACHINE              = "raspberrypi4"
    DISTRO               = "b2qt"
    DISTRO_VERSION       = "3.0.4"
    TUNE_FEATURES        = "arm vfp cortexa7 neon vfpv4 thumb callconvention-hard"
    TARGET_FPU           = "hard"
    SDKMACHINE           = "x86_64"
    meta                 
    meta-poky            = "HEAD:f2eb22a8783f1eecf99bd4042695bab920eed00e"
    meta-raspberrypi     = "HEAD:0e05098853eea77032bff9cf81955679edd2f35d"
    meta-oe              
    meta-python          
    meta-networking      
    meta-initramfs       
    meta-multimedia      = "HEAD:2b5dd1eb81cd08bc065bc76125f2856e9383e98b"
    meta-python2         = "HEAD:4400f9155ec193d028208cf0c66aeed2ba2b00ab"
    meta-boot2qt         
    meta-boot2qt-distro  = "HEAD:5f23cb2d6836bbad3a1fa982089ccf20bf0c6245"
    meta-mingw           = "HEAD:756963cc28ebc163df7d7f4b4ee004c18d3d3260"
    meta-qt5             = "HEAD:72459ce0639eb3ce408558a7abede945e1f8ddc9"

    Initialising tasks: 100% |############################################################################################| Time: 0:00:05
    Sstate summary: Wanted 513 Found 295 Missed 218 Current 1721 (57% match, 90% complete)
    NOTE: Executing Tasks
    NOTE: Setscene tasks completed
    Currently  5 running tasks (4391 of 6968)  63% |####################################################                                |
    0: qtquickcontrols2-5.15.2+gitAUTOINC+16f27dfa35-r0 do_compile - 9m41s (pid 4102272)
    1: qtmultimedia-5.15.2+gitAUTOINC+fd30913d46-r0 do_compile - 9m33s (pid 4104096)
    2: qtlocation-5.15.2+gitAUTOINC+02a21217a9_d3101bbc22-r0 do_compile - 8m16s (pid 4107720)
    3: qtconnectivity-5.15.2+gitAUTOINC+ca6cc606d9-r0 do_compile - 6m51s (pid 4110585)
    4: qtwayland-5.15.2+gitAUTOINC+3cc17177b1-r0 do_compile - 6m20s (pid 4111432)

En la parte inferior de la salida, verá diferentes tareas ejecutándose, podría ser un do_fetch (descargue la fuente), do_compile (compilar el código de forma cruzada) o un do_package (hacer un paquete), o algunos otros do_* pasos.

Ves que hay casi 7000 tareas, por lo que, nuevamente, tomará mucho tiempo. Compruébelo regularmente, porque los cambios son que su compilación falla. Los mensajes de error de Yocto son claros, incluidos los archivos de registro.

Para Qt 6.2, el resultado es el siguiente:

remy@host:~/b2qt/build-raspberrypi4$ bitbake b2qt-embedded-qt6-image
WARNING: Host distribution "debian-11" has not been validated with this version of the build system; you may possibly experience unex
pected failures. It is recommended that you use a tested distribution.
Loading cache: 100% |#################################################################################################| Time: 0:00:00
Loaded 4368 entries from dependency cache.
NOTE: Resolving any missing task queue dependencies

Build Configuration:
BB_VERSION           = "1.50.0"
BUILD_SYS            = "x86_64-linux"
NATIVELSBSTRING      = "universal"
TARGET_SYS           = "arm-poky-linux-gnueabi"
MACHINE              = "raspberrypi4"
DISTRO               = "b2qt"
DISTRO_VERSION       = "3.3.4"
TUNE_FEATURES        = "arm vfp cortexa7 neon vfpv4 thumb callconvention-hard"
TARGET_FPU           = "hard"
SDKMACHINE           = "x86_64"
meta                 
meta-poky            = "HEAD:c40ac16d79026169639f47be76a3f7b9d8b5178e"
meta-raspberrypi     = "HEAD:b4ec97e4eb8e36efd1f7e2f8ae020a9e55cfc239"
meta-oe              
meta-python          
meta-networking      
meta-initramfs       
meta-multimedia      = "HEAD:f72a73b42fa740130b388ba8555cdbefdee8d37d"
meta-python2         = "HEAD:810d6d842f103eb59f18b06426106462b15de7e2"
meta-boot2qt         
meta-boot2qt-distro  = "HEAD:e59a2e20697e0afc2a0b068835cd90e102dec589"
meta-mingw           = "HEAD:422b96cb2b6116442be1f40dfb5bd77447d1219e"
meta-qt6             = "HEAD:eb3719266fc03b96d5056980b135b371f31811f4"
meta-raymii          = "master:0789f30e221712462748cf56b9afddeec3613be1"

Initialising tasks: 100% |############################################################################################| Time: 0:00:09
Sstate summary: Wanted 482 Local 356 Network 0 Missed 126 Current 2730 (73% match, 96% complete)
NOTE: Executing Tasks
Currently  4 running tasks (4425 of 9263)  47% |########################################                                            |
0: qtwebengine-6.2.3-r0 do_compile (pid 527778)   0% |                                                                              |
1: qtwayland-6.2.3-r0 do_install_ptest_base - 1m2s (pid 527854)
2: qtdeclarative-6.2.3-r0 do_package_write_ipk - 1m0s (pid 527980)
3: qtmultimedia-6.2.3-r0 do_package_write_ipk - 30s (pid 529522)

Aún más tareas, ¡son más de 9000!.

Como se indicó en la introducción, tuve problemas para compilar Qt WebEngine, que se resolvieron usando menos núcleos simultáneos. Para Qt 5.15.2 hubo más problemas, pero esas correcciones se encuentran más abajo en esta página. Cuando todo esté construido, continúe con el siguiente párrafo que muestra la imagen.

Mostrar la imagen de Yocto

Una vez que se completa la compilación de Yocto, debe tener un archivo de imagen que puede flashear en una tarjeta SD para iniciar la Raspberry Pi. Yocto genera muchos más archivos, paquetes para cada pieza individual de software, archivos de soporte como árboles de dispositivos y algunos otros archivos, por el momento solo estamos interesados ​​en el archivo de imagen.

Los dos diferentes boot2qt Las versiones (Qt 5 y Qt 6) crean un archivo de imagen diferente. Qt 5 tiene una imagen que puede simplemente dd a una tarjeta SD y arranque, Qt 6 tiene un bmap expediente. bmap es un formato especial que debería ser más rápido para flashear y verifica los datos durante flash, creado inicialmente por Intel para su proyecto Tizen.

Para Qt 5 obtienes lo siguiente, en el b2qt/build-raspberrypi4/tmp/deploy/images/raspberrypi4 carpeta:

ls -larSh tmp/deploy/images/raspberrypi4/ # ls sorted by size

Salida:

-rw-r--r-- 2 remy remy  40K Feb 15 15:22 bcm2711-rpi-4-b-1-4.19.93+git0+3fdcc814c5-r0-raspberrypi4-20220215123308.dtb
drwxr-xr-x 3 remy remy  52K Feb 17 06:14 .
-rw-r--r-- 1 remy remy 193K Feb 17 06:09 b2qt-embedded-qt5-image-raspberrypi4-20220217055709.rootfs.manifest
-rw-r--r-- 1 remy remy 335K Feb 17 06:09 b2qt-embedded-qt5-image-raspberrypi4-20220217055709.testdata.json
-rw-r--r-- 2 remy remy 5.7M Feb 15 15:21 zImage-1-4.19.93+git0+3fdcc814c5-r0-raspberrypi4-20220215123308.bin
-rw-rw-r-- 2 remy remy  19M Feb 15 15:22 modules-1-4.19.93+git0+3fdcc814c5-r0-raspberrypi4-20220215123308.tgz
-rw-r--r-- 1 remy remy 322M Feb 17 06:13 b2qt-embedded-qt5-image-raspberrypi4-20220217055709.7z
-rw-r--r-- 1 remy remy 488M Feb 17 06:10 b2qt-embedded-qt5-image-raspberrypi4-20220217055709.rootfs.tar.bz2
-rw-r--r-- 1 remy remy 1.7G Feb 17 06:10 b2qt-embedded-qt5-image-raspberrypi4-20220217055709.rootfs.ext3
-rw-r--r-- 1 remy remy 1.8G Feb 17 06:10 b2qt-embedded-qt5-image-raspberrypi4-20220217055709.rootfs.rpi-sdimg

El último archivo, el *-sdimg archivo, puede ser flasheado a su tarjeta SD usando dd :

dd if=b2qt-embedded-qt5-image-raspberrypi4-20220217055709.rootfs.rpi-sdimg of=/dev/sdX bs=4M conv=fsync 

Estoy usando un lector de tarjetas SD externo, si tiene un lector incorporado, probablemente debería usar of=/dev/mmcblk0 como dispositivo de salida, no /dev/sdX . Tenga en cuenta que el archivo de imagen tiene una fecha, y debe reemplazar el nombre de archivo en mi ejemplo por su nombre de archivo de salida de compilación.

Para Qt 6 tienes un bmap archivo de imagen archivo:

-rw-r--r-- 2 remy remy  29K Feb 15 18:03 bcm2710-rpi-3-b-plus-1-5.10.31+git0+a19886b00e_89399e6e7e-r0-raspberrypi4-20220215145419.dtb
-rw-r--r-- 2 remy remy  35K Feb 15 18:03 sx150x-1-5.10.31+git0+a19886b00e_89399e6e7e-r0-raspberrypi4-20220215145419.dtbo
-rw-r--r-- 2 remy remy  49K Feb 15 18:03 bcm2711-rpi-400-1-5.10.31+git0+a19886b00e_89399e6e7e-r0-raspberrypi4-20220215145419.dtb
-rw-r--r-- 2 remy remy  49K Feb 15 18:03 bcm2711-rpi-4-b-1-5.10.31+git0+a19886b00e_89399e6e7e-r0-raspberrypi4-20220215145419.dtb
-rw-r--r-- 2 remy remy  49K Feb 15 18:03 bcm2711-rpi-cm4-1-5.10.31+git0+a19886b00e_89399e6e7e-r0-raspberrypi4-20220215145419.dtb
drwxr-xr-x 3 remy remy  60K Feb 16 22:57 .
-rw-r--r-- 1 remy remy 216K Feb 16 22:53 b2qt-embedded-qt6-image-raspberrypi4-20220216200033.rootfs.manifest
-rw-r--r-- 1 remy remy 346K Feb 16 22:53 b2qt-embedded-qt6-image-raspberrypi4-20220216200033.testdata.json
-rw-r--r-- 2 remy remy 7.1M Feb 15 18:03 zImage-1-5.10.31+git0+a19886b00e_89399e6e7e-r0-raspberrypi4-20220215145419.bin
-rw-r--r-- 2 remy remy  19M Feb 15 18:03 modules-1-5.10.31+git0+a19886b00e_89399e6e7e-r0-raspberrypi4-20220215145419.tgz
-rw-r--r-- 1 remy remy 374M Feb 16 22:57 b2qt-embedded-qt6-image-raspberrypi4-20220216200033.7z
-rw-r--r-- 1 remy remy 374M Feb 16 22:57 b2qt-embedded-qt6-image-raspberrypi4-20220216200033.rootfs.wic.xz
-rw-r--r-- 1 remy remy 579M Feb 16 22:53 b2qt-embedded-qt6-image-raspberrypi4-20220216200033.rootfs.tar.bz2
-rw-r--r-- 1 remy remy 596M Feb 16 22:54 b2qt-embedded-qt6-image-raspberrypi4-20220216200033.rootfs.wic.bz2
-rw-r--r-- 1 remy remy 2.0G Feb 16 22:54 b2qt-embedded-qt6-image-raspberrypi4-20220216200033.rootfs.ext3

Si ejecuta Ubuntu, debe instalar el bmap-tools paquete y use el siguiente comando para mostrar la imagen en la tarjeta SD:

$ sudo bmaptool copy b2qt-embedded-qt6-image-raspberrypi4.wic.bz2 --bmap b2qt-embedded-qt6-image-raspberrypi4.wic.bmap /dev/sda
bmaptool: info: block map format version 2.0
bmaptool: info: 687923 blocks of size 4096 (2.6 GiB), mapped 374929 blocks (1.4 GiB or 54.5%)
bmaptool: info: copying image 'b2qt-embedded-qt6-image-raspberrypi4.wic.bz2' to block device '/dev/sda' using bmap file 'b2qt-embedded-qt6-image-raspberrypi4.wic.bmap'

Si no tienes el bmap paquete, simplemente extraiga el *.rootfs.wic.bz2 archivo y use dd para escribirlo en su tarjeta SD. Tarda un poco más y carece de validación de los datos escritos, pero funciona igual de bien.

Una vez escrito en la tarjeta SD, introdúzcalo en su Raspberry Pi y arranque. Después de una breve secuencia de inicio, debería recibir una agradable pantalla Boot 2 Qt.

En el caso de Qt 6 la dirección IP se imprime en pantalla. Puede SSH a esa IP con el nombre de usuario root y sin contraseña. Si todo salió bien, debería recibir un aviso de shell. Si es así, continúe con la integración de Qt Creator. En el caso de Qt 5, puede ejecutar algunas aplicaciones de demostración de inmediato.

Integración con Qt Creator

Una gran ventaja de boot2qt es la integración con otras herramientas de Qt, como IDE Qt Creator.

Qt Creator tiene el concepto de Kits, que básicamente es una configuración de compilador. Puede tener varias versiones de Qt o GCC (o CLANG) instaladas, y dentro de un kit le dice a Qt Creator qué versiones específicas usar. Dispongo de kits específicos para Qt 5.15, tanto para Android como para linux de escritorio y para Qt 6.2. También tengo instalado un kit de compilador cruzado que me permite compilar para Raspberry Pi desde mi escritorio x86.

Yocto puede crear un SDK nativo, que tiene todas las herramientas de compilación necesarias para su entorno específico. boot2qt amplía esto, también incluye todo el Qtstack en el SDK de compilación cruzada y algunos scripts auxiliares.

Los pasos para integrar su dispositivo en Qt Creator son:

  • Cree el SDK de compilación cruzada
  • Instalar el SDK de compilación cruzada
  • Agregue el SDK como un kit a Qt Creator
  • Clonar ese kit y configurarlo correctamente
  • Agregue un dispositivo remoto (su Pi)
  • Actualice el kit para implementarlo en el dispositivo
  • Agrega el kit a tu proyecto

Muchas partes móviles, pero una vez que lo tiene todo configurado y en funcionamiento, es pan comido. El creador de Qt realiza una compilación cruzada de su aplicación y la copia directamente en su dispositivo, sin tareas manuales.

Creación del SDK de compilación cruzada

Debe crear el SDK antes de poder usarlo, no se crea automáticamente cuando crea la imagen de arranque. Asegúrate de estar en el b2qt carpeta y he configurado el entorno:

export MACHINE=raspberrypi4 && source ./setup-environment.sh 

Ejecute el comando bitbake para compilar el SDK:

bitbake meta-toolchain-b2qt-embedded-qt6-sdk

La compilación puede demorar algunas horas, según las especificaciones de su máquina host. No tanto como construir la imagen completa, pero aún así bastante tiempo. La salida se parece mucho a la salida anterior que vio al crear la imagen:

remy@host:~/b2qt/build-raspberrypi4$ bitbake meta-toolchain-b2qt-embedded-qt6-sdk
WARNING: Host distribution "debian-11" has not been validated with this version of the build system; you may possibly experience unexpected failures. It is recommended that you use a tested distribution.
Loading cache: 100% |#################################################################################################| Time: 0:00:00
Loaded 4368 entries from dependency cache.
NOTE: Resolving any missing task queue dependencies

Build Configuration:
BB_VERSION           = "1.50.0"
BUILD_SYS            = "x86_64-linux"
NATIVELSBSTRING      = "universal"
TARGET_SYS           = "arm-poky-linux-gnueabi"
MACHINE              = "raspberrypi4"
DISTRO               = "b2qt"
DISTRO_VERSION       = "3.3.4"
TUNE_FEATURES        = "arm vfp cortexa7 neon vfpv4 thumb callconvention-hard"
TARGET_FPU           = "hard"
SDKMACHINE           = "x86_64"
meta                 
meta-poky            = "HEAD:c40ac16d79026169639f47be76a3f7b9d8b5178e"
meta-raspberrypi     = "HEAD:b4ec97e4eb8e36efd1f7e2f8ae020a9e55cfc239"
meta-oe              
meta-python          
meta-networking      
meta-initramfs       
meta-multimedia      = "HEAD:f72a73b42fa740130b388ba8555cdbefdee8d37d"
meta-python2         = "HEAD:810d6d842f103eb59f18b06426106462b15de7e2"
meta-boot2qt         
meta-boot2qt-distro  = "HEAD:e59a2e20697e0afc2a0b068835cd90e102dec589"
meta-mingw           = "HEAD:422b96cb2b6116442be1f40dfb5bd77447d1219e"
meta-qt6             = "HEAD:eb3719266fc03b96d5056980b135b371f31811f4"
meta-raymii          = "master:0789f30e221712462748cf56b9afddeec3613be1"


Initialising tasks: 100% |############################################################################################| Time: 0:00:10
Sstate summary: Wanted 1340 Local 292 Network 0 Missed 1048 Current 2252 (21% match, 70% complete)
NOTE: Executing Tasks
NOTE: Tasks Summary: Attempted 10059 tasks of which 7511 didn't need to be rerun and all succeeded.
NOTE: Build completion summary:
NOTE:   do_populate_sysroot: 0.0% sstate reuse(0 setscene, 146 scratch)
NOTE:   do_deploy_source_date_epoch: 0.0% sstate reuse(0 setscene, 146 scratch)
NOTE:   do_package_qa: 0.0% sstate reuse(0 setscene, 150 scratch)
NOTE:   do_package: 0.0% sstate reuse(0 setscene, 150 scratch)
NOTE:   do_packagedata: 0.0% sstate reuse(0 setscene, 150 scratch)
NOTE:   do_package_write_ipk: 2.0% sstate reuse(3 setscene, 150 scratch)
NOTE:   do_populate_lic: 0.0% sstate reuse(0 setscene, 154 scratch)

Una vez que finaliza la compilación, tiene un script de shell instalable en el tmp/deploy/sdk carpeta:

remy@host:~/b2qt/build-raspberrypi4$ ls tmp/deploy/sdk/ -larSh
total 1.6G
-rw-r--r-- 1 remy remy    0 Feb 18 15:43 b2qt-x86_64-meta-toolchain-b2qt-embedded-qt6-sdk-raspberrypi4.host.manifest
-rw-r--r-- 1 remy remy  90K Feb 18 15:42 b2qt-x86_64-meta-toolchain-b2qt-embedded-qt6-sdk-raspberrypi4.target.manifest
-rw-r--r-- 1 remy remy 324K Feb 18 15:42 b2qt-x86_64-meta-toolchain-b2qt-embedded-qt6-sdk-raspberrypi4.testdata.json
-rwxr-xr-x 1 remy remy 1.6G Feb 18 15:58 b2qt-x86_64-meta-toolchain-b2qt-embedded-qt6-sdk-raspberrypi4.sh

Puedes ejecutar el b2qt-x86_64-meta-toolchain-b2qt-embedded-qt6-sdk-raspberrypi4.sh archivo para instalar el SDK en su máquina local:

$ ./b2qt-x86_64-meta-toolchain-b2qt-embedded-qt6-sdk-raspberrypi4.sh 
Boot to Qt for Embedded Linux SDK installer version 3.3.4
=========================================================
Enter target directory for SDK (default: /opt/b2qt/3.3.4): 
You are about to install the SDK to "/opt/b2qt/3.3.4". Proceed [Y/n]? y
[sudo] password for remy: 
Extracting SDK...
done
Setting it up...done
SDK has been successfully set up and is ready to be used.
Each time you wish to use the SDK in a new shell session, you need to source the environment setup script e.g.
 $ . /opt/b2qt/3.3.4/environment-setup-cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi

El comando de compilación para Qt 5 es:

bitbake meta-toolchain-b2qt-embedded-qt5-sdk

La salida es casi idéntica, y una vez que se realiza la compilación, tiene el instalador en la misma carpeta, tmp/deploy/sdk :

remy@host:~/b2qt/build-raspberrypi4$ ls -larSh tmp/deploy/sdk/
total 1.7G
-rw-r--r-- 1 remy remy  59K Feb 19 22:25 b2qt-x86_64-meta-toolchain-b2qt-embedded-qt5-sdk-raspberrypi4.host.manifest
-rw-r--r-- 1 remy remy 199K Feb 19 22:24 b2qt-x86_64-meta-toolchain-b2qt-embedded-qt5-sdk-raspberrypi4.target.manifest
-rw-r--r-- 1 remy remy 303K Feb 19 22:24 b2qt-x86_64-meta-toolchain-b2qt-embedded-qt5-sdk-raspberrypi4.testdata.json
-rwxr-xr-x 1 remy remy 1.7G Feb 19 22:47 b2qt-x86_64-meta-toolchain-b2qt-embedded-qt5-sdk-raspberrypi4.sh

Este script se puede instalar igual que el Qt 6, no hay soluciones ni problemas allí:

$ ./b2qt-x86_64-meta-toolchain-b2qt-embedded-qt5-sdk-raspberrypi4.sh 
Boot to Qt for Embedded Linux SDK installer version 3.0.4
=========================================================
Enter target directory for SDK (default: /opt/b2qt/3.0.4): 
You are about to install the SDK to "/opt/b2qt/3.0.4". Proceed [Y/n]? Y
[sudo] password for remy: 
Extracting SDK...done
Setting it up...done
SDK has been successfully set up and is ready to be used.
Each time you wish to use the SDK in a new shell session, you need to source the environment setup script e.g.
 $ . /opt/b2qt/3.0.4/environment-setup-cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi

Añadiendo el kit en Qt Creator

Configurar kits en Qt Creator es un proceso tedioso, pero boot2qt proporciona un script para hacer esta parte un poco más fácil también. Una vez que haya instalado nativeSDK, puede usar el configure-qtcreator.sh script para agregar un kit. Cierra Qt Creator primero, luego ejecuta el script:

/opt/b2qt/3.3.4/configure-qtcreator.sh --config /opt/b2qt/3.3.4/environment-setup-cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi --qtcreator /mnt/DATADISK/qt2021/Tools/QtCreator/ --name qt6-pi4-template
  • --config :apunta al archivo que el instalador del SDK le indica que obtenga.
  • --qtcreator :apunta a la carpeta en la que está instalado QtCreator. Lo tengo en un disco adicional, mi ruta es diferente
  • --name :el nombre del kit

No puede editar este kit más adelante, por lo tanto, agregué -template al nombre Podemos hacer cambios, pero primero se debe clonar el kit.

Salida:

Configured Qt Creator with new kit: qt6-pi4-template

Inicie Qt Creator, vaya a Preferences , luego Kits . Debería ver el nuevo kit, haga clic en Clone botón:

La configuración más importante para cambiar es el Qt Version . No estoy seguro de por qué no lo detectó, pero para mí decía None . Seleccione la versión correcta de Qt en el menú desplegable. Si no está seguro de cuál usar, cambie al Qt Versions pestaña y comprueba cuál necesitas. Aquí hay una imagen de la configuración que tengo:

Ahora puede configurar este kit para su propio proyecto, pero antes de hacerlo, agregue su Pi (ejecutando el boot2qt imagen) como un dispositivo remoto para implementar.

Agregar un dispositivo remoto

También en la configuración, en Devices . Haga clic en el Add botón. Agrega un Generic Linux Device con la siguiente configuración, pero reemplaza la IP con la IP de tu tablero:

El boot2qt el nombre de usuario de la imagen es root y no hay contraseña. Puede implementar una clave pública, pero no es obligatorio. Una vez que haya agregado su dispositivo, use el botón Probar para asegurarse de que todo funcione.

Vuelva a la configuración del kit y seleccione este dispositivo en Device desplegable.

Después de agregar el dispositivo al kit, puede configurar el kit para su proyecto. Abra su proyecto y haga clic en Project en el menú de la izquierda. Agregue el nuevo kit haciendo clic en él y luego construya su proyecto. La salida de compilación debería mostrar la ruta al SDK de Yocto en lugar de su compilador normal:

15:09:01: Starting: "/opt/b2qt/3.3.4/sysroots/x86_64-pokysdk-linux/usr/bin/make" -j12
/opt/b2qt/3.3.4/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-g++ -mthumb -mfpu=neon-vfpv4 -mfloat-abi=hard -mcpu=cortex-a7 --sysroot=/opt/b2qt/3.3.4/sysroots/cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi -c -pipe -g -std=gnu++1z -Wall -Wextra -D_REENTRANT -fPIC -DQT_QML_DEBUG -DQT_QUICK_LIB -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_QMLMODELS_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -I../dragdropexample -I. -I/opt/b2qt/3.3.4/sysroots/cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi/usr/include/QtQuick -I/opt/b2qt/3.3.4/sysroots/cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi/usr/include/QtOpenGL -I/opt/b2qt/3.3.4/sysroots/cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi/usr/include/QtGui -I/opt/b2qt/3.3.4/sysroots/cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi/usr/include/QtQmlModels -I/opt/b2qt/3.3.4/sysroots/cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi/usr/include/QtQml -I/opt/b2qt/3.3.4/sysroots/cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi/usr/include/QtNetwork -I/opt/b2qt/3.3.4/sysroots/cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi/usr/include/QtCore -I. -I/opt/b2qt/3.3.4/sysroots/cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi/usr/lib/mkspecs/linux-oe-g++ -o main.o ../dragdropexample/main.cpp

Despliegue con un clic

La documentación de Qt enumera una de las opciones bajo el Run paso del kit como Change Default App , pero no tengo esa opción, probablemente porque no instalé el qbsp paquete. Sin embargo, no es un gran problema, ya que podemos simplemente decirle a Qt Creator el comando correcto a mano.

Bajo el Run configuración, marque el Alternate executable on device y cambie la ruta a /usr/bin/appcontroller . Agregue la ruta completa de su aplicación al Command Line Arguments campo de texto, como en la imagen de abajo. La ruta completa a su aplicación aparece en el mismo cuadro de diálogo de configuración:

La próxima vez que implemente, matará cualquier instancia en ejecución de appcontroller e inícielo con su aplicación como argumento de línea de comando, implementando efectivamente su aplicación en el dispositivo.

Cambiar la aplicación de inicio predeterminada de boot2qt en Yocto

Puede cambiar la aplicación predeterminada que se inicia una vez que su sistema se está ejecutando con el siguiente comando:

appcontroller --make-default /path/to/your/app

Lo que hace no es mucho más que crear un enlace simbólico a /usr/bin/b2qt .

Sin embargo, es posible que desee hornear su aplicación en la imagen. Esta es una breve sección rápida para hacer su propia capa y receta e incluir esa receta en la imagen extendiendo la imagen Qt. Lo haremos creando una receta que coloque su archivo binario en el sistema de archivos y lo ubique como enlace simbólico, además de extender la imagen predeterminada.

Si planea enviar imágenes de producción a través de esta guía, recuerde que esta es una imagen de desarrollo, SSH está completamente abierto y queda mucho en la imagen para configurar correctamente. Sumérgete un poco más en Yocto para obtener más información sobre eso.

Comience creando algunas carpetas para su capa, en el b2qt carpeta:

mkdir -p sources/meta-raymii/recipes-myapp/myapp/files/
mkdir -p sources/meta-raymii/conf/
mkdir -p sources/meta-raymii/recipes-qt/images/

Edite el siguiente archivo:

sources/meta-raymii/conf/layer.conf

Coloque los siguientes contenidos:

BBPATH .= ":${LAYERDIR}"

BBFILES += "${LAYERDIR}/recipes*/*/*.bb \
            ${LAYERDIR}/recipes*/*/*.bbappend \
            "
BBFILE_COLLECTIONS += "raymii"
BBFILE_PATTERN_raymii := "^${LAYERDIR}/"
BBFILE_PRIORITY_raymii = "1"

LAYERSERIES_COMPAT_raymii = "thud zeus dunfell gatesgarth hardknott"

A continuación, edite el siguiente archivo, que es la receta de su aplicación:

sources/meta-raymii/recipes-myapp/myapp/myapp_1.0.bb

El formato del nombre de archivo (myapp underscore versionMajor.versionMinor ) es importante. No mezcles el underscore por un dash . Una versión más reciente de su aplicación podría llamarse myapp_1.1.bb , o podría subir el PR="r0" para una versión menor.

Contenido:

DESCRIPTION = "My Custom Qt App"
AUTHOR = "[email protected]"
LICENSE = "CLOSED"
PR = "r0"

SRC_URI =+ "file://myapp \
           "

DEPENDS += "qtbase qtdeclarative qtdeclarative-native"

do_install() {
    install -d ${D}/${bindir}
    install -m 0755 ${WORKDIR}/myapp ${D}/${bindir}/myapp

    lnr ${D}/${bindir}/myapp ${D}/${bindir}/b2qt
}

FILES_${PN} = "${bindir}/myapp \
               ${bindir}/b2qt \
              "

Esta receta copiará su aplicación en el lugar correcto con los permisos correctos y creará un enlace simbólico (lnr ) a /usr/bin/b2qt . El DEPENDS line se asegura de que las piezas Qt relevantes estén instaladas. Con boot2qt ese es el caso, pero si omites esa línea, obtendrás un error de compilación porque Yocto es lo suficientemente inteligente como para escanear el ejecutable de tu programa.

Asegúrese de que la versión de compilación cruzada de su programa en el files carpeta:

remy@host:~/b2qt$ file sources/meta-raymii/recipes-myapp/myapp/files/myapp
sources/meta-raymii/recipes-myapp/myapp/files/myapp: ELF 32-bit LSB
pie executable, ARM, EABI5 version 1 (SYSV), dynamically linked,
interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 3.2.0, BuildID
[sha1]=f313bc93bfc28c7a8af0eb046c0270ab55378502, with debug_info, not
stripped

Agregue la capa a la configuración de compilación de Yocto:

build-raspberrypi4/conf/bblayers.conf

En la parte inferior, no olvides la barra diagonal final (\ ):

BBLAYERS ?= " \
  ${BSPDIR}/sources/poky/meta \
    [...]
  ${BSPDIR}/sources/meta-qt6 \
  ${BSPDIR}/sources/meta-raymii \
  "

El siguiente archivo es un .bbappend que, si tiene el mismo nombre, ruta y versión, como es de esperar, agregará cosas al original. En este caso, extenderemos el b2qt-embedded-qt6-image predeterminado imagen para incluir nuestro myapp receta en la instalación. Esto es lo mismo para Qt 5, simplemente cambie el nombre del archivo en consecuencia. Editar este archivo

sources/meta-raymii/recipes-qt/images/b2qt-embedded-qt6-image.bbappend

Contenido:

SUMMARY = "Add myapp to Qt image"
IMAGE_INSTALL_prepend := "myapp"

Una vez que haya hecho todo lo anterior, reconstruya la imagen (bitbake b2qt-embedded-qt6-image ) y flashéelo en su tarjeta SD. Una vez iniciado, en lugar del valor predeterminado, ahora se iniciará su propio programa.

Si quieres asegurarte de que estás en la imagen correcta, puedes consultar el archivo /etc/build una vez que haya iniciado sesión a través de SSH para ver las capas y las confirmaciones de git utilizadas para construir la imagen:

root@b2qt-raspberrypi4:~# cat /etc/build 
-----------------------
Build Configuration:  |
-----------------------
DISTRO = b2qt
DISTRO_VERSION = 3.3.4
QT_VERSION = 6.2.3
-----------------------
Layer Revisions:      |
-----------------------
meta              = HEAD:c40ac16d79026169639f47be76a3f7b9d8b5178e -- modified
meta-poky         = HEAD:c40ac16d79026169639f47be76a3f7b9d8b5178e -- modified
meta-raspberrypi  = HEAD:b4ec97e4eb8e36efd1f7e2f8ae020a9e55cfc239 
meta-oe           = HEAD:f72a73b42fa740130b388ba8555cdbefdee8d37d 
meta-python       = HEAD:f72a73b42fa740130b388ba8555cdbefdee8d37d 
meta-networking   = HEAD:f72a73b42fa740130b388ba8555cdbefdee8d37d 
meta-initramfs    = HEAD:f72a73b42fa740130b388ba8555cdbefdee8d37d 
meta-multimedia   = HEAD:f72a73b42fa740130b388ba8555cdbefdee8d37d 
meta-python2      = HEAD:810d6d842f103eb59f18b06426106462b15de7e2 
meta-boot2qt      = HEAD:e59a2e20697e0afc2a0b068835cd90e102dec589 
meta-boot2qt-distro = HEAD:e59a2e20697e0afc2a0b068835cd90e102dec589 
meta-mingw        = HEAD:422b96cb2b6116442be1f40dfb5bd77447d1219e 
meta-qt6          = HEAD:eb3719266fc03b96d5056980b135b371f31811f4 
meta-raymii       = master:0789f30e221712462748cf56b9afddeec3613be1 -- modified

El image-buildinfo La clase escribe información en el sistema de archivos de destino y la imagen Qt tiene esta clase habilitada de forma predeterminada. La imagen hereda meta-boot2qt/classes/deploy-buildinfo.bbclass que hereda image-buildinfo y lo amplía con información sobre la versión de Qt.

Problemas de Qt 5.15.2

Surgieron algunos problemas al compilar boot2qt para 5.15.2. Los repositorios de git ascendentes cambian el nombre de su rama, por lo que para las fuentes tuve que actualizar algunas recetas relacionadas con las fuentes:

  • b2qt/sources/meta-boot2qt/meta-boot2qt/recipes-graphics/fonts/otf-noto_git.bb
  • b2qt/sources/meta-boot2qt/meta-boot2qt/recipes-graphics/fonts/ttf-opensans_git.bb

Cambia lo siguiente:

SRC_URI = "git://github.com/googlei18n/noto-cjk.git"

Agregar ;branch=main hasta el final:

SRC_URI = "git://github.com/googlei18n/noto-cjk.git;branch=main"

Enjuague y repita para cualquier otra receta de fuente que se queje.

Mi Raspberry Pi 4b 8 GB no arrancó con esta imagen, el gestor de arranque se quejó con el siguiente error:

start4x.elf is not compatible
This board requires newer software

No estoy seguro si esto es específico para la versión de 8 GB, solo tengo una Raspberry Pi 4, por lo que no puedo probarla en un modelo de 4 GB. Intente actualizar la imagen primero y solo actualice las siguientes recetas si experimenta el mismo problema.

Hay dos recetas que necesita actualizar para obtener un archivo de firmware más nuevo. En el ejemplo anterior de la capa de yocto, para cambiar la aplicación predeterminada, usé anulaciones, pero en este caso estoy forzando la fuerza bruta para encontrar una solución, anulando otras recetas. No es la forma más bonita, pero funciona.

Actualice el siguiente archivo:

b2qt/sources/meta-raspberrypi/recipes-bsp/common/raspberrypi-firmware.inc

Elimina todo el contenido existente y pega lo siguiente:

RPIFW_DATE ?= "20210421"
SRCREV ?= "2ac4de4eaac5c1d1b25acec4a5e0a9fdb16f0c91"
RPIFW_SRC_URI ?= "https://github.com/raspberrypi/firmware/archive/${SRCREV}.tar.gz;downloadfilename=raspberrypi-firmware-${SRCREV}.tar.gz"
RPIFW_S ?= "${WORKDIR}/firmware-${SRCREV}"

SRC_URI = "${RPIFW_SRC_URI}"
SRC_URI[sha256sum] = "c687aa1b5127a8dc0773e8aefb1f009f24bf71ccb4c9e8b40a1d46cbbb7bee0c"

PV = "${RPIFW_DATE}"

Actualice el siguiente archivo:

b2qt/sources/meta-raspberrypi/recipes-kernel/linux-firmware-rpidistro/linux-firmware-rpidistro_git.bb

Elimina todo el contenido existente y pega lo siguiente:

SUMMARY = "Linux kernel firmware files from Raspbian distribution"
DESCRIPTION = "Updated firmware files for RaspberryPi hardware. \
RPi-Distro obtains these directly from Cypress; they are not submitted \
to linux-firmware for general use."
HOMEPAGE = "https://github.com/RPi-Distro/firmware-nonfree"
SECTION = "kernel"

# In maintained upstream linux-firmware:
# * brcmfmac43430-sdio falls under LICENSE.cypress
# * brcmfmac43455-sdio falls under LICENSE.broadcom_bcm43xx
# * brcmfmac43456-sdio falls under LICENSE.broadcom_bcm43xx
#
# It is likely[^1] that both of these should be under LICENSE.cypress.
# Further, at this time the text of LICENSE.broadcom_bcm43xx is the same
# in linux-firmware and RPi-Distro/firmware-nonfree, but this may
# change.
#
# Rather than make assumptions about what's supposed to be what, we'll
# use the license implied by the source of these files, named to avoid
# conflicts with linux-firmware.
#
# [^1]: https://github.com/RPi-Distro/bluez-firmware/issues/1
LICENSE = "\
    Firmware-broadcom_bcm43xx-rpidistro \
"
LIC_FILES_CHKSUM = "\
    file://debian/config/brcm80211/LICENSE;md5=8cba1397cda6386db37210439a0da3eb \
"

# These are not common licenses, set NO_GENERIC_LICENSE for them
# so that the license files will be copied from fetched source
NO_GENERIC_LICENSE[Firmware-broadcom_bcm43xx-rpidistro] = "debian/config/brcm80211/LICENSE"

SRC_URI = "git://github.com/RPi-Distro/firmware-nonfree;branch=bullseye;protocol=https"

SRCREV = "b3eec612566ca08913f0830d299f4df70297428f"
PV = "20210315-3+rpt4"

S = "${WORKDIR}/git"

inherit allarch

CLEANBROKEN = "1"

do_compile() {
    :
}

do_install() {
    install -d ${D}${nonarch_base_libdir}/firmware/brcm ${D}${nonarch_base_libdir}/firmware/cypress

    cp debian/config/brcm80211/LICENSE ${D}${nonarch_base_libdir}/firmware/LICENSE.broadcom_bcm43xx-rpidistro

    # Replace outdated linux-firmware files with updated ones from
    # raspbian firmware-nonfree. Raspbian adds blobs and nvram
    # definitions that are also necessary so copy those too.
    for fw in brcmfmac43430-sdio brcmfmac43436-sdio brcmfmac43436s-sdio brcmfmac43455-sdio brcmfmac43456-sdio ; do
        cp -R --no-dereference --preserve=mode,links -v debian/config/brcm80211/brcm/${fw}.* ${D}${nonarch_base_libdir}/firmware/brcm/
    done
    cp -R --no-dereference --preserve=mode,links -v debian/config/brcm80211/cypress/* ${D}${nonarch_base_libdir}/firmware/cypress/
    # add compat links. Fixes errors like
    # brcmfmac mmc1:0001:1: Direct firmware load for brcm/brcmfmac43455-sdio.raspberrypi,4-model-compute-module.txt failed with error -2
    ln -s brcmfmac43455-sdio.txt ${D}${nonarch_base_libdir}/firmware/brcm/brcmfmac43455-sdio.raspberrypi,4-compute-module.txt
}

PACKAGES = "\
    ${PN}-broadcom-license \
    ${PN}-bcm43430 \
    ${PN}-bcm43455 \
    ${PN}-bcm43456 \
    ${PN}-bcm43436 \
    ${PN}-bcm43436s \
"

LICENSE_${PN}-bcm43430 = "Firmware-broadcom_bcm43xx-rpidistro"
LICENSE_${PN}-bcm43436 = "Firmware-broadcom_bcm43xx-rpidistro"
LICENSE_${PN}-bcm43436s = "Firmware-broadcom_bcm43xx-rpidistro"
LICENSE_${PN}-bcm43455 = "Firmware-broadcom_bcm43xx-rpidistro"
LICENSE_${PN}-bcm43456 = "Firmware-broadcom_bcm43xx-rpidistro"
LICENSE_${PN}-broadcom-license = "Firmware-broadcom_bcm43xx-rpidistro"
FILES_${PN}-broadcom-license = "${nonarch_base_libdir}/firmware/LICENSE.broadcom_bcm43xx-rpidistro"
FILES_${PN}-bcm43430 = "${nonarch_base_libdir}/firmware/brcm/brcmfmac43430* ${nonarch_base_libdir}/firmware/cypress/cyfmac43430-sdio.bin"
FILES_${PN}-bcm43436 = "${nonarch_base_libdir}/firmware/brcm/brcmfmac43436-*"
FILES_${PN}-bcm43436s = "${nonarch_base_libdir}/firmware/brcm/brcmfmac43436s*"
FILES_${PN}-bcm43455 = "${nonarch_base_libdir}/firmware/brcm/brcmfmac43455* ${nonarch_base_libdir}/firmware/cypress/cyfmac43455-sdio.*"
FILES_${PN}-bcm43456 = "${nonarch_base_libdir}/firmware/brcm/brcmfmac43456*"
RDEPENDS_${PN}-bcm43430 += "${PN}-broadcom-license"
RDEPENDS_${PN}-bcm43436 += "${PN}-broadcom-license"
RDEPENDS_${PN}-bcm43436s += "${PN}-broadcom-license"
RDEPENDS_${PN}-bcm43455 += "${PN}-broadcom-license"
RDEPENDS_${PN}-bcm43456 += "${PN}-broadcom-license"
RCONFLICTS_${PN}-bcm43430 = "\
    linux-firmware-bcm43430 \
    linux-firmware-raspbian-bcm43430 \
"

RREPLACES_${PN}-bcm43430 = "\
    linux-firmware-bcm43430 \
    linux-firmware-raspbian-bcm43430 \
"

RCONFLICTS_${PN}-bcm43436 = "\
    linux-firmware-bcm43436 \
    linux-firmware-raspbian-bcm43436 \
"

RREPLACES_${PN}-bcm43436 = "\
    linux-firmware-bcm43436 \
    linux-firmware-raspbian-bcm43436 \
"

RCONFLICTS_${PN}-bcm43436s = "\
    linux-firmware-bcm43436s \
    linux-firmware-raspbian-bcm43436s \
"

RREPLACES_${PN}-bcm43436s = "\
    linux-firmware-bcm43436s \
    linux-firmware-raspbian-bcm43436s \
"

RCONFLICTS_${PN}-bcm43455 = "\
    linux-firmware-bcm43455 \
    linux-firmware-raspbian-bcm43455 \
"
RREPLACES_${PN}-bcm43455 = "\
    linux-firmware-bcm43455 \
    linux-firmware-raspbian-bcm43455 \
"
RCONFLICTS_${PN}-bcm43456 = "\
    linux-firmware-bcm43456 \
    linux-firmware-raspbian-bcm43456 \
"
RREPLACES_${PN}-bcm43456 = "\
    linux-firmware-bcm43456 \
    linux-firmware-raspbian-bcm43456 \
"

# Firmware files are generally not run on the CPU, so they can be
# allarch despite being architecture specific
INSANE_SKIP = "arch"

Ambas recetas provienen de la rama maestra más reciente del meta-raspberry capa, pero el último archivo tiene dos puntos (: ) reemplaza con guiones bajos (_ ), debido a que la versión anterior de yocto no admite dos puntos (: ).

Como se indicó en la introducción, si paga por la versión LTS comercial de Qt5.15, estos problemas se resuelven. En el trabajo tenemos esa licencia, pero explícitamente no he mirado el código fuente comercial de boot2qt 5.15 , acabo de aplicar mi conocimiento general de solución de problemas para corregir estos errores. La corrección de fuentes es pública en el sitio qt y el start4x.elf el problema es del meta-raspberry capa, no una capa boot2qt. Ese problema también podría deberse a que estaba experimentando con un cargador de arranque que también admite el arranque de red.