[问题咨询]RK3308 UART TX正常,但RX异常(应用层不能接收到数据)

固件类型:自行编译的固件
SDK包名称:Firefly-RK3308_Linux_SDK_git_20190924
SDK更新到哪个COMMIT:2021-12-17 22:03:00
SDK修改内容:diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3308b-roc-cc-plus-amic_emmc.dts b/kernel/arch/arm64/boot/dts/rockchip/rk3308b-roc-cc-plus-amic_emmc.dts
index d97f0c9..3138ae7 100644
— a/kernel/arch/arm64/boot/dts/rockchip/rk3308b-roc-cc-plus-amic_emmc.dts
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3308b-roc-cc-plus-amic_emmc.dts
@@ -162,12 +162,24 @@
rockchip,serial-id = <4>;
};

+&uart1 {
+ status = "okay";
+};
+
&uart4 {
status = "disabled";
};

+&i2c0 {
+ status = "disabled";
+};
+
+&spi2 {
+ status = "disabled";
+};
+
&sdmmc {
- status = "okay";
+ status = "disabled";
};
Log日志:UART接收不到数据.log

【问题描述】
按照上面的dts修改,使能uart1(默认RX——GPIO1_D0,TX——GPIO1_D1),测试uart1能正确TX,但RX不到数据。

【测试拓扑】
开发板uart1------杜邦线------USB转串口板–PC

【测试方案】
方案1:
1)echo “abcd” > /dev/ttyS1,PC sscom能收到数据。
2)cat /dev/ttyS1,PC sscom发送数据,但开发板调试串口没有收到数据。
方案2:
编写应用层测试程序,open ttyS1,write后,PC sscom能接收到数据;但PC发送数据,程序不能read到数据。

【问题分析】
1、PC发送数据后,在PC sscom能收到发出去的一部分数据。可能是开发板串口驱动做了RX后的回显处理?
2、读取GPIO1D_IOMUX(io -4 -r 0xFF000038),值是0x0000005,故能确认是IO复用是正确配置了UART1的TX和RX的。

【备注】
测试了uart0、uart2、uart3,存在相同问题。

【问题咨询】
1、请问应该要如何跟进本问题?
2、计划跟进驱动代码,请问驱动最早RX到数据的是哪部分代码?
主要是要跟进“kernel/drivers/tty/serial/8250”的串口驱动代码?
3、怀疑是UART RX做了回显处理的话,是否有哪些寄存器可以进行确认?

tchip_askquestions
UART接收不到数据.log (39 KB)

本帖最后由 谷月轩 于 2022-3-25 17:50 编辑

确认是默认tty配置导致的问题。可能和默认使用ttyFIQ0来进行打印相关。
应用层临时按照如下修改,可正常TX和RX,串口相关配置详细说明待补充。
struct termios options;
ret = tcgetattr(fd, &options);

options.c_cflag = 0x18b3;
options.c_lflag = 0;
options.c_iflag = 0;
options.c_oflag = 0;
cfsetispeed(&options, B9600); /* 输入波特率 */
cfsetospeed(&options, B9600); /* 输出波特率 */

ret = tcsetattr(fd, TCSANOW, &options);

关于回显的问题,确认驱动中初始化tty时,n_tty_set_termios()有L_ECHO(tty)的属性,导致的回显。