Práctica de programación del sistema Linux

practica de programacion de sistemas

La herramienta de programación mfgtool y su principio de funcionamiento se presentan en el artículo Exploración preliminar de la programación del sistema Linux. A continuación, se utiliza la placa de desarrollo I.MX6U-ALPHA EMMC como plataforma para presentar cómo programar el sistema oficial NXP y el sistema propio .

1. Grabar el sistema oficial de NXP

Grabe el sistema oficial NXP en la placa de desarrollo I.MX6U-ALPHA EMMC (512 MB DDR3 + 8G EMMC), los pasos específicos son los siguientes:

  • Conecte el USB, marque el interruptor de código al modo de descarga USB
  • Saque la tarjeta TF y luego presione el botón de reinicio de la placa de desarrollo
  • Abra el terminal del asistente del puerto serie MobaXterm
  • Haga doble clic en mfgtool2-yocto-mx-evk-emmc.vbs
  • Haga clic en el botón Inicio para programar el sistema oficial de NXP

El proceso de grabación es el siguiente
inserte la descripción de la imagen aquí

El proceso de grabación que se muestra en el terminal asistente del puerto serie MobaXterm

inserte la descripción de la imagen aquí

Una vez completada la programación, haga clic en el botón Detener para detener la programación y haga clic en el botón Salir para salir

inserte la descripción de la imagen aquí

Saque el cable USB, gire el interruptor DIP al modo de inicio de EMMC y se iniciará desde EMMC después de reiniciar

inserte la descripción de la imagen aquí

En este momento, NXP realiza el sistema después del inicio para la placa de desarrollo I.MX6ULL EVK. Debe ingresar el nombre de usuario, el nombre de usuario es "root" y no hay contraseña.

2. Grabar el sistema casero

Programe el sistema hecho a sí mismo en la placa de desarrollo I.MX6U-ALPHA EMMC (512 MB DDR3 + 8G EMMC). Prepare los cuatro archivos de programación de uboot, kernel, .dtb y rootfs (paquete comprimido) hechos por usted mismo, y cámbieles el nombre

##根文件系统 rootfs 打包
cd rootfs/ 
tar -vcjf rootfs.tar.bz2 *

inserte la descripción de la imagen aquí

⏩ Copie los archivos uboot, kernel y .dtb renombrados en el directorio de firmware y reemplace los archivos originales
⏩ Copie los cuatro archivos renombrados en el directorio de archivos
⏩ Haga doble clic en el archivo mfgtool2-yocto-mx-evk-emmc.vbs, abra el software de grabación, haga clic en el botón Inicio para grabar
inserte la descripción de la imagen aquí

Una vez completada la programación, inicie el sistema desde EMMC, como se muestra en la figura a continuación, se puede ver que el sistema hecho a sí mismo se ha programado con éxito
inserte la descripción de la imagen aquí

3. Modificar la herramienta de programación

3.1 Transformar Mfgtool

Lo anterior es para reemplazar el sistema oficial de NXP con un sistema de fabricación propia para completar la programación. A continuación, se presentará cómo modificar la herramienta MfgTool para admitir su propia placa de desarrollo. Transform MfgTool, principalmente de los siguientes tres aspectos

⏩ Determine el nombre del archivo del sistema: determine el nombre del archivo del sistema para que sea compatible con diferentes productos
inserte la descripción de la imagen aquí
⏩ Cree un nuevo archivo .vbs: copie el archivo mfgtool2-yocto-mx-evk-emmc.vbs y vuelva a ordenarlo según sea necesario, como nombrarlo mfgtool2-andyxi-emmc.vbs

⏩ Modifique el archivo ucl2.xml en la carpeta OS Firmware: cámbielo por el siguiente

<!-- 修改后的 ucl2.xml 文件 -->
<UCL>
  <CFG>
    <STATE name="BootStrap" dev="MX6UL" vid="15A2" pid="007D"/>
    <STATE name="BootStrap" dev="MX6ULL" vid="15A2" pid="0080"/>
    <STATE name="Updater" dev="MSC" vid="066F" pid="37FF"/>
  </CFG>
	
  <!-- 向 EMMC 烧写系统 -->
  <LIST name="eMMC" desc="Choose eMMC as media">
    <CMD state="BootStrap" type="boot" body="BootStrap" file
    ="firmware/u-boot-andyxi-emmc.imx" ifdev="MX6ULL">Loading Uboot</CMD>
    <CMD state="BootStrap" type="load" file="firmware/zImage-andyxi-emmc" address="0x80800000"
    loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" 
    ifdev="MX6SL MX6SX MX7D MX6UL MX6ULL">Loading Kernel.</CMD>
    <CMD state="BootStrap" type="load" file="firmware/%initramfs%" address="0x83800000"
    loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE"
    ifdev="MX6SL MX6SX MX7D MX6UL MX6ULL">Loading Initramfs.</CMD>
    <CMD state="BootStrap" type="load" file="firmware/imx6ull-andyxi-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>

    <!-- 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/mmcblk%mmc%"> Partitioning...</CMD>

    <!-- burn uboot -->
    <CMD state="Updater" type="push" body="$ dd if=/dev/zero
    of=/dev/mmcblk%mmc% bs=1k seek=768 conv=fsync count=8">clear u-boot arg</CMD>

    <!-- access boot partition -->
    <CMD state="Updater" type="push" body="$ echo 0 > /sys/block/mmcblk%mmc%boot0/force_ro">
    access boot partition 1</CMD>
    <CMD state="Updater" type="push" body="send" file="files/u-boot-andyxi-emmc.imx" ifdev="MX6ULL">
    Sending u-boot.bin</CMD>
    <CMD state="Updater" type="push" body="$ dd if=$FILE of=/dev/mmcblk%mmc%boot0 bs=512 seek=2">
    write U-Boot to sd card</CMD>
    <CMD state="Updater" type="push" body="$ echo 1 > /sys/block/mmcblk%mmc%boot0/force_ro"> 
    re-enable read-only access</CMD>
    <CMD state="Updater" type="push" body="$ mmc bootpart enable 1 1 /dev/mmcblk%mmc%">
    enable boot partion 1 to boot</CMD>

    <!-- create fat partition -->
    <CMD state="Updater" type="push" body="$ while [ ! -e
    /dev/mmcblk%mmc%p1 ]; do sleep 1; echo \"waiting...\"; done ">Waiting for the partition ready</CMD>
    <CMD state="Updater" type="push" body="$ mkfs.vfat /dev/mmcblk%mmc%p1">
    Formatting rootfs partition</CMD>
    <CMD state="Updater" type="push" body="$ mkdir -p /mnt/mmcblk%mmc%p1"/>
    <CMD state="Updater" type="push" body="$ mount -t vfat /dev/mmcblk%mmc%p1 /mnt/mmcblk%mmc%p1"/>

    <!-- burn zImage -->
    <CMD state="Updater" type="push" body="send" file="files/zImage-andyxi-emmc">
    Sending kernel zImage</CMD>
    <CMD state="Updater" type="push" body="$ cp $FILE /mnt/mmcblk%mmc%p1/zImage">
    write kernel image to sd card</CMD>

    <!-- burn dtb -->
    <CMD state="Updater" type="push" body="send" file="files/imx6ull-andyxi-emmc.dtb" ifdev="MX6ULL">
    Sending Device Tree file</CMD>
    <CMD state="Updater" type="push" body="$ cp $FILE /mnt/mmcblk%mmc%p1/imx6ull-andyxi-emmc.dtb" ifdev="MX6ULL">
    write device tree to sd card</CMD>
    <CMD state="Updater" type="push" body="$ umount /mnt/mmcblk%mmc%p1">
    Unmounting vfat partition</CMD>

    <!-- burn rootfs -->
    <CMD state="Updater" type="push" body="$ mkfs.ext3 -F -E nodiscard /dev/mmcblk%mmc%p2">
    Formatting rootfs partition</CMD>
    <CMD state="Updater" type="push" body="$ mkdir -p /mnt/mmcblk%mmc%p2"/>
    <CMD state="Updater" type="push" body="$ mount -t ext3 /dev/mmcblk%mmc%p2 /mnt/mmcblk%mmc%p2"/>
    <CMD state="Updater" type="push" body="pipe tar -jxv -C /mnt/mmcblk%mmc%p2" 
    file="files/rootfs-andyxi-emmc.tar.bz2" ifdev="MX6UL MX7D MX6ULL">Sending and writting rootfs</CMD>
    <CMD state="Updater" type="push" body="frf">Finishing rootfs write</CMD>
    <CMD state="Updater" type="push" body="$ umount /mnt/mmcblk%mmc%p2">Unmounting rootfs partition</CMD>
    <CMD state="Updater" type="push" body="$ echo Update Complete!">Done</CMD>
  </LIST>
</UCL>

3.2 Prueba de quemado

Después de modificar la herramienta MfgTool, se puede realizar la prueba de programación. Copie los archivos uboot, kernel de Linux y .dtb creados por usted mismo en el directorio de firmware y reemplace los archivos originales; copie los cuatro archivos en el directorio de archivos.

Haga doble clic en el archivo mfgtool2-andyxi-emmc.vbs para abrir el software de programación y haga clic en el botón "Inicio" para programar. Una vez completada la programación, configure el interruptor DIP en el inicio de EMMC, reinicie la placa de desarrollo y la información de inicio del sistema se muestra a continuación:
inserte la descripción de la imagen aquí

La placa de desarrollo termina atascada en "Iniciando kernel..." y el kernel no se inicia. A continuación se describe cómo resolver el problema de la falla de inicio del kernel

3.3 Resolver la falla de inicio del kernel

Observe atentamente la salida de información de registro de uboot y encontrará dos líneas de información, como se muestra en la siguiente figura:
inserte la descripción de la imagen aquí

Se puede ver que ocurrió un error al leer el archivo del árbol del dispositivo. Reinicie uboot, ingrese el modo de línea de comandos, ingrese el siguiente comando para verificar si hay un archivo de árbol de dispositivos en la partición 1 de EMMC

mmc dev 1 	//切换到EMMC
ls mmc 1:1 	//输出EMMC1分区1中的所有文件

inserte la descripción de la imagen aquí

Se puede ver que hay un archivo de árbol de dispositivos en la partición 1 de EMMC en este momento, pero el nombre es diferente, por lo que leer imx6ull-14x14-evk.dtb definitivamente generará un error. El motivo de este error es que el nombre del árbol de dispositivos predeterminado en uboot es imx6ull-14x14-evk.dtb. Hay dos soluciones:

⏩ Restablece el valor de la variable de entorno bootcmd: en el modo de línea de comandos de uboot, restablece los valores de las dos variables de entorno bootcmd y bootargs

setenv bootcmd 'mmc dev 1;fatload mmc 1:1 80800000 zImage;fatload mmc 1:1 83000000
			    imx6ull-andyxi-emmc.dtb;bootz 80800000 - 83000000'
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
saveenv\

⏩ Modifique el código fuente de uboot: El método anterior debe configurarse nuevamente cada vez que se reprograme. El siguiente método solo debe configurarse una vez. En el archivo de código fuente de uboot include/configs/mx6ull_andyxi_emmc.h, busque el siguiente contenido en la macro CONFIG_EXTRA_ENV_SETTINGS:

"findfdt="\
  "if test $fdt_file = undefined; then " \
    "if test $board_name = EVK && test $board_rev = 9X9; then " \
	"setenv fdt_file imx6ull-9x9-evk.dtb; fi; " \
    "if test $board_name = EVK && test $board_rev = 14X14; then " \
	"setenv fdt_file imx6ull-14x14-evk.dtb; fi; " \
    "if test $fdt_file = undefined; then " \
	"echo WARNING: Could not determine dtb to use; fi; " \
  "fi;\0" \

findfdt es una variable de entorno utilizada para determinar el nombre del archivo de árbol de dispositivos, y la variable de entorno fdt_file contiene el nombre del archivo de árbol de dispositivos. Los dos árboles de dispositivos del código anterior son utilizados por las placas de desarrollo oficiales de NXP. Así que cambia el valor de findfdt a lo siguiente:

"findfdt="\
  "if test $fdt_file = undefined; then " \
    "setenv fdt_file imx6ull-andyxi-emmc.dtb; " \
  "fi;\0" \

Vuelva a compilar uboot después de la modificación, luego grabe el nuevo uboot en la placa de desarrollo y reinicie la prueba, el kernel se inicia normalmente. En este punto, se completa la programación del sistema hecho a sí mismo, la prueba es exitosa y la placa de desarrollo se puede iniciar normalmente sin la red.

Siga la cuenta oficial, envíe "mfgtool" para obtener información relacionada con mfgtool

Supongo que te gusta

Origin blog.csdn.net/Chuangke_Andy/article/details/126831995
Recomendado
Clasificación