UART3 RX 在 TI Omap AM335x Sitara Variscite 开发板上保持高电平(强上拉)
UART3 RX being held hi (strong pullup) on TI Omap AM335x Sitara Variscite Dev board
我有一个
- Variscite VAR-SOM-AM33 SoM 和开发板 (VAR-AM33CustomBoard)
我正在尝试让 UART3 与
一起工作
- Sparkfun FTDI Basic Breakout - 3.3V TTL UART 转 USB 适配器(http://sfe.io/p9873)
令人费解的部分总结:我也在研究基于这个 Variscite 开发板的自定义 SoM 载板,我知道当我切割走线时 UART0 工作得很好并且连接我的 Sparkfun UART/USB。因此,UART0 与 UART3 的配置方式明显不同。
软件
我在很多项目中都使用过这种 FTDI USB 适配器,它总是很好用。这是我尝试在开发板上启用 UART3 的方法:
用于 AM335x 的 TI 基于 Web 的 PinMux 配置(http://dev.ti.com/pinmux)
- 只有 RXD 和 TXD 的 UART3
- UART 引脚
- C15 为 RXD,无拉动(顺便说一句,与 UART0 不同)
- C18为TXD,拉低(顺便说一下UART0)
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' 个字符
从嵌入式会话中键入时,但从桌面会话中键入时,嵌入式端未收到任何字符。
嵌入式串行终端
- 我在嵌入式终端上输入三个 'a' 个字符。
- 我没有收到从桌面终端输入的任何字符
输出:
root@varsomam33:~# ./miniterm -d/dev/ttyO3
************ REMOTE CONSOLE: CTRL-] TO QUIT ********
桌面串行终端
- 注意我在桌面上收到了三个 'a' 字符。
- 我在此终端中键入 't',但它没有显示在嵌入式终端中。
输出:
# ./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 设备则不能。
我有一个
- Variscite VAR-SOM-AM33 SoM 和开发板 (VAR-AM33CustomBoard)
我正在尝试让 UART3 与
一起工作- Sparkfun FTDI Basic Breakout - 3.3V TTL UART 转 USB 适配器(http://sfe.io/p9873)
令人费解的部分总结:我也在研究基于这个 Variscite 开发板的自定义 SoM 载板,我知道当我切割走线时 UART0 工作得很好并且连接我的 Sparkfun UART/USB。因此,UART0 与 UART3 的配置方式明显不同。
软件
我在很多项目中都使用过这种 FTDI USB 适配器,它总是很好用。这是我尝试在开发板上启用 UART3 的方法:
用于 AM335x 的 TI 基于 Web 的 PinMux 配置(http://dev.ti.com/pinmux)
- 只有 RXD 和 TXD 的 UART3
- UART 引脚
- C15 为 RXD,无拉动(顺便说一句,与 UART0 不同)
- C18为TXD,拉低(顺便说一下UART0)
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' 个字符 从嵌入式会话中键入时,但从桌面会话中键入时,嵌入式端未收到任何字符。
嵌入式串行终端
- 我在嵌入式终端上输入三个 'a' 个字符。
- 我没有收到从桌面终端输入的任何字符
输出:
root@varsomam33:~# ./miniterm -d/dev/ttyO3
************ REMOTE CONSOLE: CTRL-] TO QUIT ********
桌面串行终端
- 注意我在桌面上收到了三个 'a' 字符。
- 我在此终端中键入 't',但它没有显示在嵌入式终端中。
输出:
# ./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 设备则不能。