我在 QEMU 的 1.4.0 模拟器 Ubuntu 发行版 13.04 上为 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)
我想要做的是通过来宾上存在的 4 个不同的 ttyO 串行在来宾和主机之间进行通信。QEMU 提供了将流量重定向到主机端某些设备的功能。我的问题是这样的:
在来宾内核启动时,我可以看到我的 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 上进行设置序列化,我会收到以下消息:
[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 也是如此。我尝试为任何 ttyO 设置一些设置,setserial
但我总是收到相同的消息:
[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
基本上我想在来宾和主机之间建立串行通信,但是来宾端的串行端口配置不正确。
/sys/class/tty
显示 tty 驱动程序已链接到串行设备。
我之前出现过吗,只有 omap uart 已初始化并附加到 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 架构上使用 muliples 端口使用 grml 图像进行串行通信。所以看起来我的主机端很好。
如果有人曾经在 QEMU -M beaglexm 或任何其他 ARM 架构上做过类似的工作,我很乐意提供有关使用的 VM、QEMU 的版本和分发以及使用的内核详细信息和映像配置的任何详细信息。