0

抱歉,如果这是这个问题的错误地方,我目前不确定问题在哪个级别,所以我有点对冲我的赌注。

系统是一个 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 黑客,所以我完全有可能在内核代码、初始化序列等方面遗漏了一些明显/愚蠢的东西。

任何想法都非常感谢!

4

1 回答 1

0

好吧,Linux板上的一个不错的小伙子解决了它,我需要在mknod /dev/ttyS1 c 4 65某个地方插入一个。

这(显然)为什么会发生在我不知道的ttyS0端口或任何端口console,但现在重要的是它有效

关于我自己的知识/后代欢迎的原因的评论/进一步信息。

于 2013-10-17T12:45:01.163 回答