UART3 RX 在 TI Omap AM335x Sitara Variscite 开发板上保持高电平(强上拉)

UART3 RX being held hi (strong pullup) on TI Omap AM335x Sitara Variscite Dev board

我有一个

我正在尝试让 UART3 与

一起工作

令人费解的部分总结:我也在研究基于这个 Variscite 开发板的自定义 SoM 载板,我知道当我切割走线时 UART0 工作得很好并且连接我的 Sparkfun UART/USB。因此,UART0 与 UART3 的配置方式明显不同。

软件

我在很多项目中都使用过这种 FTDI USB 适配器,它总是很好用。这是我尝试在开发板上启用 UART3 的方法:

用于 AM335x 的 TI 基于 Web 的 PinMux 配置(http://dev.ti.com/pinmux

Yocto 内核串行驱动程序选择

在默认内核串行 8250 堆栈的庞大范围内徘徊之后,我最终偶然发现了 omap-serial.c 驱动程序。我想看看它是否会神奇地解决我的问题,或者至少减少要筛选的代码(作为单个 .c 文件)。

所以我配置内核 (make menuconfig) 以禁用 8250 并启用 CONFIG_SERIAL_OMAP 在设备驱动程序->字符驱动程序->串行驱动程序中找到。

Yocto 内核设备树配置

TI Pinmux 生成此代码,我将其添加到我的 Yocto 环境的内核设备树中:

myuart3_pins_default: myuart3_pins_default {
    pinctrl-single,pins = <
        0x160 ( PIN_INPUT | MUX_MODE1 ) /* (C15) spi0_cs1.uart3_rxd */
        0x164 ( PIN_OUTPUT_PULLDOWN | MUX_MODE1 ) /* (C18) eCAP0_in_PWM0_out.uart3_txd */
    >;
};

我注意到编辑kernel-source/arch/arm/boot/dts/var-som-am33.dts时有一个名为spi1_pins_default的SPI设备使用0x164引脚,所以我删除了它也有条目(未显示在 git diff 中)。无论如何默认情况下不使用 SPI1,但我只是偏执。

这是我的设备树来源的git diff

diff --git a/arch/arm/boot/dts/var-som-am33.dts b/arch/arm/boot/dts/var-som-am33.dts
index 0fdb4e3..05fbd0a 100644
--- a/arch/arm/boot/dts/var-som-am33.dts
+++ b/arch/arm/boot/dts/var-som-am33.dts
@@ -263,6 +263,13 @@
                >;
        };

+       myuart3_pins_default: myuart3_pins_default {
+               pinctrl-single,pins = <
+                       0x160 ( PIN_INPUT | MUX_MODE1 ) /* (C15) spi0_cs1.uart3_rxd */
+                       0x164 ( PIN_OUTPUT_PULLDOWN | MUX_MODE1 ) /* (C18) eCAP0_in_PWM0_out.uart3_txd */
+               >;
+       };
+

@@ -533,11 +522,8 @@
 };

 &uart3 {
-       /*
-       pinctrl-names = "default", "sleep";
-       pinctrl-0 = <&uart3_pins_default>;
-       pinctrl-1 = <&uart3_pins_sleep>;
-       */
+       pinctrl-names = "default";
+       pinctrl-0 = <&myuart3_pins_default>;
        status = "okay";
 };

最后用 bitbake 重建 kernel/device 树:

yocto_varsomam33/tisdk/build $  MACHINE=varsomam33 bitbake -C compile linux-ti-variscite

验证设备树设置

构建内核和设备树后,启动它们(在我的例子中是 TFTP/nfs-kernel-server)并检查我们的设备树设置是否符合我们的预期:

root@varsomam33:~# find /sys/firmware/devicetree/ -name "*myuart*"
/sys/firmware/devicetree/base/ocp/l4_wkup@44c00000/scm@210000/pinmux@800/myuart3_pins_default
root@varsomam33:~# od -x /sys/firmware/devicetree/base/ocp/l4_wkup@44c00000/scm@210000/pinmux@800/myuart3_pins_default/pinctrl-single,pins
0000000     0000    6001    0000    2900    0000    6401    0000    0100
0000020

如果我们对输出值进行字节序修复(我的 busybox od 工具不支持 "od -t x1"),我们会看到:

PIN     |  VALUE
--------|-------
0x0160  | 0x0029
0x0164  | 0x0001

include/dt-bindings/pinctrl/am33xx.h

中的定义精确验证
#define PULL_DISABLE (1 << 3)
#define INPUT_EN     (1 << 5)

#define PIN_OUTPUT_PULLDOWN 0
#define MUX_MODE1   1

硬件

连接数:

Carrier board           | Sparkfun USB
------------------------|-------------
J18 pin 9  (UART3_RXD)  | TXO
J18 pin 10 (UART3_TXD)  | RXI
J15 pin 4  (Ground)     | GND

测试

我使用一个非常简单的 198 行串行终端程序,用 C 编写,在此处找到 (http://github.com/bradgrissom/miniterm)

多年来,我一直在各种嵌入式 linux 和桌面 linux 设备上使用它。它不使用流控制,如第 123 行所示:

newsertio.c_cflag = cooked_baud | CS8 | CLOCAL | CREAD;

接下来,我将在我的桌面 linux 机器上打开串行终端与 Sparkfun 设备(/dev/ttyUSB1 在这种情况下)和 嵌入式端(/dev/ttyO3)。我在每个终端会话中输入字符。注意桌面上收到了 'a' 个字符 从嵌入式会话中键入时,但从桌面会话中键入时,嵌入式端未收到任何字符。

嵌入式串行终端

输出:

root@varsomam33:~# ./miniterm -d/dev/ttyO3
************ REMOTE CONSOLE: CTRL-] TO QUIT ********

桌面串行终端

输出:

# ./miniterm -d/dev/ttyUSB1
************ REMOTE CONSOLE: CTRL-] TO QUIT ********
aaa

检查 UART 状态

注意我们已经在 UART3 上发送了一些字符但是没有收到任何

root@varsomam33:~# cat /proc/tty/driver/OMAP-SERIAL
serinfo:1.0 driver revision:
0: uart:OMAP UART0 mmio:0x44E09000 irq:155 tx:3080 rx:8 RTS|CTS|DTR|DSR
1: uart:OMAP UART1 mmio:0x48022000 irq:156 tx:0 rx:0 DSR|CD|RI
2: uart:OMAP UART2 mmio:0x48024000 irq:157 tx:0 rx:0 CTS|DSR
3: uart:OMAP UART3 mmio:0x481A6000 irq:158 tx:3 rx:0 CTS|DSR
4: uart:OMAP UART4 mmio:0x481A8000 irq:159 tx:0 rx:0 CTS|DSR
5: uart:OMAP UART5 mmio:0x481AA000 irq:160 tx:0 rx:0 CTS|DSR

Saleae 逻辑分析器屏幕截图

UART3 TX 在 0 和 3.3V 之间看起来不错

UART3 RX 仅从 3.3V 降至 2.5V

结束语:

到目前为止我的测试的真相 table。请注意,当我说它不起作用时,它会出现上述问题(2.5V 至 3.3V 摆幅)。

Board      |  UART   |  Configuration  |  Result
------------------------------------------------
Variscite  |  UART0  |  RS232 DCE      |  WORKS
Variscite  |  UART1  |  RS232 DTE      |  WORKS
Variscite  |  UART3  |  TTL/UART       |  NO WORK  (this is described in this post)
Custom     |  UART0  |  TTL/UART       |  WORKS
Custom     |  UART1  |  RS232 DTE      |  WORKS
Custom     |  UART1  |  TTL/UART       |  NO WORK  (used same procedure described in this post)

我觉得这与调制解调器控制线(流量控制)有关,我的配置设置没有被采用(根据 /proc/tty/driver/OMAP-SERIAL

感谢任何帮助,谢谢!

UART3 保持高电平,因为它还连接到 RS-485 芯片 (LTC2852) 的引脚 1。幸运的是,电路板设计人员知道他们在做什么,并在该线上连接了一个 0 欧姆电阻 (R83),所以删除它可以释放 UART3 的 RX 线。

至于自定义板上的 UART1,问题是 UART1 连接到 SoM 本身,连接到 WiFi/Bluetooth 芯片。这并不明显,因为 Variscite 不发布 SoM 原理图。然而,他们确实在载板示意图中有一些模糊的注释 "Enable UART1 when on-SOM Bluetooth is not mounted"。

在载板上,UART1 连接到 SN74AVC4T245 总线收发器,该收发器通过 GPIO 转 on/off。问题是 UART1 在与总线收发器接口时实际上功能完美。所以在开发载板上测试,UART1 工作完美,没有人是聪明的。只有当你去掉总线收发器时UART1不工作。

最后,我唯一的结论是总线收发器可以处理 2.5V - 3.3V 的逻辑电平,而普通的 UART 设备则不能。