beagleboard-xmのQEMU 1.4.0実行イメージのttyOポートに正しいポートアドレスがありません。

beagleboard-xmのQEMU 1.4.0実行イメージのttyOポートに正しいポートアドレスがありません。

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/ttytty ドライバがシリアルデバイスに接続されていることを示します。

以前も登場しましたか? omap uartだけが初期化され、ttyO *に接続されます。コンソールはカーネル構成によって ttyO2 にリダイレクトされました。ただし、追加したため、-serial stdioコンソールはQEMUを呼び出す端末にリダイレクトされます。

-serial ptyコンソールを最初にリダイレクトする代わりに、を使用すると、ホスト-serial stdio側で生成されたptyを開き、minicomでコンソールを表示できます。他のポートを介して通信するためにホスト側で作成された他のptyでは、まだ何も起こりません。

ホスト側ではminicomを開き、使用または実行して使用/dev/pts/3します。/dev/pts/4cat

ゲストの場合:

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/xxqemu は実際に使用する pty を表示します。これで、このptyをホストの通常のシリアルポートとして使用できるようになりました。

/dev/ttyS[0-*]このオプションを繰り返して、ゲストにさらにptyを接続できます(を使用している場合はゲストにあり、最初のptyに-serial stdioあります)。/dev/ttyS0/dev/ttyS1

おすすめ記事