• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 博客專欄

    EEPW首頁 > 博客 > Verdin iMX8MP 調(diào)試串口更改

    Verdin iMX8MP 調(diào)試串口更改

    發(fā)布人:toradex 時間:2024-03-08 來源:工程師 發(fā)布文章

    By Toradex胡珊逢

    簡介

    Verdin iMX8M Plus 具有四個串口,其中 UART3 是用于 A53 核心上的系統(tǒng)如 Linux 的默認調(diào)試串口,出于設(shè)計需要可能需要將調(diào)試口換到其他串口,文章將介紹如何使用 UART1 作調(diào)試串口。

     

    硬件介紹

    Verdin iMX8M Plus 的四個串口 UART1 UART4 中,UART3 為默認的 A53 調(diào)試串口,UART4 M7 調(diào)試串口,其余兩個作為通用 UART 使用。Verdin 系列的模塊均使用 1.8V TTL 電平,在連接外部設(shè)備時請先檢查電壓。本次測試使用的是 Dahlia 底板,在 X20 擴展接口 Pin12 Pin13 分別將模塊的 UART1_RXDUART1_TXD 引出。四個串口的物理地址如下:

    UART

    起始地址

    結(jié)束地址

    UART1

    0x3086_0000

    0x3086_FFFF

    UART2

    0x3089_0000

    0x3089_FFFF

    UART3

    0x3088_0000

    0x3088_FFFF

    UART4

    0x30A6_0000

    0x30A6_FFFF

     

    軟件修改

    調(diào)試串口更改的軟件涉及到三個部分,ATFU-Boot LinuxATF 會和 U-Boot 等其他文件如 DDR 固件一起打包成用于 NXP i.MX 8M Plus 處理器的啟動文件。這些文件的下載和編譯請參考該網(wǎng)頁。文章使用到的完整補丁請從這里下載

    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 參數(shù)也可。

    make PLAT=imx8mp IMX_BOOT_UART_BASE=0x30860000 bl31

    編譯成功后在 build/imx8mp/release/ 目錄下生成 bl32.bin 文件。

     

    U-Boot

    Linux BSP v6 中對應(yīng) toradex_imx_lf_v2022.04 分支 U-Boot 在修改外設(shè)接口配置時也使用了 device tree。例如在 imx8mp-verdin-u-boot.dtsi 中配置 UART1 對應(yīng)的 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 的啟動參數(shù)以及 UART1 所使用的引腳配置。earlycon 可用于 SPL 的調(diào)試輸出。

    --- 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 的地址也設(shè)置為 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 調(diào)試串口輸出至 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.binimx-boot)和 device tree 文件,并將其放入支持 Toradex Easy Installer 燒錄的鏡像文件中。同時也需要修改鏡像文件中的 u-boot-initial-env-sd,將 console 改為 console=ttymxc0。該文件會在燒錄系統(tǒng)時配置 U-Boot 環(huán)境變量。安裝完鏡像后,在 UART1 即可看到啟動日志。

     

     

    總結(jié)

     

    通過上述幾個文件的修改,可以切換 A53 調(diào)試串口。對于 Linux 系統(tǒng)通常建議保留一個調(diào)試串口,這將有利于調(diào)試和后期其他問題排查。


    *博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。



    關(guān)鍵詞: ARM UART Linux iMX8MP NXP Toradex Verdin

    相關(guān)推薦

    技術(shù)專區(qū)

    關(guān)閉
    主站蜘蛛池模板: 河南省| 永平县| 子洲县| 陵川县| 柏乡县| 奉贤区| 大余县| 荔浦县| 望谟县| 颍上县| 菏泽市| 上饶县| 永福县| 获嘉县| 肥东县| 青浦区| 寿阳县| 永昌县| 鹿邑县| 浦江县| 巴楚县| 响水县| 来宾市| 济源市| 桃园县| 临朐县| 鹿邑县| 腾冲县| 克什克腾旗| 凯里市| 沿河| 永济市| 岢岚县| 布拖县| 开江县| 井冈山市| 衡山县| 东方市| 奉节县| 济阳县| 衡阳市|