博客专栏

EEPW首页>博客> Verdin iMX8MP 调试串口更改

Verdin iMX8MP 调试串口更改

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

By Toradex胡珊逢

简介

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

硬件介绍

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

UART

起始地址

结束地址

UART1

0x3086_0000

0x3086_FFFF

UART2

0x3089_0000

0x3089_FFFF

UART3

0x3088_0000

0x3088_FFFF

UART4

0x30A6_0000

0x30A6_FFFF

软件修改

调试串口更改的软件涉及到三个部分,ATFU-BootLinuxATF会和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_BASEUART1的物理地址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.hCONFIG_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

Linuxdevice 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,并删除RTSCTS功能引脚。

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

--- 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 =
- , /* SODIMM 135 */
- , /* SODIMM 133 */
+ /* , SODIMM 135 */
+ /* , SODIMM 133 */

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

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

总结

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


*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。




相关推荐

技术专区

关闭