El arte del chamanismo o firmware personalizado para Olinuxino. UBOOT Parte 2

Todo esto se recopiló en Ubuntu 16.04.

La decisión de construir el firmware nació debido a la falta de acceso libre a la imagen de esta placa (Olimex A13-Olinuxino). Y el fabricante ofreció comprar una tarjeta SD con una imagen y costaba unos 10 euros en ese momento, lo que realmente no funcionó, y además, fue diseñada para un monitor.

Configuraremos la configuración del cargador de arranque para arrancar desde la tarjeta SD. Dado que no hay memoria NAND en el tablero, y todas las demás opciones de arranque están ligeramente torcidas (quien pueda ensamblar uboot para arrancar desde un dispositivo USB, déjelo avanzar dos veces y compartir). El algoritmo de carga del procesador allwinner a13 se puede encontrar en el sitio web del fabricante. O aquí hay un recorte de una hoja de datos.



Se puede ver claramente por el algoritmo que el gestor de arranque se verifica primero en la tarjeta SD, luego se verifica el resto, y solo al final se comprueba el USB del gestor de arranque. Por lo tanto, las tabletas y los teléfonos inteligentes se pueden hacer con Ubuntu si deslizan la tarjeta SD de la manera adecuada. Y aparentemente, tal algoritmo será, si no para todos, entonces para muchos fabricantes de procesadores de brazo.

Primero debe romper la tarjeta SD, para esto, a fin de no cometer un error en el proceso de escribir comandos, reduciremos todo el proceso a un archivo de script (prefiero reducir todo a dichos archivos, ya que tendrá que ejecutarlo más de una vez).

#!/bin/sh DEViCELINK=/dev/sdb fdisk $DEViCELINK <<EOF n #    p #   1 #   2048 #     2MiB +64M #  ,    kernel     dts  n p 2 +2G #    ubuntu n p 3 +2G #         n p 4 #         w EOF mkfs.ext2 /dev/sdb1 << EOF #   kernel    fat16  ext2 y EOF mkfs.ext4 /dev/sdb2 << EOF y EOF mkfs.ext4 /dev/sdb3 << EOF y EOF mkfs.ext4 /dev/sdb4 << EOF y EOF 

UBOOT Build


Detengámonos en el gestor de arranque con más detalle, y cuando seleccionamos UBOOT, lanzamos la versión de u-boot-2018.05, la última en ese momento.

Se supone que todo el software necesario para el ensamblaje ya está instalado. E inicie la compilación configurando el gestor de arranque.

Para iniciar la configuración, debe ir a la carpeta con UBOOT y ejecutar el comando:

 make O=../olimex-uboot #       -j4 #     ARCH=arm #      CROSS_COMPILE=arm-linux-gnueabihf- #    xconfig #   GUI  

Como resultado de la ejecución, obtenemos esa ventana.



Esta es la llamada versión X del configurador, generalmente usan la opción de consola; se proporciona más información, pero esto es aún más obvio y cubrirá completamente nuestras necesidades.

Y luego, si tiene mucho tiempo o no le importa, puede configurar el gestor de arranque usted mismo desde cero. Sin embargo, es mejor descargar la configuración final de esta placa a través del menú de archivo. En la carpeta con la fuente del cargador de arranque en /u-boot-2018.05/configs/, seleccione el archivo A13-OlinuXino_defconfig, esta es nuestra configuración, donde todo ya está instalado. A continuación, haga clic en guardar y cierre la ventana, porque no es necesario cambiar nada aquí.

Queda por ejecutar el comando de compilación:

 make O=../olimex-uboot -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 

En este comando, los elementos son todos los mismos que en el anterior, solo que sin el parámetro xconfig, que es lo que significa la configuración. Eso es todo, el gestor de arranque está ensamblado.

Una vez completado el ensamblaje, en la carpeta especificada en el comando, necesitamos encontrar este archivo "u-boot-sunxi-with-spl.bin", este es el gestor de arranque deseado.

Luego, para cargar el gestor de arranque en la tarjeta SD, use el comando:

 dd if=../olimex-uboot/u-boot-sunxi-with-spl.bin #      of=/dev/sdb #     SD  bs=1024 seek=8 #  8KiB  ,      

El gestor de arranque que se acaba de grabar después del arranque apuntará a la siguiente sección de la tarjeta SD / dev / sdb1, y allí buscará un archivo de script con variables de entorno que contenga instrucciones para cargar más.

Este archivo debe llamarse boot.scr, un archivo con este nombre está buscando uboot después de su descarga. Por supuesto, el nombre del archivo se puede cambiar, así como el método de descarga, si ingresa a la configuración UBOOT, pero permítanos analizar esta opción.

También debe compilar archivos de dispositivo por una cosa, están en la fuente con el gestor de arranque en /u-boot-2018.05/arch/arm/dts/ estamos interesados ​​en el archivo sun5i-a13-olinuxino.dts. Representa una configuración de registros y periféricos del procesador. Este es un archivo de configuración universal, por lo que la opción es posible cuando se usa un gestor de arranque uboot para diferentes procesadores, pero se usan diferentes archivos dts. Los mismos archivos dts están en el código fuente del kernel de Linux, son básicamente los mismos, solo están escritos de manera un poco diferente y puede elegir de dónde obtener el árbol de dispositivos ensamblado. En general, para compilar archivos dts, debe ejecutar este comando:

 make O=../olimex-uboot -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs #      dts  

El archivo compilado estará en ../olimex-uboot/arch/arm/dts/.
Considere obtener el archivo boot.scr con más detalle.
Primero, cree el archivo boot.cmd con el contenido:

 load mmc 0 0x43000000 sun5i-a13-olinuxino.dtb load mmc 0 0x42000000 uImage setenv bootargs root=/dev/mmcblk0p2 rootfstype=ext4 rw rootwait console=ttyS0,115200 bootm 0x42000000 – 0x43000000 

Pero para que uboot comprenda las instrucciones, este archivo debe tener la forma de un script y para ello debe ejecutar el comando:

  mkimage -C none -A arm -T script -d boot.cmd boot.scr 

Donde boot.scr es el archivo requerido.

La primera línea de carga mmc 0 0x43000000 sun5i-a13-olinuxino.dtb carga el archivo del árbol de dispositivos en la dirección especificada en la RAM. cargar mmc 0 indica que necesita descargar el archivo desde la primera sección de la tarjeta SD, mientras que la numeración para uboot es cero y no uno.

La segunda línea carga mmc 0 0x42000000 uImage carga el núcleo Linux ensamblado en la dirección especificada.

Para nuestra versión, la variable de modo de video setenv, que generalmente se usa más, no es necesaria para nosotros ya que no se planea usar el monitor.

Tercera línea:

 setenv bootargs #    root=/dev/mmcblk0p2 #    SD    rootfs rootfstype=ext4 #    rootfs rw #    rootwait console=ttyS0,115200 #    uart0 

Bueno, el último comando bootm carga el núcleo del anterior cargado en la memoria.

En el próximo artículo, la última parte que se debe colocar en la primera sección de la tarjeta SD será la formación del kernel de Linux.

La primera parte del artículo
La tercera parte del articulo

Source: https://habr.com/ru/post/es434942/


All Articles