核心板中各个串口默认工作在DCE模式除非在设备树中配置以下配置:

https://elixir.bootlin.com/linux/latest/source/Documentation/devicetree/bindings/serial/fsl-imx-uart.txt

Optional properties:
- fsl,dte-mode : Indicate the uart works in DTE mode. The uart works
                  in DCE mode by default.

DCE模式意为着信号在uart模块中不交叉

UARTn_UFCR[DCEDTE]=0 (DCE mode)

UARTn_UFCR[DCEDTE]=1 (DTE mode)

而配置DTE模式后,uart信号在uart模块中交叉。

注意iomux中,并不能做交叉,在i.MX6ul的设备树配置中,每个uart口的寄存器,都有两个配置:

https://elixir.bootlin.com/linux/latest/source/arch/arm/boot/dts/imx6ul-pinfunc.h

                                              <mux_reg conf_reg input_reg mux_mode input_val>

#define MX6UL_PAD_UART5_TX_DATA__UART5_DCE_TX 0x00bc 0x0348 0x0000 0 0
#define MX6UL_PAD_UART5_TX_DATA__UART5_DTE_RX 0x00bc 0x0348 0x0644 0 4
...
#define MX6UL_PAD_UART5_RX_DATA__UART5_DCE_RX		0x00c0 0x034c 0x0644 0 5
#define MX6UL_PAD_UART5_RX_DATA__UART5_DTE_TX		0x00c0 0x034c 0x0000 0 0

这两个的意思并不是要把mux配成tx或rx,他们对于iomux中的 SW_MUX_CTL_PAD_UART5_TX_DATA这个mux寄存器的配置是一样的,都是 ALT0,UART5_TX。

但如果配置了DTE模式,由于uart模块内部进行了交叉,uart_tx变成了rx,那么 UART5_RX_DATA_SELECT_INPUT这个寄存器的配置就必须要修改,否则会导致UART5_RX的输入路径配成了tx引脚,导致可以发送,但无法接收。

也就是说,如果要使用非默认的DTE模式,除了前面说的要在uart设备树节点配置fsl,dte-mode以外,mux也要改过来。而如果使用DCE的mux,就不能加fsl,dte-mode这个配置。

那么这里就总结一下i.MX6ul下的用法。

情况串口模式mux设备树配置
正常设计DCE模式使用pinfunc.h中的DCE配置
硬件设计失误,rx/tx反了DTE模式使用pinfunc.h中的DTE配置,增加fsl,dte-mode

请勿将串口配置中的DCE和mux中的DTE交叉混用。

参考资料:

  • No labels