Virtual-Machine

ttyO 埠在 beagleboard-xm 的 QEMU 1.4.0 執行映像上沒有正確的埠地址

  • June 14, 2013

我在 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 的版本和分發以及使用的核心詳細資訊和映像配置的任何詳細資訊。

我發現我的問題是,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)

我們可以看到使用標籤序列 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(設置為控制台的那個)上。其他標籤(序列號 1 和序列號 2)在哪裡找不到。

使用 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 個序列號都附加到一個 chardev。

現在我只需要問一個關於如何讓 QEMU 將這些標籤連結到我的 beagleboard uart 的新問題。

另外我想補充一點,我認為 setserial 沒有輸出任何關於 ttyO 的資訊,因為它不支持 omap uart。setserial ?顯示支持的設備。對於 ttyS,我認為這是因為安裝了 tty 驅動程序,但在 QEMU 中沒有為 bealgeboard 模擬的其他類型的 uart bisede omap uart。

非常感謝所有關注這個問題的人,特別是jofel。

問題出在主機端:

您應該使用偽終端( -serial pty) 而不是連接到“真實”字元設備 ( -chardev tty,...)。

qemu 顯示/dev/pts/xx它實際使用的 pty。您現在可以將此 pty 用作主機的普通串列埠。

您可以重複此選項以/dev/ttyS[0-*]在客戶機上連接更多 pty(如果您使用-serial stdio,它/dev/ttyS0在客戶機上,第一個 pty 是 then /dev/ttyS1)。

引用自:https://unix.stackexchange.com/questions/78511