专栏中心

EEPW首页 > 专栏 > Verdin iMX8MP 调试串口更改

Verdin iMX8MP 调试串口更改

发布人:toradex 时间:2024-03-08 来源:工程师 发布文章

By Toradex胡珊逢

简介

Verdin iMX8M Plus 具有四个串口,其中 UART3 是用于 A53 核心上的系统如 Linux 的默认调试串口,出于设计需要可能需要将调试口换到其他串口,文章将介绍如何使用 UART1 作调试串口。

 

硬件介绍

Verdin iMX8M Plus 的四个串口 UART1 ~UART4 中,UART3 为默认的 A53 调试串口,UART4 为 M7 调试串口,其余两个作为通用 UART 使用。Verdin 系列的模块均使用 1.8V TTL 电平,在连接外部设备时请先检查电压。本次测试使用的是 Dahlia 底板,在 X20 扩展接口 Pin12 和 Pin13 分别将模块的 UART1_RXD和 UART1_TXD 引出。四个串口的物理地址如下:

UART

起始地址

结束地址

UART1

0x3086_0000

0x3086_FFFF

UART2

0x3089_0000

0x3089_FFFF

UART3

0x3088_0000

0x3088_FFFF

UART4

0x30A6_0000

0x30A6_FFFF

 

软件修改

调试串口更改的软件涉及到三个部分,ATF、U-Boot 和 Linux。ATF 会和 U-Boot 等其他文件如 DDR 固件一起打包成用于 NXP i.MX 8M Plus 处理器的启动文件。这些文件的下载和编译请参考该网页。文章使用到的完整补丁请从这里下载。

ATF

ATF 代码的 imx8mp_bl31_setup.c 中,把 RDC_PDAP_UART1 划分到 A53 所在的 D0 域。

---------------------------

--- a/plat/imx/imx8m/imx8mp/imx8mp_bl31_setup.c
+++ b/plat/imx/imx8m/imx8mp/imx8mp_bl31_setup.c
@@ -53,7 +53,7 @@ static const struct imx_rdc_cfg rdc[] = {
RDC_MDAn(RDC_MDA_M7, DID1),
/* peripherals domain permission */
-RDC_PDAPn(RDC_PDAP_UART2, D0R | D0W),
+RDC_PDAPn(RDC_PDAP_UART1, D0R | D0W),

 

--- a/plat/imx/imx8m/imx8mq/include/platform_def.h
+++ b/plat/imx/imx8m/imx8mq/include/platform_def.h
@@ -60,6 +60,7 @@
#define HAB_RVT_BASEU(0x00000880) /* HAB_RVT for i.MX8MQ */
+#define IMX_BOOT_UART_BASEU(0x30860000)

---------------------------

platform_def.h 中指定 IMX_BOOT_UART_BASE 为 UART1 的物理地址 0×30860000。如果不在这里定义,在编译的时候添加 IMX_BOOT_UART_BASE=0×30860000 参数也可。

make PLAT=imx8mp IMX_BOOT_UART_BASE=0x30860000 bl31

编译成功后在 build/imx8mp/release/ 目录下生成 bl32.bin 文件。

 

U-Boot

Linux BSP v6 中对应 toradex_imx_lf_v2022.04 分支 U-Boot 在修改外设接口配置时也使用了 device tree。例如在 imx8mp-verdin-u-boot.dtsi 中配置 UART1 对应的 pinctrl_uart1,并删除原来的 pinctrl_uart1。

---------------------------

--- a/arch/arm/dts/imx8mp-verdin-u-boot.dtsi
+++ b/arch/arm/dts/imx8mp-verdin-u-boot.dtsi
@@ -134,7 +134,7 @@
      u-boot,off-on-delay-us = <20000>;
};

-&pinctrl_uart3 {
+&pinctrl_uart1 {
      u-boot,dm-spl;
};

@@ -174,7 +174,7 @@
      u-boot,dm-spl;
};

-&uart3 {
+&uart1 {
      u-boot,dm-spl;
};

---------------------------

 

在 imx8mp-verdin.dts 中修改 stdout-path 的启动参数以及 UART1 所使用的引脚配置。earlycon 可用于 SPL 的调试输出。

--- a/arch/arm/dts/imx8mp-verdin.dts
+++ b/arch/arm/dts/imx8mp-verdin.dts
      chosen {
-               bootargs = "console=ttymxc2,115200 earlycon";
-               stdout-path = &uart3;
+               bootargs = "console=ttymxc0,115200 \
+               earlycon=ec_imx6q,0x30860000,115200";
+               stdout-path = &uart1;
      };


-/* Verdin UART3 */
-&uart3 {
+/* Verdin UART1 */
+&uart1 {
      /* console */
      pinctrl-names = "default";
-       pinctrl-0 = <&pinctrl_uart3>;
+       pinctrl-0 = <&pinctrl_uart1>;
      status = "okay";
};


-       pinctrl_uart3: uart3grp {
+       pinctrl_uart1: uart1grp {
              fsl,pins = <
-                       MX8MP_IOMUXC_UART3_RXD__UART3_DCE_RX    0x49
-                       MX8MP_IOMUXC_UART3_TXD__UART3_DCE_TX    0x49
+                       MX8MP_IOMUXC_UART1_RXD__UART1_DCE_RX    0x49
+                       MX8MP_IOMUXC_UART1_TXD__UART1_DCE_TX    0x49

---------------------------

 

verdin-imx8mp.c 中需要初始化 UART1 的时钟。

---------------------------

--- a/board/toradex/verdin-imx8mp/verdin-imx8mp.c
+++ b/board/toradex/verdin-imx8mp/verdin-imx8mp.c
/* Verdin UART_3, Console/Debug UART */
static const iomux_v3_cfg_t uart_pads[] = {
-       MX8MP_PAD_UART3_RXD__UART3_DCE_RX | MUX_PAD_CTRL(UART_PAD_CTRL),
-       MX8MP_PAD_UART3_TXD__UART3_DCE_TX | MUX_PAD_CTRL(UART_PAD_CTRL),
+       MX8MP_PAD_UART1_RXD__UART1_DCE_RX | MUX_PAD_CTRL(UART_PAD_CTRL),
+       MX8MP_PAD_UART1_TXD__UART1_DCE_TX | MUX_PAD_CTRL(UART_PAD_CTRL),
};

      imx_iomux_v3_setup_multiple_pads(uart_pads, ARRAY_SIZE(uart_pads));

-       init_uart_clk(2);
+       init_uart_clk(0);

      return 0;
}

---------------------------

 

在 include/configs/verdin-imx8mp.h 将 CONFIG_MXC_UART_BASE 的地址也设置为 UART1。同时修改 console。

---------------------------

--- a/include/configs/verdin-imx8mp.h
+++ b/include/configs/verdin-imx8mp.h
      "boot_script_dhcp=" BOOT_SCRIPT "\0" \
-       "console=ttymxc2\0" \
+       "console=ttymxc0\0" \
      "fdt_board=dev\0" \

@@ -111,7 +111,7 @@
#define PHYS_SDRAM_2_SIZE              (SZ_4G + SZ_1G)

/* UART */
-#define CONFIG_MXC_UART_BASE           UART3_BASE_ADDR
+#define CONFIG_MXC_UART_BASE           UART1_BASE_ADDR

/* Monitor Command Prompt */
#define CONFIG_SYS_CBSIZE              SZ_2K

---------------------------

 

Linux

Linux 的 device tree 同样也需要做修改。在 freescale/imx8mp-verdin-dev.dtsi 中取消 UART1 默认配置下的 RS485 功能。

---------------------------

--- a/arch/arm64/boot/dts/freescale/imx8mp-verdin-dev.dtsi
+++ b/arch/arm64/boot/dts/freescale/imx8mp-verdin-dev.dtsi
/* Verdin UART_1, connector X50 through RS485 transceiver */
&uart1 {
+       /*
      linux,rs485-enabled-at-boot-time;
      rs485-rts-active-low;
      rs485-rx-during-tx;
+       */
      status = "okay";
};

---------------------------

 

imx8mp-verdin.dtsi 中更改 stdout-path 调试串口输出至 UART1,并删除 RTS 和 CTS 功能引脚。

---------------------------

--- a/arch/arm64/boot/dts/freescale/imx8mp-verdin.dtsi
+++ b/arch/arm64/boot/dts/freescale/imx8mp-verdin.dtsi
@@ -8,7 +8,7 @@

/ {
      chosen {
-               stdout-path = &uart3;
+               stdout-path = &uart1;
      };

      aliases {
@@ -891,7 +891,7 @@ &snvs_pwrkey {
&uart1 {
      pinctrl-names = "default";
      pinctrl-0 = <&pinctrl_uart1>;
-       uart-has-rtscts;
+       /* uart-has-rtscts; */
};

/* Verdin UART_2 */
@@ -1331,8 +1331,8 @@ pinctrl_sai3: sai3grp {

  pinctrl_uart1: uart1grp {
  fsl,pins =
-      <MX8MP_IOMUXC_SAI2_RXD0__UART1_DCE_RTS          0x1c4>, /* SODIMM 135 */
-      <MX8MP_IOMUXC_SAI2_TXFS__UART1_DCE_CTS          0x1c4>, /* SODIMM 133 */
+      /* <MX8MP_IOMUXC_SAI2_RXD0__UART1_DCE_RTS               0x1c4>,  SODIMM 135 */
+      /* <MX8MP_IOMUXC_SAI2_TXFS__UART1_DCE_CTS               0x1c4>,  SODIMM 133 */

---------------------------

 

修改完毕上述文件后重新编译 flash.bin(imx-boot)和 device tree 文件,并将其放入支持 Toradex Easy Installer 烧录的镜像文件中。同时也需要修改镜像文件中的 u-boot-initial-env-sd,将 console 改为 console=ttymxc0。该文件会在烧录系统时配置 U-Boot 环境变量。安装完镜像后,在 UART1 即可看到启动日志。

 

 

总结

 

通过上述几个文件的修改,可以切换 A53 调试串口。对于 Linux 系统通常建议保留一个调试串口,这将有利于调试和后期其他问题排查。


专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们

关键词: ARM UART Linux iMX8MP NXP Toradex Verdin

相关推荐

基于 Zephyr 实时操作系统与恩智浦平台搭建可扩展嵌入式系统

WinCE+ARM开发及关键技术 上

视频 2009-10-22

Arm CEO:AI智能体将推动CPU核心数升至 512

网络与存储 2026-05-11

最新ARM技术和嵌入式技术发展动态 下

视频 2009-10-22

走进智能工厂 为何智能诊断是持续运行的关键

WinCE+ARM开发及关键技术 下

视频 2009-10-22

arm学习资料

资源下载 2007-12-03

安谋科技Arm China与国民技术签署Arm Total Access授权许可协议,加速AI时代MCU灵活创新与高效落地

Arm遭遇监管危机:FTC针对其技术授权启动反垄断调查

2026-05-18

汽车暖通空调(HVAC)控制参考设计

边缘 AI 加速的 Arm Cortex‑M0+ MCU 如何为电子产品注入更强智能

ARM 展示小型低功耗上网本样品

视频 2009-03-16

Arm宣布推出Performix,为开发者带来 AI 时代必备的可扩展性能

ARM开发详解

Arm财报过山车:营收创纪录,股价跌7%

最新ARM技术和嵌入式技术发展动态 中

视频 2009-10-22

ARM嵌入式软件编程经验谈

ARM Axion 处理器加持谷歌第八代 TPU,云端全面转向智能体 AI 架构

ARM嵌入式系统开发

ARM嵌入式系统开发:软件设计与优化

更多 培训课堂
更多 焦点
更多 视频

技术专区