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아무것도 하지 않을 때나 한두 가지 일을 할 때 . 하지만 ttyO2에서 이 작업을 수행하면 콘솔 터미널에 "test" 프롬프트가 나타납니다(정상입니다).

이제 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 -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

답변2

내 문제가 무엇인지 알아냈습니다. 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(콘솔에 설정된 하나)에만 레이블만 부착되어 있음을 분명히 알 수 있습니다 . 다른 태그(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에 연결하도록 만드는 방법에 대해 새로운 질문을 하면 됩니다.

또한 seterial은 omap uart를 지원하지 않기 때문에 ttyO에 대한 정보를 출력하지 않는다고 생각한다고 덧붙이고 싶습니다. setserial ?지원되는 장치를 표시합니다. ttyS에 관한 한 tty 드라이버가 설치되어 있기 때문인 것 같지만 QEMU의 bealgeboard용으로 에뮬레이트된 다른 유형의 uarts bisede omap uarts가 없습니다.

이 문제를 지켜봐 주신 모든 분들, 특히 jofel에게 감사드립니다.

관련 정보