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

时间:2017-03-07 23:19:19

标签: linux serial-port embedded-linux uart texas-instruments

我有一个

  • Variscite VAR-SOM-AM33 SoM和开发板(VAR-AM33CustomBoard)

我正试图让UART3与

一起工作

令人费解的部分总结:我也在开发基于这款Variscite开发板的定制SoM载板,我知道当我切断迹线并连接我的Sparkfun UART时,UART0工作正常/USB。因此,UART0的配置与UART3的区别显然不同。

软件

我在许多项目中使用过这个精确的FTDI USB适配器,它总是很好用。这是我试图在开发板上启用UART3的原因:

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

  • 仅限RXD和TXD的UART3
  • UART引脚
    • C15是RXD,No Pull(顺便说一下UART0)
    • C18是TXD,Pull Down(就像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重构内核/设备树:

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

如果我们使用endian修复输出值(我的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;

接下来我将使用Sparkfun设备(在本例中为/ dev / ttyUSB1)和我的桌面Linux机器上打开串行终端 嵌入式端(/ 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 Logic Analyzer屏幕截图

UART3 TX在0和3.3V之间看起来很好

enter image description here

UART3 RX仅从3.3V

降至2.5V

enter image description here

结束语:

到目前为止,我测试的真相表。请注意,当我说它不起作用时,它会出现上述问题(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

感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:0)

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

对于定制板上的UART1,问题是UART1连接在SoM本身上,连接到WiFi /蓝牙芯片。这并不明显,因为Variscite不会发布SoM原理图。但是,它们在载板原理图中有一些模糊的注意事项“未安装on-SOM蓝牙时启用UART1”。

在载板上,UART1连接到SN74AVC4T245总线收发器,该收发器通过GPIO打开/关闭。问题是UART1在与总线收发器接口时实际上运行良好。因此,在开发载板上进行测试,UART1工作正常,没有人会更聪明。只有当您移除UART1不起作用的总线收发器时才会这样。

最后,我唯一的结论是总线收发器能够容忍处理2.5V - 3.3V的逻辑电平,而普通的UART器件却不能。