serial-port embedded virtual-machine qemu beagleboard

serial port - Los puertos ttyO no tienen la buena dirección de puerto en QEMU 1.4.0 ejecutando la imagen para beagleboard-xm



serial-port embedded (1)

Encontré cuál era mi problema, QEMU no mapea el número de serie de ningún servidor adicional.

Después de hacer el comando Invoke this:

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)

Podemos ver que se crearon 2 seriales adicionales con la etiqueta serial 1 y 2. Pero si miro la información del árbol

(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

Vemos claramente que solo la etiqueta serial0 se adjuntó a un uart (el configurado para ser la consola). Las otras etiquetas (serial1 y serial2) no se encuentran.

Con la imagen funcional de Grml, ese jofel fue realmente agradable al decirme que vemos esto:

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

los 3 números de serie se adjuntaron a un chardev.

Ahora solo tengo que hacer una nueva pregunta sobre cómo hacer que QEMU vincule esos lables con mis mapas de beagleboard.

También me gustaría añadir que creo que setserial no superó ninguna información sobre ttyO porque no es compatible con omap uarts. setserial ? muestra qué dispositivos son compatibles. En el caso de los ttyS, creo que es porque los controladores tty están instalados, pero no hay otro tipo de uarts uarts emulados para bealgeboard en QEMU.

Muchas gracias a todos los que echaron un vistazo a esta pregunta y, sobre todo, jofel.

Estoy ejecutando una imagen de Linux (kernel 3.2.8) para beagleboard-xm en la distribución Ubuntu del emulador 1.4.0 de QEMU para 13.04. Mi imagen se crea usando Buildroot beagle_defconfig. Agregué algunos pkgs para poder depurar un poco.

QEMU llama a 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)

Lo que quiero hacer es tener una comunicación entre invitado y anfitrión a través de una serie de 4 diferentes ttyO presentes en el invitado. QEMU ofrece instalaciones para redirigir el tráfico a algún dispositivo en el lado del host. Mi problema es así:

En el inicio del kernel invitado, puedo ver que mi UART está habilitado

[ 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

De hecho, cuando voy a ver /proc/tty/driver y hago un gato en OMAP-SERIAL, puedo ver esta revisión del controlador de 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

Sé que ttyO2 está funcionando porque mi consola ha sido redirigida a él. El caso es que al hacer una serie de series en cualquiera de los ttyO recibo el siguiente mensaje:

[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

Lo mismo ocurre con ttyO2. Traté de establecer algunas configuraciones para cualquiera de los ttyO con setserial pero siempre recibo el mismo mensaje:

[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

Mientras miramos guest /proc/tty/drives esto es lo que vemos

/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

Básicamente, quiero establecer una comunicación en serie entre un invitado y un host, pero los puertos serie del lado de los invitados no están bien configurados.

/sys/class/tty muestra que los controladores tty se han vinculado a un dispositivo serie.

He aparecido antes, solo omap uarts se han inicializado y se han unido a ttyO *. observe que la consola ha sido redirigida ttyO2 por las configuraciones del kernel. pero como agregué -serial stdio , la consola se redirigió al terminal que invoca QEMU.

Si redirecciono la consola utilizando al principio -serial pty lugar de -serial stdio , puedo solicitar la consola en minicom abriendo el pty creado en el lado del host. Todavía no sucede nada en los otros pty creados en el lado del host para comunicarse a través de otros puertos.

En el lado del host, abro /dev/pts/3 y /dev/pts/4 con minicom o haciendo cat sobre ellos

En el lado del invitado:

Whent hago echo "test" > /dev/ttyO0 o 1 o 3 nada. pero cuando lo hago en ttyO2, aparece el mensaje "test" en el terminal de la consola (que es normal).

ahora al usar cualquiera de los ttyS:

echo "test" > /dev/ttyS0

yo obtengo

-bash: echo: write error: Input/output error

Hice algunas investigaciones sobre este error y lo que encontré es que podría haber muchas cosas. Pero una cosa que noté fue que ningún dispositivo al lado de la serial ha sido asignado a ttyS. y mirando / proc / tty / driver / serial vemos esto:

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

también setserial -a /dev/ttyS0 confrim esto:

/dev/ttyS0, Line 0, UART: unknown, Port: 0x0000, IRQ: 0 Baud_base: 0, close_delay: 50, divisor: 0 closing_wait: 3000 Flags: spd_normal

Me las arreglé para hacer comunicación en serie con los puertos de múltiples usuarios usando una imagen grml en una arquitectura x86. Así que parece que mi lado anfitrión está bien.

Si alguien ha hecho alguna vez algo así antes en QEMU -M beaglexm o en cualquier otra arquitectura ARM, con mucho gusto tomaré los detalles sobre la VM utilizada, la versión y distribución de QEMU, así como los detalles del kernel y las configuraciones de imagen utilizadas.