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.