Порты ttyO не имеют правильного адреса порта в рабочем образе QEMU 1.4.0 для beagleboard-xm

Я запускаю образ Linux (ядро 3.2.8) для beagleboard-xm в дистрибутиве Ubuntu эмулятора QEMU 1.4.0 для 13.04. Мой образ создается с помощью Buildroot beagle_defconfig. Я добавил несколько пакетов, чтобы иметь возможность немного отладить.

Команда вызова QEMU:

`$ 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 uarts были инициализированы и подключены к ttyO*. обратите внимание, что консоль была перенаправлена ​​на ttyO2 конфигурациями ядра. но поскольку я добавил -serial stdio, консоль была перенаправлена ​​на терминал, вызвавший QEMU.

Если я перенаправлю консоль, используя сначала -serial pty вместо -serial stdio , я смогу вызвать консоль в minicom, открыв pty, созданный на стороне хоста. По-прежнему ничего не происходит на других 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

Мне удалось установить последовательную связь с несколькими портами, используя образ grml на архитектуре x86. Так что, похоже, моя принимающая сторона в порядке.

Если кто-то когда-либо делал что-то подобное раньше на QEMU -M beaglexm или любой другой архитектуре ARM, я был бы рад получить любые подробности об используемой виртуальной машине, версии и дистрибутиве QEMU, а также сведениях о ядре и используемых конфигурациях образов.


person Francisco    schedule 08.06.2013    source источник


Ответы (1)


Я обнаружил, в чем заключалась моя проблема: QEMU не отображает последовательный chardev какого-либо дополнительного последовательного pty.

После выполнения этой команды 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)

Мы видим, что 2 дополнительных серийных номера были созданы с серийными номерами 1 и 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) отсутствуют.

С рабочим изображением 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 не выводит никакой информации о ttyO, потому что он не поддерживает omap uarts. setserial ? показывает, какие устройства поддерживаются. В случае с ttyS, я думаю, это связано с тем, что драйверы tty установлены, но нет другого типа uarts bisede omap uarts, эмулируемого для bealgeboard в QEMU.

Большое спасибо всем, кто рассмотрел этот вопрос, и особенно Джофелю.

person Francisco    schedule 14.06.2013