I have a problem with serial communication on a custom carrier. I’m trying to
use uart2 with module iMX7D and I get a lot of timeouts in communication.
Same carrier driven by an iMX6DL module has not this issue.
Hardware designers used this scheme for pin design:
Signal Pin iMX7D Function iMX7D Pin SoC
GPIO_SODIMM_28 28 gpio1.IO[9] GPIO1_IO09
GPIO_SODIMM_29 29 gpio1.IO[7] GPIO1_IO07
GPIO_SODIMM_30 30 gpio1.IO[10] GPIO1_IO10
GPIO_SODIMM_32 32 gpio6.IO[21] SAI2_RXD
I2C_1_SCL 196 i2c4.SCL ENET1_TD2
I2C_1_SDA 194 i2c4.SDA ENET1_TD3
SD_1_CD_B 43 gpio1.IO[0] GPIO1_IO00
SD_1_CLK 47 usdhc1.CLK SD1_CLK
SD_1_CMD 190 usdhc1.CMD SD1_CMD
SD_1_DATA0 192 usdhc1.DATA0 SD1_DATA0
SD_1_DATA1 49 usdhc1.DATA1 SD1_DATA1
SD_1_DATA2 51 usdhc1.DATA2 SD1_DATA2
SD_1_DATA3 53 usdhc1.DATA3 SD1_DATA3
UART_A_RTS 27 uart1.RTS_B SAI2_TXC
UART_A_RX 33 uart1.TX UART1_TXD
UART_A_TX 35 uart1.RX UART1_RXD
UART_B_RTS 34 uart2.RTS_B SAI2_TXD
UART_B_RX 36 uart2.TX UART2_TXD
UART_B_TX 38 uart2.RX UART2_RXD
UART_C_RX 19 uart3.TX UART3_TXD
UART_C_TX 21 uart3.RX UART3_RXD
UART_D_RX 75 uart5.TX I2C4_SDA
UART_D_TX 96 uart5.RX I2C4_SCL
USB_C_DM 145 USB_OTG1_DN USB_OTG1_DN
USB_C_DP 143 USB_OTG1_DP USB_OTG1_DP
USB_H_DM 141 USB_OTG2_DN USB_OTG2_DN
USB_H_DP 139 USB_OTG2_DP USB_OTG2_DP
USB_H_OC 131 usb.OTG2_OC UART3_RTS
USB_H_PWR_EN 129 usb.OTG2_PWR UART3_CTS
I created this device tree override:
/dts-v1/;
#include "imx7d-colibri.dtsi"
#include "imx7-colibri-eval-v3.dtsi"
/ {
model = "Toradex Colibri iMX7D on xyz board";
version = "014";
compatible = "toradex,colibri_imx7d-eval", "toradex,colibri_imx7d", \
"fsl,imx7d";
};
&usbotg2 {
vbus-supply = <®_usb_otg2_vbus>;
status = "okay";
};
&iomuxc {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_hog_1 &pinctrl_hog_3 &pinctrl_hog_4 &pinctrl_hog_5 &pinctrl_gpioreset &pinctrl_gpioled>;
imx7d-colibri {
pinctrl_uart2: uart2grp {
fsl,pins = <
MX7D_PAD_UART2_TX_DATA__UART2_DTE_RX 0x79
MX7D_PAD_UART2_RX_DATA__UART2_DTE_TX 0x79
MX7D_PAD_SAI2_TX_DATA__UART2_DCE_RTS 0x79
>;
};
pinctrl_uart5: uart5grp {
fsl,pins = <
MX7D_PAD_I2C4_SDA__UART5_DTE_RX 0x79
MX7D_PAD_I2C4_SCL__UART5_DTE_TX 0x79
>;
};
pinctrl_gpioreset: gpioreset {
fsl,pins = <
MX7D_PAD_SAI2_RX_DATA__GPIO6_IO21 0x80 /* SoC PAD 32 */
>;
};
pinctrl_gpioled: gpioled {
fsl,pins = <
MX7D_PAD_GPIO1_IO09__GPIO1_IO9 0x80 /* SoC 28 - Blue */
MX7D_PAD_GPIO1_IO07__GPIO1_IO7 0x80 /* SoC 29 - Green*/
MX7D_PAD_GPIO1_IO10_GPR__GPIO1_I10 0x80 /* SoC 30 - Red*/
>;
};
};
};
&pwm2 {
// Possible conflicts with blue led:
// use pad GPIO1_IO09 as PWM2_OUT
status = "disabled";
};
&uart1 {
rs485-rts-delay = <0 0>;
linux,rs485-enabled-at-boot-time;
fsl,dte-mode;
fsl,uart-has-rtscts;
};
&uart2 {
rs485-rts-delay = <0 0>;
linux,rs485-enabled-at-boot-time;
fsl,dte-mode;
fsl,uart-has-rtscts;
};
&uart5 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_uart5>;
fsl,dte-mode;
status = "okay";
};
My doubts are around pin “SAI2_TX_DATA” (in pin designer this pin is referred
as “SAI2_TXD”): referring to pin design this pin must be connected to signal
UART_B_RTS. So, looking to header file imx7d-pinfunc.h I guessed that the
right configuration was: MX7D_PAD_SAI2_TX_DATA__UART2_DCE_RTS. These are all
the possible values related to that pin:
MX7D_PAD_SAI2_RX_DATA__SAI2_RX_DATA0
MX7D_PAD_SAI2_RX_DATA__ECSPI3_SCLK
MX7D_PAD_SAI2_RX_DATA__UART4_DCE_CTS
MX7D_PAD_SAI2_RX_DATA__UART4_DTE_RTS
MX7D_PAD_SAI2_RX_DATA__UART2_DCE_CTS
MX7D_PAD_SAI2_RX_DATA__UART2_DTE_RTS
MX7D_PAD_SAI2_RX_DATA__FLEXTIMER2_CH6
MX7D_PAD_SAI2_RX_DATA__GPIO6_IO21
MX7D_PAD_SAI2_RX_DATA__KPP_COL7
I also tried using MX7D_PAD_SAI2_TX_DATA__UART2_DTE_CTS configuration, but I
still get same communication issues.
Is my configuration right or I should use a different pin/signal?
Useful links:
-
[imx7-colibri.dtsi (pinctrl_uart2)] 3