Imagen dual en familias de productos basadas en ARM diseñadas por EnGenius







Chin-Ting Chu  |  Ingeniero de software







RESUMEN: este documento contiene información sobre los cambios necesarios para admitir imágenes duales en el nivel del cargador de arranque. La imagen dual es una idea viable para proporcionar firmware alternativo entre dos particiones de firmware. Cuando el firmware actual está roto, restablecemos la entrada del kernel y lo iniciamos. Lo más importante es que realizamos la actualización del firmware en la partición inactiva. Si no hay nada de malo en ello, el proceso de actualización intercambiará la entrada del kernel. Por lo tanto, podemos mantener un firmware de arranque en nuestro dispositivo todo el tiempo.



I. Introducción

El cargador de arranque realiza una inicialización de hardware de bajo nivel, como procesador, memoria, ethernet, flash, PCI, UART, etc. Después de establecer las configuraciones del sistema, el cargador de arranque carga el kernel y pasa la información de inicio, incluidas las velocidades del puerto serie, las velocidades de reloj, la tabla de particiones y otros datos de configuración del hardware.

Cuando se carga el kernel, configura el hardware, asigna la memoria, carga los controladores, inserta los módulos, monta el sistema de archivos raíz y ejecuta los procesos de preinicio. El paso final es generar el proceso de inicio, el primer proceso de espacio de usuario. Los tres tipos de OpenWRT basado en ARM son solo NOR, solo NAND y NOR más NAND.



Figura 1: Solo NOR, solo NAND, NOR y NAND






II - Procedimiento

I. NOR solo flash



Figura 2: Utilice el primer firmware, solo NOR






1. Cargador de arranque: cuando se enciende, el cargador de arranque verificará la marca de imagen dual, "active_fw"

1.1. Agregue particiones adicionales a mtdparts: kernel_1 y rootfs_1
1.2. Cargue el kernel de destino en la memoria
1.3. Asigne una partición raíz activa del sistema de archivos configurando los parámetros de arranque.
1.3.1. Si "active_fw = 0" => root = rootfs
1.3.2. Si "active_fw = 1" => root = rootfs_1
1.4. Si el kernel de arranque falla, intercambie la partición de firmware activa

2. Kernel Space: analiza los bootargs asignados por el gestor de arranque y monta el sistema de archivos raíz.

3. Espacio de usuario: cuando se actualiza el sistema

3.1. Si "active_fw = 1" =>
3.1.1. flash kernel y rootfs
3.1.2. establecer active_fw = 0
3.1.3. reiniciar
3.2. Si "active_fw = 0" =>
3.2.1. flash kernel_1 y rootfs_1
3.2.2. establecer active_fw = 0
3.2.3. reiniciar

II .. Solo flash NAND
El procedimiento es el mismo que el de 'Solo flash NOR'.

III .. NOR + NAND



Figura 3: Utilice el segundo firmware - NOR + NAND






1. Cargador de arranque: cuando se enciende, el cargador de arranque verificará la marca de imagen dual, "active_fw"

1.1. Agregue dos particiones NAND llamadas rootfs y fs2
1.1.1 Si "active_fw = 0" =>

La mitad superior de NAND se llama rootfs y la otra se llama fs2.

1.1.2 Si "active_fw = 1" =>

La mitad superior de NAND se llama fs2 y la otra se llama rootfs.

1.2. Cargue el kernel de destino en la memoria
1.3. Si el kernel de arranque falla, intercambie la partición de firmware activa

2. Espacio del Kernel: Bajo la estructura NOR + NAND, siempre usamos la partición llamada rootfs como el sistema de archivos raíz.

3. Espacio de usuario: cuando se actualiza el sistema
El procedimiento es el mismo que el de 'Solo flash NOR'.



lll - Implementar

Particiones MTD: dos partes iguales para dos firmes

II. Bandera de imagen dual: establezca una partición de firmware activa

III. Actualización del sistema: actualice siempre la partición de firmware inactiva

IV. Recuperación automática: si el uboot encuentra que el arranque falla desde esta partición de firmware, active la otra partición de firmware.


A. NOR solo flash

Figura 4: Tabla de particiones MTD: solo NOR






1. Cree dos particiones de firmware

1.1. modificar nor-partition.xml para decirle al gestor de arranque la información de las nuevas particiones
1.2. modificar sys_flash_map.mk para indicarle a la tabla de particiones mtd del kernel

2. Bandera de imagen dual

2.1. Modifique board.c para agregar "active_fw" al entorno predeterminado de uboot
2.2. Modifique cmd_bootipq.c para intercambiar los argumentos de arranque (root = rootfs o root = rootfs_1).

3. Actualización del sistema

3.1. marque "active_fw" y actualice el firmware de destino partició[email protected]
3.1.1. "Active_fw = 1" => kernel flash y rootfs
3.1.2. "Active_fw = 0" => flash kernel_1 y rootfs_1

4. Recuperación automática

4.1. Modifique board.c para asegurarse de que uboot capture el valor de retorno de la función de arranque

B. Solo flash NAND

El procedimiento es el mismo que el de 'Solo flash NOR'.



C. NOR + NAND

Figura 5: Tabla de particiones MTD cuando active_fw = 0 - NOR + NAND






1. Cree dos particiones de firmware

1.1. Modifique bootipq.c para agregar particiones llamadas fs2
1.2. Modifique bootm.c para pasar la información de la partición atags. al kernel

2. Bandera de imagen dual

2.1. agregue "active_fw" al entorno predeterminado de uboot

3. Actualización del sistema

3.1. marque "active_fw" y actualice el firmware de destino partició[email protected]
3.1.1. Flash de la partición fs2

4. Recuperación automática

4.1. Modifique board.c para asegurarse de que uboot capture el valor de retorno de la función de arranque



Descargar PDF>





Ver todos los artículos técnicos>