抱歉,如果这是这个问题的错误地方,我目前不确定问题在哪个级别,所以我有点对冲我的赌注。
系统是一个 LeopardBoard DM368,运行 TI 自己的 SDK/LSP/BusyBox 内核。
默认情况下,系统启用了一个 UART,UART0,挂载为 /dev/ttyS0,它也通过 bootargs 使用/调用console=ttyS0,115200n8 earlyprintk
。
我们希望将 UART1 启用为 /dev/ttyS1,因此已经完成了设置 pinmux、时钟等的低级板初始化代码。
在启动时,低级 init 报告(通过我添加的 printk)它启用了 UART1,并且驱动程序代码也报告了快乐:
[ 0.547812] serial8250.0: ttyS0 at MMIO 0x1c20000 (irq = 40) is a 16550A
[ 0.569849] serial8250.0: ttyS1 at MMIO 0x1d06000 (irq = 41) is a 16550A
但是,该端口不会(可靠地)出现在 /dev/ 中,并且它的状态(流量控制位)存在差异,我怀疑这可能导致它挂起/从不传输:
cat /proc/tty/driver/serial
serinfo:1.0 driver revision:
0: uart:16550A mmio:0x01C20000 irq:40 tx:97998 rx:0 CTS|DSR
1: uart:16550A mmio:0x01D06000 irq:41 tx:0 rx:0 DSR
如果我尝试从命令行修改它,我会收到错误消息:
>: stty -F /dev/ttyS1
stty: /dev/ttyS1: Inappropriate ioctl for device
奇怪的是,如果我将 bootargs 更改为console=ttyS1,115200n8 earlyprintk
端口可以正常工作,并且 ttyS0 已正确初始化并且也可以正常工作:
cat /proc/tty/driver/serial
serinfo:1.0 driver revision:
0: uart:16550A mmio:0x01C20000 irq:40 tx:0 rx:0 CTS|DSR
1: uart:16550A mmio:0x01D06000 irq:41 tx:11563 rx:0 RTS|DTR|DSR
现在,这很好,但我们的引导加载程序必须使用 UART0,因此最好将所有控制台内容保留在 ttyS0 上,并为我们的辅助通信使用 ttyS1。
编辑添加:我在serial_core.c中插入了几个printk,似乎从未为ttyS1调用uart_open(),我假设它是Linux初始化/启动序列中需要修改的东西?
我现在要声明,我不是一个顽固的 Linux 黑客,所以我完全有可能在内核代码、初始化序列等方面遗漏了一些明显/愚蠢的东西。
任何想法都非常感谢!