Directorio de artículos
Portabilidad del sistema Linux: programación del sistema
Resumen:
Este capítulo utiliza la herramienta MfgTool proporcionada oficialmente por NXP para programar el sistema al dispositivo a través del puerto USB OTG
Puede comprender el principio general de descargar Mfgtool a la placa de desarrollo
Según la comprensión del principio de descarga, modifique la herramienta de descarga para que se adapte a nuestra propia placa de desarrollo para descargar
1. Adquisición de Mfgtool
Vaya al sitio web oficial de NXP y descargue el kit de herramientas de IMX6ULL
Dirección de descarga: dirección de descarga de Mfgtool , después de la descarga, descomprímala de la siguiente manera:
Uno con programación de sistema de archivos, uno sin
2. Principio de descarga de MfgTool
2.1 Conecte la placa de desarrollo y configure el método de descarga
MfgTool graba el sistema en el EMMC a través de la interfaz USB OTG. Antes de escribir, modifique el sistema a USB para descargar:
Después de la configuración, conecte la placa de desarrollo a través de USB y la conexión se muestra a continuación:
2.2 Ejecutar archivo VBS
Luego ingrese a L4.1.15_2.0.0-ga_mfg-tools\mfgtools-with-rootfs\mfgtools
la carpeta, hay muchos archivos .vbs en la carpeta, .vbs se usa para configurar los parámetros de descarga, por ejemplo, hay los siguientes archivos .vbs en la carpeta recién descargada, puede configurar diferentes métodos de descarga:
El contenido del script vbs es el siguiente:
Set wshShell = CreateObject("WScript.shell")
wshShell.run "mfgtool2.exe -c ""linux"" -l ""eMMC"" -s ""board=sabresd"" -s ""mmc=1"" -s ""6uluboot=14x14evk"" -s ""6uldtb=14x14-evk"""
Set wshShell = Nothing
Se llama al software mfgtool2.exe, y la descarga se realiza después de pasar los parámetros. Luego tomamos el método de mfgtool2-yocto-mx-evk-emmc.vbs
descarga como ejemplo. Después de la ejecución, abra el programa y aparecerá la siguiente marca, que indica que la conexión a la placa de desarrollo es exitoso:
Después de hacer clic en Inicio, se programará el sistema y se programarán los cuatro archivos de uboot, kernel de Linux, .dtb y rootfs .
MfgTool primero descarga uboot, kernel y .dtb (árbol de dispositivos), que son tres archivos, al DDR de la placa de desarrollo a través de USB OTG. Tenga en cuenta que no es necesario descargar rootfs. Es equivalente a iniciar el sistema Linux directamente en la DDR de la placa de desarrollo y luego programar el sistema completo en la EMMC después de que se inicie el sistema Linux.
En el L4.1.15_2.0.0-ga_mfg-tools/mfgtools-with-rootfs/mfgtools/Profiles/Linux/OS Firmware
directorio se encuentran los siguientes archivos:
La carpeta de firmware tiene muchos archivos uboot que terminan en .imx, un archivo de imagen zImage y muchos archivos de árbol de dispositivos que terminan en .dtb, y el directorio de archivos es básicamente el mismo que el firmware, excepto que el firmware se usa para descargar a DDR y el archivo se utiliza para descargar a EMMC
2.3 Archivo de configuración ucl2.xml
Este archivo es principalmente para determinar qué chip de la serie I.MX está actualmente programando el sistema.ucl2.xml comienza con <UCL> y termina con </UCL>. Entre <CFG> y </CFG> hay contenido relacionado con la configuración
Al leer el VID y el PID del chip, puede determinar qué sistema de procesador se está programando actualmente. Si VID = 0X15A2, PID = 0080, significa que el sistema debe programarse para I.MX6ULL
Y las instrucciones relacionadas con la descarga de configuración, entre <LIST> y </LIST> hay comandos de programación para diferentes chips de memoria
Como se mencionó anteriormente, la descarga se divide en dos pasos. El primer paso es descargar al DDR, iniciar el sistema y prepararse para la descarga posterior al EMMC. Las instrucciones de descarga relevantes son las siguientes:
<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6ul%lite%%6uluboot%_emmc.imx" ifdev="MX6ULL">Loading U-boot</CMD>
<CMD state="BootStrap" type="load" file="firmware/zImage" address="0x80800000" loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6SL MX6SX MX7D MX6UL MX6ULL">Loading Kernel.</CMD>
<CMD state="BootStrap" type="load" file="firmware/zImage-imx6ul%lite%-%6uldtb%-emmc.dtb" address="0x83000000" loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6ULL">Loading device tree.</CMD>
BootStrap significa la primera etapa de descarga , archivo significa la ubicación del archivo que se descargará, busque el archivo cfg.ini L4.1.15_2.0.0-ga_mfg-tools\mfgtools-with-rootfs\mfgtools-with-rootfs\mfgtools
debajo , que contiene los valores de parámetros relevantes en el archivo, como lite=l, 6uluboot=14x14evk en el archivo , por lo que el primer valor final del archivo de instrucciones esu-boot-imx6ull14x14evk _emmc.imx
Una vez completada la descarga, inicie el sistema
<CMD state="BootStrap" type="jump" > Jumping to OS image. </CMD>
Después de iniciar, cree una partición en EMMC y luego actualice uboot, zImage, .dtb (árbol de dispositivos) y el sistema de archivos raíz
3. Personaliza el sistema de programación Mfgtool
Obtuvimos Mfgtool arriba, y también entendimos aproximadamente el principio básico de su ejecución y descarga. Modifiquemos Mfgtool a continuación.
3.1 Preparación del archivo de descarga
- Archivo de arranque de uboot : u-boot.imx (generado por la compilación del código fuente de uboot)
- Archivo de imagen zImage : archivo de ejecución del kernel del sistema (generado al compilar el código fuente de Linux)
- Archivo de árbol de dispositivos dtb : el árbol de dispositivos requerido para que se ejecute el kernel (generado al compilar el código fuente de Linux)
- rootfs root file system : el sistema de archivos requerido para el correcto funcionamiento del kernel (hecho y empaquetado por Busybox)
Aquí uso el uboot, el sistema de archivos, la imagen del kernel y el árbol de dispositivos que hice anteriormente
Coloque el L4.1.15_2.0.0-ga_mfg-tools\mfgtools-with-rootfs\mfgtools\Profiles\Linux\OS Firmware、my_file
archivo en la carpeta, my_file es nuestra propia carpeta recién creada
3.2 Crear un nuevo EBV
Copie el archivo mfgtool2-yocto-mx-evk-emmc.vbs y cámbielo por el archivo mfgtool2-my-alpha-emmc.vbs El contenido del archivo es el siguiente:
No necesitamos modificarlo, solo use este archivo directamente. Aunque pasó algunos parámetros, no se usará más adelante y cambiará directamente el archivo de configuración xml.
3.3 Modificar ucl2.xml
La identificación del hardware sigue utilizando el original
<CFG>
<STATE name="BootStrap" dev="MX6SL" vid="15A2" pid="0063"/>
<STATE name="BootStrap" dev="MX6D" vid="15A2" pid="0061"/>
<STATE name="BootStrap" dev="MX6Q" vid="15A2" pid="0054"/>
<STATE name="BootStrap" dev="MX6SX" vid="15A2" pid="0071"/>
<STATE name="BootStrap" dev="MX6UL" vid="15A2" pid="007D"/>
<STATE name="BootStrap" dev="MX7D" vid="15A2" pid="0076"/>
<STATE name="BootStrap" dev="MX6ULL" vid="15A2" pid="0080"/>
<STATE name="Updater" dev="MSC" vid="066F" pid="37FF"/>
</CFG>
El xml de la herramienta oficial se divide en varias partes:
Solo debemos prestar atención a los relacionados con EMMC y modificar el comando ifdev="MX6ULL", que está relacionado con IMX6ULL, porque la descarga se divide en dos etapas, la primera etapa se utiliza para iniciar el sistema en DDR, la descarga de la segunda etapa Nuestro sistema de archivos, mantenemos la primera etapa sin cambios, usamos el proporcionado por NXP, simplemente reemplace la ruta del archivo de la segunda etapa con la nuestra
Las instrucciones de la primera etapa:
<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6ul%lite%%6uluboot%_emmc.imx" ifdev="MX6ULL">Loading U-boot</CMD>
<CMD state="BootStrap" type="load" file="firmware/zImage" address="0x80800000" loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6ULL">Loading Kernel.</CMD>
<CMD state="BootStrap" type="load" file="firmware/%initramfs%" address="0x83800000" loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6ULL">Loading Initramfs.</CMD>
<CMD state="BootStrap" type="load" file="firmware/zImage-imx6ul%lite%-%6uldtb%-emmc.dtb" address="0x83000000" loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6ULL">Loading device tree.</CMD>
<CMD state="BootStrap" type="jump" > Jumping to OS image. </CMD>
directiva de segunda etapa
Crear un entorno de descarga
<!-- create partition -->
<CMD state="Updater" type="push" body="send" file="mksdcard.sh.tar">Sending partition shell</CMD>
<CMD state="Updater" type="push" body="$ tar -xf $FILE "> Partitioning...</CMD>
<CMD state="Updater" type="push" body="$ sh mksdcard.sh /dev/mmcblk1"> Partitioning...</CMD>
Descarga uboot y cambia la ruta a la nuestra:
<!-- burn uboot -->
<CMD state="Updater" type="push" body="$ dd if=/dev/zero of=/dev/mmcblk1 bs=1k seek=768 conv=fsync count=8">clear u-boot env</CMD>
<CMD state="Updater" type="push" body="$ echo 0 > /sys/block/mmcblk1boot0/force_ro">access boot partition 1</CMD>
<CMD state="Updater" type="push" body="send" file="my_file/u-boot.imx" ifdev="MX6ULL">Sending u-boot.bin</CMD>
<CMD state="Updater" type="push" body="$ dd if=$FILE of=/dev/mmcblk1boot0 bs=512 seek=2">write U-Boot to sd card</CMD>
<CMD state="Updater" type="push" body="$ echo 1 > /sys/block/mmcblk1boot0/force_ro"> re-enable read-only access </CMD>
<CMD state="Updater" type="push" body="$ mmc bootpart enable 1 1 /dev/mmcblk1">enable boot partion 1 to boot</CMD>
Formatee y monte la partición del sistema de archivos del núcleo:
<!-- format and mount boot partition -->
<CMD state="Updater" type="push" body="$ while [ ! -e /dev/mmcblk1p1 ]; do sleep 1; echo \"waiting...\"; done ">Waiting for the partition ready</CMD>
<CMD state="Updater" type="push" body="$ mkfs.vfat -F 32 /dev/mmcblk1p1">Formatting rootfs partition</CMD>
<CMD state="Updater" type="push" body="$ mkdir -p /mnt/mmcblk1p1"/>
<CMD state="Updater" type="push" body="$ mount -t vfat /dev/mmcblk1p1 /mnt/mmcblk1p1"/>
Configure el LOGOTIPO durante el proceso de descarga:
<!-- burn logo -->
<!--<CMD state="Updater" type="push" body="send" file="files/alientek.bmp">Sending Boot Logo</CMD>
<CMD state="Updater" type="push" body="$ cp $FILE /mnt/mmcblk1p1/alientek.bmp">write boot logo to sd card</CMD> >
Descargue la imagen de zImage y reemplácela con nuestra propia ruta
<!-- burn zImage -->
<CMD state="Updater" type="push" body="send" file="my_file/zImage">Sending kernel zImage</CMD>
<CMD state="Updater" type="push" body="$ cp $FILE /mnt/mmcblk1p1/zImage">write kernel image to sd card</CMD>
Descargue el árbol de dispositivos y reemplácelo con nuestra propia ruta del árbol de dispositivos:
<!-- burn dtb -->
<CMD state="Updater" type="push" body="send" file="my_file/imx6ull-my-emmc.dtb" ifdev="MX6ULL">Sending Device Tree file</CMD>
<CMD state="Updater" type="push" body="$ cp $FILE /mnt/mmcblk1p1/imx6ull-my-emmc.dtb" ifdev="MX6ULL">write device tree to eMMC card</CMD>
<CMD state="Updater" type="push" body="$ sleep 1">delay</CMD>
<CMD state="Updater" type="push" body="$ sync">Sync...</CMD>
<CMD state="Updater" type="push" body="$ umount /mnt/mmcblk1p1">Unmounting vfat partition</CMD>
Formatee y monte la partición del sistema de archivos raíz
<!-- format and mount rootfs partition -->
<CMD state="Updater" type="push" body="$ mkfs.ext3 -F -E nodiscard /dev/mmcblk1p2">Formatting rootfs partition</CMD>
<CMD state="Updater" type="push" body="$ mkdir -p /mnt/mmcblk1p2"/>
<CMD state="Updater" type="push" body="$ mount -t ext3 /dev/mmcblk1p2 /mnt/mmcblk1p2"/>
Descargue el sistema de archivos raíz y reemplácelo con nuestra ruta del sistema de archivos raíz
<!-- burn rootfs -->
<CMD state="Updater" type="push" body="pipe tar -jxv -C /mnt/mmcblk1p2" file="my_file/rootfs.tar.bz2" ifdev="MX6ULL">Sending and writting rootfs</CMD>
<CMD state="Updater" type="push" body="frf">Finishing rootfs write</CMD>
<CMD state="Updater" type="push" body="$ sleep 1">delay</CMD>
<CMD state="Updater" type="push" body="$ sync">Sync...</CMD>
<CMD state="Updater" type="push" body="$ umount /mnt/mmcblk1p2">Unmounting rootfs partition</CMD>
<CMD state="Updater" type="push" body="$ echo Update Complete!">Done</CMD>
Guarde después de la modificación y ejecute nuestro script VBS
La descarga se completa de la siguiente manera:
Ajuste el interruptor BOOT DIP, inicie el sistema, muestra que falta el árbol de dispositivos, porque uso uboot compilado por atomic, y su nombre de árbol de dispositivos es diferente. Lo modifico directamente en la línea de comando de arranque, configuro el árbol de dispositivos, y comenzar directamente.
setenv fdt_file imx6ull-my-emmc.dtb
boot
El sistema se inició con éxito: