AVNET EMBEDDED MSC SM2S-IMX8M Depuración de computadoras basadas en ARM con puerto UART en instrucciones del módulo
Prefacio
Aviso de derechos de autor
Copyright © 2023 Avnet Embedded GmbH. Reservados todos los derechos. La copia de este documento, su transmisión a otros y el uso o comunicación de su contenido están prohibidos sin la autorización expresa de Avnet Embedded /MSC Technologies.
GmbH. Los infractores son responsables del pago de daños y perjuicios. Todos los derechos están reservados en caso de concesión de una patente o registro de un modelo o diseño de utilidad.
Información importante
Esta documentación está destinada únicamente a audiencias cualificadas. El producto descrito aquí no es un producto de usuario final. Fue desarrollado y fabricado para su posterior procesamiento por personal capacitado.
Descargo de responsabilidad
Aunque este documento ha sido generado con sumo cuidado, no implica ninguna garantía ni responsabilidad por su corrección o idoneidad para ningún propósito particular. La información contenida en este documento se proporciona "tal cual" y está sujeta a cambios sin previo aviso.
Marcas comerciales
Todos los nombres de productos, logotipos o marcas comerciales utilizados son propiedad de sus respectivos dueños.
Información general
Alcance
Este documento se aplica a todos los módulos de computadora integrados Avnet basados en CPU de las series NXP i.MX8 e i.MX9, como p.
- SM2S-IMX8PLUS
- SM2S-IMX8M
- SM2S-IMX8MINI
- SM2S-IMX8NANO
- SM2S-IMX8 (CuadPlus/CuadMax)
- SM2S-IMX93
- OSM-SF-IMX91
- OSM-SF-IMX93
- OSM-MF-IMX8NANO
- OSM-MF-IMX8MINI
Esta lista no pretende ser exhaustiva, especialmente porque es posible que se publiquen nuevas juntas para las que se puedan aplicar los mismos procedimientos, mientras que es posible que este documento no siempre se actualice de inmediato.
Revisiones y modificaciones
Revisión | Fecha | Comentario | |
1.0 | 25.05.2023 | El señor Koch | Versión inicial |
Cómo cambiar el puerto UART de depuración
Introducción
Muchos sistemas basados en ARM vienen con una consola serie como principal medio de acceso para fines de depuración y recuperación del sistema. Dependiendo de los requisitos del cliente, es una necesidad frecuente en dichos sistemas que el puerto UART de depuración predeterminado deba cambiarse a un puerto serie diferente. Por puerto UART de depuración nos referimos al puerto UART que proporcionará todas las entradas/salidas de U-Boot, la salida del registro de arranque del kernel y el shell del kernel, básicamente toda la comunicación UART que se verá en una imagen mínima de Yocto. Dado que el puerto UART predeterminado no es utilizado por un solo componente de software, sino por muchos componentes, incluidos u-boot, atf-firmware, optee-os y el propio kernel, configurar el puerto UART predeterminado puede ser un desafío y elview puede perderse rápidamente. Este documento explicará todos los pasos a seguir para lograr esta tarea. Para una explicación más sencilla, este documento fue escrito para el procesador NXP i.MX8 MINI y mscldk, pero se puede aplicar a todos los procesadores de las series i.MX8 e i.MX9 y otros sistemas de compilación con muy poco esfuerzo.
Preparando el ambiente
Cambiar el puerto UART de depuración predeterminado requerirá modificar el código en Yocto, y la forma más sencilla de hacerlo es utilizar Yocto devtool para preparar las fuentes para nosotros. Será necesario modificar los siguientes paquetes de Yocto:
- u-boot-imx (virtual/cargador de arranque)
- linux-imx (virtual/núcleo)
- atf-imx
- optee-os (solo si se utiliza optee)
Las fuentes deben prepararse con devtool:
$ ./devtool modificar u-boot-imx
$ ./devtool modificar linux-imx
$ ./devtool modificar atf-imx
$ ./devtool modificar optee-os
Todas las fuentes se pueden encontrar en el directorio "espacio de trabajo".
Modificando código
Modificando el gestor de arranque
En el gestor de arranque se producirá una inicialización básica de UART, por lo que será necesario modificar el muxing y la dirección base del puerto UART. La segunda tarea de u-boot es pasar los argumentos de arranque al kernel y aquí será necesario modificar el argumento tty de la consola. La inicialización y mezcla de UART ocurre en las primeras etapas.tage del proceso de arranque en el SPL. El código fuente se puede encontrar en el spl.c específico de la placa. file.
Objetivo file: espacio de trabajo/fuentes/u-boot-imx/board/msc/sm2s_imx8mm/spl.c
Abrir el file y navega hasta la función init_ser0():
vacío estático init_ser0 (vacío)
{
imx_iomux_v3_setup_multiple_pads(ser0_pads, ARRAY_SIZE(ser0_pads)); init_uart_clk(1);
}
La función activa el reloj para UART2 (índice 1 para UART físico 2).
Ahora, si queremos usar UART1 en su lugar, podríamos definir nuestra propia función init_ser1:
vacío estático init_ser1 (vacío)
{
imx_iomux_v3_setup_multiple_pads(ser1_pads, ARRAY_SIZE(ser1_pads)); init_uart_clk(0);
}
Reemplace la llamada de función de init_ser0 con init_ser1() en la función board_early_init_f(). Además, notamos que la estructura ser1_pads no está definida. Aquí será necesario estar atento al cableado de UART1. En imx8mm, UART1 se puede mezclar con los pads uart1 o con los pads sai2. En consecuencia, ser1_pads podría definirse como:
estático iomux_v3_cfg_t const ser1_pads[] = {
IMX8MM_PAD_UART1_RXD_UART1_RX | DEFAULT_UART_PAD_CTRL, IMX8MM_PAD_UART1_TXD_UART1_TX | DEFAULT_UART_PAD_CTRL, NULO
};
O bien, usando sai2:
estático iomux_v3_cfg_t const ser1_pads[] = {
IMX8MM_PAD_SAI2_RXFS_UART1_TX | DEFAULT_UART_PAD_CTRL, IMX8MM_PAD_SAI2_RXC_UART1_RX | DEFAULT_UART_PAD_CTRL NULL };
Ahora se debe modificar la dirección base de UART, la dirección se define en la configuración del encabezado de la placa. file.
Objetivo file: espacio de trabajo/fuentes/u-boot-imx/include/configs/msc_sm2s_imx8mm.h
Modifique la definición CONFIG_MXC_UART_BASE. Para UART1 esto sería:
- // #definir CONFIG_MXC_UART_BASE
- UART2_BASE_ADDR
- #definir CONFIG_MXC_UART_BASE
- UART1_BASE_ADDR
Finalmente, se debe modificar el argumento del kernel de la consola. El valor se puede encontrar en el mismo encabezado. file. Buscar “console=ttymxc1…” y modifique “ttymxc1” a “ttymxc0”. El número de índice se correlaciona con el índice UART y siempre es el índice UART menos 1. Por lo tanto, para UART 2 usamos ttymxc1, para UART 3 usamos ttymxc2, etc.
Modificación del firmware confiable de ARM
Arm Trusted Firmware (imx-atf) no tiene una rutina de inicialización de UART propia, sin embargo, tiene una dirección base de UART codificada y depende de la inicialización de UART adecuada desde u-boot. Una configuración de dirección base diferente en u-boot e imx-atf probablemente dejará el procesador atrapado en un controlador de excepciones y no habrá nada visible en UART (la CPU parece bloquearse sin motivo visible). Cuando se cambia el puerto UART, ¡este cambio también debe ocurrir en imx-atf! Cambiar el puerto UART en imx-atf requiere una modificación de la dirección base. Este valor se establece en platform.mk. file del procesador
Objetivo file: espacio de trabajo/fuentes/imx-atf/plat/imx/imx8m/imx8mm/platform.mk
La dirección base UART correcta se puede encontrar en el manual de referencia de imx8. en este exampEntonces cambiamos de UART2 a UART1 en imx8mm:
#IMX_BOOT_UART_BASE ?= 0x30890000
IMX_BOOT_UART_BASE ?= 0x30860000
Modificando optee-os
Optee OS generalmente se carga cuando se utiliza la criptografía del módulo CAAM en el sistema. Optee se ejecuta en los mismos núcleos ARM Cortex-A53, pero en otra instancia completamente independiente del núcleo. Optee también requiere acceso UART y en este caso significa una modificación de la dirección base.
Objetivo file: espacio de trabajo/sources/optee-os/core/arch/arm/plat-imx/conf.mk
Este exampEl archivo establecerá la dirección base UART de UART2 a UART1:
#CFG_UART_BASE ?= UART2_BASE
CFG_UART_BASE ?= UART1_BASE
Modificando el kernel
El kernel requerirá sólo unas pocas modificaciones en el árbol de dispositivos, y sólo si la UART aún no está disponible en el kernel. En muchos casos, no será necesaria ninguna modificación. Sin embargo, verifique si existe la instancia de tty que desea utilizar. Verifique la presencia de tty con un comando de shell:
$ ls /dev/ttymxc*
Si ttymxc ya está disponible, no es necesaria ninguna modificación. por ejemploample, para UART2 esto sería /dev/ttymxc1. Como ya sabemos, el índice de tty es siempre el índice del UART físico menos 1. Si el tty requerido no está disponible, siga el procedimiento habitual de integración de UART.
Construir y probar
Para una reconstrucción segura se debe aplicar una limpieza completa:
$ ./bitbake –c cleanall u-boot-imx linux-imx imx-atf optee-os
Construya la imagen nuevamente con el comando de compilación predeterminado, por ejemploampen:
$ ./bitbake msc-image-base
Para fines de prueba, se debe conectar un adaptador UART al UART antiguo. ¡No debería haber más salida en el antiguo UART! El nuevo UART debería ser completamente funcional; para ello, verifique la conexión utilizando el shell UART de u-boot y la consola de Linux.
Soporte de producto
Los ingenieros y técnicos de Avnet Embedded están comprometidos a brindar soporte a nuestros clientes cuando sea necesario. Antes de ponerse en contacto con el soporte técnico de Avnet Embedded, consulte las páginas respectivas en nuestro websitio en
https://embedded.avnet.com/support/
para obtener la documentación, los controladores y las descargas de software más recientes.
Si la información proporcionada allí no resuelve su problema, comuníquese con nuestro equipo de soporte técnico de Avnet Embedded de la siguiente manera:
Correo electrónico: support.boards@avnet.eu
Teléfono: +49 (0)8165 906-200
Documentos / Recursos
![]() |
AVNET EMBEDDED MSC SM2S-IMX8M Depuración Puerto UART Computadoras basadas en ARM en módulo [pdf] Instrucciones MSC SM2S-IMX8M, MSC SM2S-IMX8M Depurar computadoras con puerto UART en módulo basado en ARM, depurar computadoras con puerto UART en módulo basado en ARM, puerto UART Computadoras basadas en ARM en módulo, puerto Computadoras basadas en ARM en módulo, Computadoras basadas en ARM en módulo, Computadoras basadas en Módulo, Computadoras en Módulo, Módulo |