web-dev-qa-db-ja.com

ttyOポートは、beagleboard-xmのQEMU1.4.0実行イメージで適切なポートアドレスを持っていません

13.04用のQEMUの1.4.0エミュレーターUbuntuディストリビューションでbeagleboard-xm用のLinuxイメージ(カーネル3.2.8)を実行しています。私のイメージはBuildrootbeagle_defconfigを使用して作成されています。少しデバッグできるように、いくつかのpkgを追加しました。

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は、トラフィックをホスト側のデバイスにリダイレクトする機能を提供します。私の問題は次のようになります:

ゲストカーネルの起動時に、my 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にも当てはまります。 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ドライバーがシリアルデバイスにリンクされていたことを示します。

以前に現れたことがありますが、omapuartsのみが初期化されてttyO *にアタッチされています。コンソールがカーネル構成によってttyO2にリダイレクトされていることに注意してください。しかし、-serial stdioを追加したため、コンソールはQEMUを呼び出した端末にリダイレクトされます。

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

ホスト側で、ミニコムで/dev/pts/3/dev/pts/4を開くか、それらに対して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アーキテクチャでgrmlイメージを使用して複数のポートとシリアル通信を行うことができました。したがって、ホスト側は問題ないようです。

QEMU -Mbeaglexmまたはその他のARMアーキテクチャで、これまでにこのような作業を行ったことがある人がいたら、使用されているVM、 QEMUのバージョンとディストリビューション、および使用されるカーネルの詳細とイメージ構成。

3
user40643

私の問題が何であるかを見つけました。QEMUは余分なシリアルptyのシリアルchardevをマッピングしていません。

この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)

シリアル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)はどこにもありません。

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

3つのシリアルレベルはすべてchardevに接続されていました。

ここで、QEMUを作成してこれらのラベルをビーグルボードのuartにリンクする方法について新しい質問をする必要があります。

また、setserialはomap uartsをサポートしていないため、ttyOに関する情報を出力しなかったと思います。 setserial ?は、サポートされているデバイスを示します。 ttySの場合、ttyドライバーがインストールされているためだと思いますが、QEMUでbealgeboard用にエミュレートされた他のタイプのuarts bisede omapuartsはありません。

この質問と特別なjofelを見てくれたすべての人に感謝します。

0
user40643

問題はホスト側にあります。

「実際の」char-devices(-serial pty)に接続する代わりに、 Pseudo-terminals-chardev tty,...)を使用する必要があります。

qemuは、実際に使用するpty /dev/pts/xxを表示します。これで、このptyをホストからの通常のシリアルポートとして使用できます。

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

0
jofel