serial-port - ttyO 端口在 beagleboard-xm 的 QEMU 1.4.0 运行镜像上没有正确的端口地址

标签 serial-port embedded virtual-machine qemu beagleboard

我正在 QEMU 13.04 的 1.4.0 模拟器 Ubuntu 发行版上为 beagleboard-xm 运行 Linux 镜像(内核 3.2.8)。我的图像是使用 Buildroot beagle_defconfig 创建的。我添加了一些 pkgs 以便能够进行一些调试。

QEMU 调用 cmd:

`$ sudo qemu-system-arm -M beaglexm -m 1024 -sd ./test.img -clock unix -serial stdio -device usb-mouse -device usb-kbd -serial pty -serial pty`
[sudo] password for emperador: 

char device redirected to /dev/pts/3 (label serial1)
char device redirected to /dev/pts/4 (label serial2)

我想要做的是在 guest 和主机之间通过串行 guest 上存在的 4 个不同 ttyO 进行通信。 QEMU 提供了将流量重定向到主机端某个设备的工具。我的问题是这样的:

在 guest 内核启动时,我可以看到我的 UART 已启用
[    2.682040] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
[    2.777947] omap_uart.0: ttyO0 at MMIO 0x4806a000 (irq = 72) is a OMAP UART0
[    2.794967] omap_uart.1: ttyO1 at MMIO 0x4806c000 (irq = 73) is a OMAP UART1
[    2.814942] omap_uart.2: ttyO2 at MMIO 0x49020000 (irq = 74) is a OMAP UART2
[    2.966825] console [ttyO2] enabled
[    2.984777] omap_uart.3: ttyO3 at MMIO 0x49042000 (irq = 80) is a OMAP UART3

事实上,当我进去看到/proc/tty/driver我在 OMAP-SERIAL 上做了一只猫 我能看到这个
serinfo:1.0 驱动版本:
0: uart:OMAP UART0 mmio:0x4806A000 irq:72 tx:0 rx:0 CTS|DSR|CD
1: uart:OMAP UART1 mmio:0x4806C000 irq:73 tx:0 rx:0 CTS|DSR|CD
2: uart:OMAP UART2 mmio:0x49020000 irq:74 tx:268 rx:37 RTS|CTS|DTR|DSR|CD
3: uart:OMAP UART3 mmio:0x49042000 irq:80 tx:0 rx:0 CTS|DSR|CD

我知道 ttyO2 正在工作,因为我的控制台已重定向到它。问题是在任何 ttyO 上执行 set serial 我收到以下消息:
 [root@enu driver]# setserial -a /dev/ttyO0
/dev/ttyO0, Line 0, UART: undefined, Port: 0x0000, IRQ: 72
    Baud_base: 3000000, close_delay: 50, divisor: 0
    closing_wait: 3000
    Flags: spd_normal

ttyO2 也是如此。
我尝试使用 setserial 为任何 ttyO 设置一些设置但我总是收到相同的信息:
[root@enu ~]# setserial /dev/ttyO0 uart 8250                              
setserial: can't set serial info: Invalid argument
[root@enu ~]# setserial /dev/ttyO0 port 0x4806a000
setserial: can't set serial info: Invalid argument

一边看着客人/proc/tty/drives这就是我们所看到的
/dev/tty             /dev/tty        5       0 system:/dev/tty
/dev/console         /dev/console    5       1 system:console
/dev/ptmx            /dev/ptmx       5       2 system
/dev/vc/0            /dev/vc/0       4       0 system:vtmaster
sdio_uart            /dev/ttySDIO  249 0-7 serial
acm                  /dev/ttyACM   166 0-31 serial
ttyprintk            /dev/ttyprintk   5       3 console
OMAP-SERIAL          /dev/ttyO     253 0-3 serial
serial               /dev/ttyS       4 64-95 serial
pty_slave            /dev/pts      136 0-1048575 pty:slave
pty_master           /dev/ptm      128 0-1048575 pty:master
unknown              /dev/tty        4 1-63 console

基本上我想在 guest 和主机之间建立串行通信,但是 guest 端的串行端口没有配置好。
/sys/class/tty显示 tty 驱动程序已链接到串行设备。

我之前出现过吗,只有 omap uarts 被初始化并附加到 ttyO*。请注意,控制台已被内核配置重定向到 ttyO2。但是因为我加了 -serial stdio ,控制台被重定向到调用 QEMU 的终端。

如果我首先使用 -serial pty 重定向控制台而不是 -serial stdio ,我可以通过打开在主机端创建的 pty 来提示 minicom 中的控制台。在主机端创建的用于跨其他端口通信的其他 pty 仍然没有发生任何事情。

在主机端我打开 /dev/pts/3/dev/pts/4使用 minicom 或通过做 cat在他们

在客人方面:

我什么时候做 echo "test" > /dev/ttyO0或 1 或 3 什么都没有。但是当我在 ttyO2 上执行此操作时,控制台终端上会出现“测试”提示(这是正常的)。

现在使用任何 ttyS 时:
echo "test" > /dev/ttyS0

我得到
-bash: echo: write error: Input/output error

我对这个错误做了一些研究,我发现这可能是很多事情。但我注意到的一件事是,除了串行之外没有任何设备分配给 ttyS。并查看/proc/tty/driver/serial 我们看到:
serinfo:1.0 driver revision:
0: uart:unknown port:00000000 irq:0
1: uart:unknown port:00000000 irq:0
2: uart:unknown port:00000000 irq:0
3: uart:unknown port:00000000 irq:0

还有setserial -a /dev/ttyS0确认这一点:
/dev/ttyS0, Line 0, UART: unknown, Port: 0x0000, IRQ: 0
    Baud_base: 0, close_delay: 50, divisor: 0
    closing_wait: 3000
    Flags: spd_normal

我设法在 x86 架构上使用多个端口使用 grml 图像进行串行通信。所以它似乎我的主机端很好。

如果之前有人在 QEMU -M beaglexm 或任何其他 ARM 架构上做过类似的工作,我很乐意提供有关使用的 VM、QEMU 的版本和发行版以及使用的内核详细信息和镜像配置的任何详细信息。

最佳答案

我发现我的问题是,QEMU 没有映射任何额外的串行 pty 的串行 chardev。

执行此 Invoke 命令后:

sudo qemu-system-arm -M beaglexm -m 1024 -sd ./test.img -clonix -serial stdio -device usb-mouse -device usb-kbd -serial pty -serial pty -monitor pty
char device redirected to /dev/pts/5 (label compat_monitor0)
char device redirected to /dev/pts/7 (label serial1)
char device redirected to /dev/pts/10 (label serial2)

我们可以看到使用标签序列号 1 和 2 创建的 2 个额外序列号。
但是如果我查看树信息
 (qemu) info qtree

dev: omap_uart, id "uart4"
    revision = 82
    mmio_size = 4096
    baudrate = 812500
    chardev = uart4
    irq 3
    mmio 0000000049042000/0000000000001000
  dev: omap_uart, id "uart3"
    revision = 82
    mmio_size = 4096
    baudrate = 812500
    chardev = serial0
    irq 3
    mmio 0000000049020000/0000000000001000
  dev: omap_uart, id "uart2"
    revision = 82
    mmio_size = 4096
    baudrate = 812500
    chardev = uart2
    irq 3
    mmio 000000004806c000/0000000000001000
  dev: omap_uart, id "uart1"
    revision = 82
    mmio_size = 4096
    baudrate = 812500
    chardev = uart1
    irq 3
    mmio 000000004806a000/0000000000001000

我们清楚地看到,只是标签serial0连接到一个 UART(设置为控制台的那个)。找不到其他标签(serial1 和 serial2)。

通过 grml 的工作图像,jofel 非常高兴地告诉我,我们看到了这一点:
  dev: i440FX-pcihost, id ""
    irq 0
    bus: pci.0
      type PCI
      dev: PIIX3, id ""
        addr = 01.0
        romfile = <null>
        rombar = 1
        multifunction = on
        command_serr_enable = on
        class ISA bridge, addr 00:01.0, pci id 8086:7000 (sub 1af4:1100)
        bus: isa.0
          type ISA
          dev: isa-serial, id ""
            index = 2
            iobase = 0x3e8
            irq = 4
            chardev = serial2
            wakeup = 0
            isa irq 4
          dev: isa-serial, id ""
            index = 1
            iobase = 0x2f8
            irq = 3
            chardev = serial1
            wakeup = 0
            isa irq 3
          dev: isa-serial, id ""
            index = 0
            iobase = 0x3f8
            irq = 4
            chardev = serial0
            wakeup = 0
            isa irq 4

所有 3 个串行 lebels 都附加到一个 chardev。

现在我只需要问一个关于如何让 QEMU 将这些标签链接到我的 beagleboard uarts 的新问题。

另外我想补充一点,我认为setserial没有输出任何关于ttyO的信息,因为它不支持omap uarts。 setserial ?显示支持哪些设备。在 ttyS 的情况下,我认为这是因为安装了 tty 驱动程序,但在 QEMU 中没有为 bealgeboard 模拟其他类型的 uarts bisede omap uarts。

非常感谢所有看过这个问题的人,特别是 jofel。

关于serial-port - ttyO 端口在 beagleboard-xm 的 QEMU 1.4.0 运行镜像上没有正确的端口地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17002448/

相关文章:

angular - 在Electron和Angular中使用SerialPort失败

c - 为什么这会让我的显示器发疯? (但只是有时)

c - 如何从 C 代码中删除所有调试 printf 语句

azure - 是否可以在 Azure 的 Windows Data Science vm 中使用 Docker?

VM上的Android应用程序开发

crash - XBee S2 收到数据包后停止发送

c++ - QSerialPort readyread() 信号

database - 如何连接到在 VM 上运行的数据库?

string - 如何在Arduino上使用分隔符读取字符串值?

c - 字体图形例程