QEMU 1.4.0エミュレータのUbuntu 13.04ディストリビューションでbeagleboard-xmのLinuxイメージ(カーネル3.2.8)を実行しています。私のイメージはBuildroot beagle_defconfigを使用して作成されました。デバッグを実行できるようにいくつかのパッケージを追加しました。
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
実際にOMAP-SERIALで猫を見ると、/proc/tty/driver
次の 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にリダイレクトされたので、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では、まだ何も起こりません。
ホスト側ではminicomを開き、使用または実行して使用/dev/pts/3
します。/dev/pts/4
cat
ゲストの場合:
echo "test" > /dev/ttyO0
何もしないときや1、2のことをするとき。ただし、ttyO2でこれを行うと、コンソール端末に「test」プロンプトが表示されます(正常です)。
これでttySを使用するとき:
echo "test" > /dev/ttyS0
わかりました。
-bash: echo: write error: Input/output error
このエラーを調べたところ、いくつかの原因が考えられることがわかりました。しかし、1つの顕著な点は、シリアルポート以外に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のバージョンとリリース、使用されたカーネルの詳細、およびイメージの構成に関する詳細を入手できてうれしいです。
ベストアンサー1
問題はホスト側にあります。
使用する必要があります擬似端末(-serial pty
)「実際の」文字デバイス()に接続する代わりに-chardev tty,...
。
/dev/pts/xx
qemu は実際に使用する pty を表示します。これで、このptyをホストの通常のシリアルポートとして使用できるようになりました。
/dev/ttyS[0-*]
このオプションを繰り返して、ゲストにさらにptyを接続できます(を使用している場合はゲストにあり、最初のptyに-serial stdio
あります)。/dev/ttyS0
/dev/ttyS1