2013-06-08 14 views
5

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 .

risposta

2

Ho trovato il mio problema, QEMU non ha mappato il codice seriale di qualsiasi pty extra-seriale.

Dopo aver fatto il questo comando 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) 

Possiamo vedere che 2 seriali in più in cui create con l'etichetta di serie 1 e 2. Ma se guardo informazioni albero

(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 

Vediamo chiaramente che solo l'etichetta serial0 era collegata a un uart (quello impostato per essere la console). Le altre etichette (serial1 e serial2) non sono reperibili.

Con l'immagine di lavoro del grml che Jofel era davvero bello per dirmi che vediamo questo:

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 

tutti i 3 lebels seriali sono state allegate a un chardev.

Ora devo solo fare una nuova domanda su come creare QEMU per collegare tali etichette alle mie interfacce beagleboard.

Inoltre, vorrei aggiungere che penso che setserial non abbia generato alcuna informazione su ttyO perché non supporta le funzioni di omap. setserial ? mostra quali dispositivi sono supportati. Nel caso di ttyS, penso che sia perché i driver tty sono installati ma non ci sono altri tipi di uart che sono stati emulati per bealgeboard in QEMU.

Grazie mille per tutti quelli che hanno dato un'occhiata a questa domanda e specialy jofel.