Sto eseguendo un'immagine Linux (kernel 3.2.8) per beagleboard-xm su emulatore 1.4.0 di Ubuntu distribuzione di Ubuntu per 13.04 . La mia immagine viene creata usando Buildroot beagle_defconfig. Ho aggiunto alcuni pkgs per poter eseguire il debug di un po '.Le porte ttyO non hanno il buon indirizzo di porta su QEMU 1.4.0 immagine in esecuzione per beagleboard-xm
cmd chiamata 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)
Quello che voglio fare è di avere una comunicazione tra ospite e ospitante attraverso seriali i 4 differenti ttyO presentare sul guest. QEMU offre servizi per reindirizzare il traffico verso alcuni dispositivi nel lato host. Il mio problema è questa:
Al boot del kernel ospite Im in grado di vedere che la mia UART se abilitato
[ 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
Infatti quando vado vedere in a /proc/tty/driver
e faccio un gatto su OMAP-SERIAL Im grado di vedere questo serinfo: Driver 1.0 revisione:
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
so che ttyO2 sta lavorando perché la mia console è stata reindirizzata ad esso. Il fatto è che facendo una serie di serie su uno dei ttyO ottengo il seguente messaggio:
[[email protected] 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 stesso vale con ttyO2. Ho cercato di impostare alcune impostazioni per una delle ttyO con setserial
ma ottengo sempre lo stesso messaggio:
[[email protected] ~]# setserial /dev/ttyO0 uart 8250
setserial: can't set serial info: Invalid argument
[[email protected] ~]# setserial /dev/ttyO0 port 0x4806a000
setserial: can't set serial info: Invalid argument
Guardando ospite /proc/tty/drives
questo è ciò che vediamo
/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
Fondamentalmente voglio stabilire una comunicazione seriale tra un guest e un host, ma le porte seriali sul lato guest non sono ben configurate.
/sys/class/tty
mostra che i driver tty erano stati collegati a un dispositivo seriale.
mi sono presentato prima, solo le funzioni di omap sono state inizializzate e collegate a ttyO *. si noti che la console è stata reindirizzata ttyO2 dalle configurazioni del kernel. ma poiché ho aggiunto -serial stdio
, la console è stata reindirizzata al terminale che ha richiamato QEMU.
Se reindirizzare la console utilizzando dapprima -serial pty
invece di -serial stdio
, sono in grado di indurre la console in minicom aprendo il pty creato sul lato host. Ancora nulla accade sugli altri pty creati sul lato host per comunicare attraverso altre porte.
Sul lato host apro /dev/pts/3
e /dev/pts/4
con minicom o facendo cat
su di loro
Sul lato ospite:
Whent faccio echo "test" > /dev/ttyO0
o 1 o 3 nulla. ma quando lo faccio su ttyO2, prompt "test" sul terminale della console (che è normale).
ora quando si utilizza uno qualsiasi dei ttyS:
echo "test" > /dev/ttyS0
ottengo
-bash: echo: write error: Input/output error
Ho fatto qualche ricerca su questo errore e quello che ho trovato è che è potrebbe essere molte cose. Ma una cosa che ho notato è che nessun dispositivo accanto al seriale è stato assegnato a ttyS. e guardando/proc/tty/driver/serial vediamo questo:
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
anche setserial -a /dev/ttyS0
confrim questo:
/dev/ttyS0, Line 0, UART: unknown, Port: 0x0000, IRQ: 0
Baud_base: 0, close_delay: 50, divisor: 0
closing_wait: 3000
Flags: spd_normal
sono riuscito a fare comunicazione seriale con porte muliples usig grml immagine su un'architettura x86 . Quindi sembra che il mio lato ospite stia bene.
Se qualcuno ha mai fatto qualcosa di simile a questo lavoro su QEMU -M beaglexm o su qualsiasi altra architettura ARM, vorrei prendere volentieri tutti i dettagli sulla VM utilizzata, la versione e la distribuzione di QEMU così come i dettagli del kernel e le immagini utilizzate .