Fra*_*sco 5 embedded serial-port qemu virtual-machine beagleboard
我正在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)
Run Code Online (Sandbox Code Playgroud)
我想要做的是在客人和主机之间进行通信,连接客人端的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
Run Code Online (Sandbox Code Playgroud)
事实上当我去看看/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
Run Code Online (Sandbox Code Playgroud)
我知道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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
在看客人的同时,/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
Run Code Online (Sandbox Code Playgroud)
基本上我想在访客和主机之间建立串行通信,但客户端的串口没有很好地配置.
/sys/class/tty 显示tty驱动程序已链接到串行设备.
我之前出现过,只有omap uarts已初始化并附加到ttyO*.注意控制台已被内核配置重定向到ttyO2.但是因为我添加了-serial stdio,控制台被重定向到调用QEMU的终端.
如果我首先使用重定向控制台-serial pty而不是-serial stdio,我可以通过打开主机端创建的pty来提示控制台.在主机端创建的其他端口上仍然没有任何事情发生在其他端口之间进行通信.
在主机方面,我打开/dev/pts/3并/dev/pts/4使用minicom或者cat对它们进行操作
在客人方面:
我做的echo "test" > /dev/ttyO0还是1或3没什么.但是当我在ttyO2上执行此操作时,控制台终端上的"test"提示符(这是正常的).
现在使用任何ttyS时:
echo "test" > /dev/ttyS0
Run Code Online (Sandbox Code Playgroud)
我明白了
-bash: echo: write error: Input/output error
Run Code Online (Sandbox Code Playgroud)
我对这个错误进行了一些研究,我发现的可能是很多东西.但有一点我注意到,串口旁边的设备没有分配给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
Run Code Online (Sandbox Code Playgroud)
还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
Run Code Online (Sandbox Code Playgroud)
我设法在x86架构上与muliples ports usig grml image进行串行通信.所以看来我的东道主很好.
如果有人曾经在QEMU -M beaglexm或任何其他ARM架构上做过这样的工作,我很乐意接受所用VM的任何细节,QEMU的版本和分布以及所使用的内核细节和图像配置.
我发现我的问题是什么,QEMU 没有映射任何额外的串行 pty 的串行 chardev。
执行此调用命令后:
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)
Run Code Online (Sandbox Code Playgroud)
我们可以看到 2 个额外的序列是用标签序列 1 和 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
Run Code Online (Sandbox Code Playgroud)
我们清楚地看到,只有标签serial0贴在一个 uart 上(设置为控制台的那个)。其他标签(serial1 和serial2)找不到。
jofel 非常高兴地告诉我 grml 的工作图像,我们看到了这一点:
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
Run Code Online (Sandbox Code Playgroud)
所有 3 个序列号均附加到 chardev。
现在我只需要问一个新问题,关于如何使 QEMU 将这些标签链接到我的 beagleboard uart。
另外我想补充一点,我认为setserial没有输出有关ttyO的任何信息,因为它不支持omap uarts。setserial ?显示支持哪些设备。就 ttyS 而言,我认为这是因为安装了 tty 驱动程序,但在 QEMU 中没有为 bealgeboard 模拟的其他类型的 uarts bisede omap uarts。
非常感谢所有关注这个问题的人,特别是 jofel。