Serial port ttyO端口在beagleboard xm的QEMU 1.4.0运行映像上没有良好的端口地址

Serial port ttyO端口在beagleboard xm的QEMU 1.4.0运行映像上没有良好的端口地址,serial-port,embedded,virtual-machine,qemu,beagleboard,Serial Port,Embedded,Virtual Machine,Qemu,Beagleboard,我正在QEMU的1.4.0 emulator Ubuntu 13.04发行版上运行beagleboard xm的Linux映像(内核3.2.8)。我的图像是使用Buildroot beagle_defconfig创建的。我添加了一些pkg,以便能够进行一些调试 QEMU调用命令: `$ sudo qemu-system-arm -M beaglexm -m 1024 -sd ./test.img -clock unix -serial stdio -device usb-mouse -devic

我正在QEMU的1.4.0 emulator Ubuntu 13.04发行版上运行beagleboard xm的Linux映像(内核3.2.8)。我的图像是使用Buildroot beagle_defconfig创建的。我添加了一些pkg,以便能够进行一些调试

QEMU调用命令:

`$ 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上执行cat时,我能够看到这一点 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也是如此。 我试图用
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
基本上我想在客户机和主机之间建立串行通信,但是客户机端的串行端口配置不好

/sys/class/tty
显示tty驱动程序已链接到串行设备

我以前出现过,只有omap UART被初始化并连接到ttyO*。注意,控制台被内核配置重定向到ttyO2。但由于我添加了
-serial stdio
,控制台被重定向到调用QEMU的终端

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

在主机端,我使用minicom或对其执行cat操作打开
/dev/pts/3
/dev/pts/4

客人方面:

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

现在,当使用任何TTY时:

echo "test" > /dev/ttyS0
我明白了

我对这个错误做了一些研究,我发现可能有很多东西。但我注意到的一件事是,除了串行设备之外,没有任何设备被分配给TTY。查看/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
confrim如下:

/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

执行this 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)
我们可以看到用标签serial 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
dev:i440FX pcihost,id“”
irq 0
总线:pci.0
类型PCI
开发人员:PIIX3,id“”
地址=01.0
romfile=
rombar=1
多功能=开启
命令\u serr\u enable=on
ISA类桥接器,地址00:01.0,pci id 8086:7000(子1af4:1100)
总线:isa.0
ISA型
开发人员:isa串行,id“”
指数=2
iobase=0x3e8
irq=4
chardev=serial2
唤醒=0
isa irq 4
开发人员:isa串行,id“”
索引=1
iobase=0x2f8
irq=3
chardev=serial1
唤醒=0
isa irq 3
开发人员:isa串行,id“”
索引=0
iobase=0x3f8
irq=4
chardev=serial0
唤醒=0
isa irq 4
所有3个串行LEBEL都连接到chardev

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

另外,我想补充一点,我认为setserial没有输出任何关于ttyO的信息,因为它不支持omap UART<代码>设置序列?显示支持哪些设备。就tty而言,我认为这是因为安装了tty驱动程序,但QEMU中没有为bealgeboard模拟的其他类型的UART bisede omap UART

非常感谢大家关注这个问题,特别是乔菲尔

  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