我有一个
华力士VAR-SOM-AM33 SOM和开发板(VAR-AM33客户板)
我想让UART3和
Sparkfun FTDI基本分接-3.3V TTL UART到USB适配器(http://sfe.io/p9873)
令人费解的部分总结:我也在研究一个基于这个Variscite开发板的定制SoM载体板,我知道当我切割轨迹并连接我的Sparkfun UART/USB时,UART0工作得非常好。因此,在配置UART0的方式与配置UART3的方式上显然存在差异。
软件
我在很多项目中都使用过这个确切的FTDI USB适配器,它总是很好的工作。下面是我试图在开发板上启用UART3的内容:
用于AM335x的基于TI网络的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
pin,所以我也删除了它的条目(在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内核服务器),并检查我们的设备树设置是否符合我们的预期:
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
Salae逻辑分析仪屏幕截图
UART3 TX在0到3.3V之间看起来不错
UART3 RX仅从3.3V降至2.5V
结束语:
到目前为止我的测试结果。请注意,当我说它不工作时,它显示出上述问题(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示意图。然而,他们确实在载波板示意图中有一个模糊的注释“在SOM上未安装蓝牙时启用UART1”。
在载波板上,UART1连接到SN74AVC4T245总线收发器,该收发器通过GPIO打开/关闭。问题是,当与总线收发器接口时,UART1实际上功能完美。因此,在dev承载板上测试,UART1工作得很好,没有人比他更聪明。只有当您卸下总线收发器时,UART1才不工作。
最后,我的唯一结论是,总线收发器可以处理2.5V-3.3V的逻辑电平,而普通的UART设备则不能。