常见问题
8 Jul 2024
Read time: 2 minute(s)
端口非 tty 设备
现象
[aic@] # test_uart -N /dev/ttyS1 /detv/ttySw2 1145200
[2022-01-26 16:23:43] Test Mode: 0:Normal Test
[2022-01-26 16:23:43] Send Device : /dev/ttyS1
[2022-01-26 16:23:43] Receive Device : /dev/ttyS2
[2022-01-26 16:23:43] m_Baudrate : 115200
[2022-01-26 16:23:43] standard input is not a terminal device for /dev/ttyS1
[2022-01-26 16:23:43] tcgetattr: Bad file descriptor
[2022-01-26 16:23:43] standard input is not a terminal device for /dev/ttyS2
[2022-01-26 16:23:43] tcgetattr: Bad file descriptor
[aic@] # echo 111 > /dev/ttyS1
write error: Input/output error
原因分析
原因新版 IC 系统修改了 UART Clk 的地址,dts
中未同步修改,导致设备虽然进行了初始化,但模块无数据读写
[aic@] # devmem 0x18711000 32
[2022-02-07 09:23:06] 0x00000000 //uart 的所有寄存器读不到数据,clk 未工作
长包卡死
现象
发送 128 字节以内的短包,模块可正常收发,发送超过 128 字节的长包,会卡死
原因分析
D211 RX DMA 要求严格设置 DMA RX size,如果该 size 设置不对,则会有如下问题:
-
如果 fifo 中有数据 150,而设置 rx size 为 120,则丢失 30 数据
-
如果 fifo 中有数据 150,而设置 rx size 为 160, 则永远无法填充满,则永远收不回数据,卡死
目前默认的 8250 驱动中,设置的 rx size 为 1000,但 fifo 的大小只有 256,因此永远无法填充完成,故导致系统卡死。
初始化乱码现象
现象
reboot 测试中发现 Linux 初始化 UART 时输出乱码 0xFF,导致接收端 Python 脚本 断开
原因分析
8250 驱动因为要兼容很多 IC,因此初始化时有一个自动 try 的机制:autoconfig,通过对硬件模块的测试来确认 IP 类型和特殊功能,此自动 try 工作会频繁操作寄存器,既可能造成不确定的影响(输出上述乱码),也会增加系统开销,而我们 UART 模块特性固定,可以预先进行配置,不进行 try。
autoconfig 的核心是设置了 port->type 为 PORT_16550A,我们直接设置 type 后即可不使用 autoconfig 流程。关闭
autoconfig
的流程为:
aic8250_probe:
p->type = PORT_16550A;
p->flags = UPF_FIXED_TYPE;
uart_configure_port:
if (!(port->flags & UPF_FIXED_TYPE)) {
port->type = PORT_UNKNOWN;
flags |= UART_CONFIG_TYPE;
}
serial8250_config_port:
if (flags & UART_CONFIG_TYPE)
autoconfig(up);