Implementazione hardware della comunicazione

fra host e mouse PS/2

Autori: F. Iacopetti, C. Oroni

Siete il visitatore n.

Click here for English version

Pagina ottimizzata per risoluzione 1024x768

 

Introduzione
Riconoscimenti
1. Specifiche
2. Descrizione del protocollo di comunicazione
2.1 Introduzione
2.2 Modalità di comunicazione
2.3.1 Comunicazione Host - to - Device
2.3.2 Comunicazione Device - to - Host
2.4 Struttura delle trame relative a stato dei pulsanti e spostamento
2.5 Rilievo sperimentale del protocollo
2.5.1 Significato dei comandi Host - to - Device utilizzati
2.5.2 Messaggi Device - to - Host rilevati
2.6 Differenze e novità rispetto al protocollo descritto nel materiale a nostra disposizione
3. Descrizione del mouse tester
3.1 Mouse tester
3.2 Resetmouse
3.3 Mousecom
3.4 Vga
3.5 Sender
3.6 Receiver
3.7 Registri RBR e TBR
3.8 Contatori
3.9 Bus di I/O
3.10 Multiplexer
4. Simulazioni

Torna alla Home Page

Recapiti

2.6 Differenze e novità rispetto al protocollo descritto nel materiale a nostra disposizione.

Pur avendo applicato le sequenze di comandi previste dal protocollo, e avendo tentato anche alcune altre combinazioni di essi, il mouse non entra mai in stream mode (la prova è stata condotta su entrambi i dispositivi a nostra disposizione).

Ad ogni comando inviato al mouse, esso risponde sempre con un byte di Acknowledge (FAH), seguito eventualmente da altri byte se previsti.

La rappresentazione degli spostamenti negativi non avviene in modulo e segno, bensì in complemento a due su 9 bit (il bit di segno costituisce il nono bit).

Il bit di parità dei byte trasmessi sia dal mouse che dall'host è quello di parità pari; sia il mouse che l'host, evidentemente, devono allora controllare che la stringa ricevuta (esclusi i bit di start e stop) abbia parità dispari.

Figura 1: Sequenza completa di power-on e delle trame inviate e ricevute dal PIC

Figura 2: Comando di Reset

Figura 3: Ricezione delle trame in risposta al comando di Reset

Figura 4: Trasmissione del comando Read Data e ricezione della risposta completa

3. Descrizione del mouse-tester

Il nostro mouse-tester è composto da quattro macchine a stati principali, il mouse-tester vero e proprio, la macchina resetmouse, la macchina mousecom e la macchina vga e da due sottomacchine sender e receiver che si occupano rispettivamente di trasmettere comandi al mouse e di ricevere le trame inviate dallo stesso.

Di seguito descriviamo brevemente le funzionalità principali delle macchine a stati appena citate e delle primitive utilizzate.

Trattandosi di materiale creato ed elaborato per mezzo di strumenti software proprietari, regolarmente concessi in licenza all'Università, riteniamo opportuno non riportarlo in queste pagine.

Prossimamente invieremo alla casa produttrice del software e dei dispositivi programmabili utilizzati una richiesta di pubblicazione di questo lavoro sulle pagine del suo sito. Appena tale richiesta verrà accolta, indicheremo qui immediatamente il collegamento ad esse.

3.1 Mouse - tester

La macchina mousetester si compone di cinque stati principali: lo stato start nel quale viene accesa la macchina vga con il cursore a centro schermo, e nel quale viene accesa la macchina resetmouse, che si occupa di eseguire il reset del mouse; lo stato mouseoff che aspetta il successivo sincronismo di quadro per interrogare il mouse; lo stato mouseon nel quale viene interrogato il mouse mediante l'accensione della macchina mousecom; lo stato newposition nel quale vengono riportati in modulo e segno le coordinate x e y inviate dal mouse (vedi protocollo di comunicazione) e infine lo stato updateposition nel quale vengono aggiornati i registri della posizione del cursore.

In particolare in questa macchina a stati abbiamo deciso di lavorare nel modo seguente: poiché il pennello impiega circa 16 millisecondi ad aggiornare l'intero schermo, abbiamo deciso di tenere sempre accesa la macchina vga che aggiorna lo schermo con l'ultima posizione ricevuta dal mouse e di interrogare il mouse ogni volta che arriva il segnale di sincronismo di quadro. Si noti che non è detto che il mouse abbia mandato nel frattempo la sua nuova posizione (si veda la descrizione del protocollo di comunicazione). Per evitare quindi conflittualità abbiamo deciso di interrogare il mouse ad ogni sincronismo di quadro solo nel caso che il mouse abbia terminato la trasmissione precedente. Abbiamo considerato terminata la trasmissione da parte del mouse sia nel caso la trasmissione fosse andata a buon fine (mousecom.valid = 1), sia nel caso in cui fosse fallita per errori vari come parità errata o time out di qualsiasi genere (mousecom.timeout = 1).

In caso di reset esterno la macchina viene riportata allo stato di start.

Il mouse tester è dotato di due piedini bidirezionali, mclk e data, pilotati da un bus di I/O (iobusod) per l'handshake con il mouse. Dispone inoltre dei piedini di ingresso di reset e clock. Invia in uscita i segnali h_sync e v_sync per i sincronismi di riga e di quadro, e i segnali rgb[2..0] per la scrittura dello schermo.

3.2 Resetmouse

La macchina resetmouse (di tipo inimouse) si occupa di effettuare il reset del mouse. Tale macchina riceve in ingresso il clock e i dati (mclk_in e data_in) inviati dal mouse, i segnali di reset, accensione e il clock globale e invia in uscita i segnali di valid e timeout e i segnali mclk_out e data_out per pilotare il mouse.

La macchina utilizza alcuni contatori, la macchina sender (di tipo sendbyte), che svolge il ruolo della sotto interfaccia di uscita e un mux che impone su data_out il valore vcc o il valore dell'uscita di sender secondo i casi.

Nello stato di start vengono inizializzati i contatori, il mux di pilotaggio e viene caricato il valore FFH (comando di reset) nel sender. Nello stato startcom viene portato a zero il clock del mouse per 163 microsec. Nello stato starttrasmit viene attivata la macchina sender che invia sulla linea data il bit di start mentre il clock del mouse viene tenuto a zero per altri 10 microsecondi; nello stato trasmit si lascia libero il mouse di inviare il clock. Il sender si occupa di trasmettere al mouse il comando di reset. Si passa poi nello stato wait670 nel quale si attendono 670 millisecondi per poi inviare il segnale di valid ad indicare il termine del reset.

Il segnale timeout serve ad inviare in uscita eventuali malfunzionamenti o fallimenti dei reset, che in questo caso va rieffettuato invocando nuovamente dall'esterno la macchina resetmouse.

3.3 Mousecom

La macchina mousecom (di tipo mouse) si occupa di effettuare la comunicazione con il mouse. Tale macchina riceve in ingresso il clock e i dati (mclk_in e data_in) inviati dal mouse, i segnali di reset, accensione e il clock globale e invia in uscita i segnali di valid e timeout, i segnali mclk_out e data_out per pilotare il mouse e i segnali left_b, right_b, x_sign, y_sign, x_of, y_of, delta_x[7..0], delta_y[7..0] che danno l'ultima posizione inviata dal mouse.

Questa macchina a stati utilizza alcuni contatori, le macchine sender (di tipo sendbyte) e receiver (di tipo recbyte) che svolgono il ruolo di sottointerfaccia di ingresso e di uscita rispettivamente, un mux per pilotare i valori di data_out secondo il protocollo di comunicazione, tre parity checkers di tipo 74280b per il controllo di parità delle trame inviate dal mouse e alcuni registri di appoggio.

Nello stato di start vengono ripristinate le condizioni iniziali dei contatori e vengono inizializzati i registri. Nello stato startcom si abbassa il clock del mouse (mclk_out ) per 163 microsecondi secondo il protocollo di comunicazione. Nello stato starttrasmit si attiva il trasmettitore (sender) che impone il bit di start sulla linea dati mentre il clock del mouse viene tenuto basso per altri 10 microsecondi. Nello stato trasmit il trasmettitore invia al mouse il comando EBH ( richiesta di dati in modalità remota). Se la trasmissione è andata a buon fine si passa nello stato waitacklow nel quale si attende, in accordo al protocollo, che il clock del mouse e la linea dati vengano abbassati, dopodiché si passa in waitackhigh. In questo stato la macchina attende il ritorno a uno sia del clock del mouse che della linea dati. Se le due operazioni di attesa vanno a buon fine la macchina abilita il ricevitore (receiver). L'operazione di ricezione si effettua negli stati receive1, receive2, receive3, receive4. In questi stati la macchina mousecom abilita il ricevitore e salva la trama ricevuta in un registro, diverso per ogni trama. La prima trama ricevuta è la trama di acknowledge, mentre la altre sono le tre trame di dati. La macchina effettua un controllo al termine di ogni trama ricevuta e, solo se la trama ricevuta è consistente con il protocollo, passa a ricevere le trama seguente, altrimenti ritorna a start. Al termine di receive4, se non ci sono stati problemi di ricezione, si passa allo stato paritycheck dove tramite i tre parity checkers avviene il controllo della parità per ogni trama. In caso di successo viene posto ad uno il piedino valid per un ciclo di clock. Al termine della ricezione la macchina ritorna allo stato di start.

Si noti che in tutti i casi di ricezione sbagliata o di violazioni dei tempi previsti nel protocollo il piedino di valid rimane basso mentre viene messo ad uno il piedino timeout per segnalare al mouse - tester che il colloquio con il mouse non ha avuto successo.

3.4 Vga

La macchina vga (di tipo vgadriver ) si occupa di scrivere sullo schermo il cursore nella posizione corrente.

Tale macchina riceve in ingresso i segnali globali di reset, enable e il clock, riceve inoltre i segnali rowpos[8..0], colpos[9..0], l_button, r_button che indicano rispettivamente la riga e la colonna in cui si trova il mouse e lo stato dei pulsanti dello stesso.

In uscita la vga restituisce i segnali di sincronismo di riga e quadro horiz_sync e vert_sync e i segnali di scrittura rgb[2..0].

Internamente alla macchina vengono utilizzati alcuni contatori e dei registri di appoggio. I contatori vengono di volta in volta caricati per effettuare la giusta temporizzazione dei segnali di sincronismo e delle bande di guardia.

La macchina parte dallo stato di start dove si inizializzano i segnali di sincronizzazione (si noti che tali segnali sono attivi bassi). I due stati successivi qsync_ini e qsync trasmettono il sincronismo di quadro. I due stati qgrd_ini e qgrd trasmettono la banda di guardia Q (per i nomi delle bande di guardia si rimanda al manuale della scheda fornito dalla Altera). I due stati qwrite_ini e qwrite contano quale riga scrivere. Dallo stato qwrite compreso in poi, per 480 volte, è ripetuta quindi la sequenza di stati descritta sotto: i due stati rsync_ini e rsync trasmettono il sincronismo di riga. I due stati cgrd_ini e cgrd trasmettono la banda di guardia C. I due stati rwite_ini e rwrite si occupano di scrivere la riga. In particolare lo stato rwrite viene ripetuto 640 volte per ogni riga e quando il pennello arriva alla riga e alla colonna corrispondente alla posizione del mouse colora il pixel. Per semplicità il cursore che rappresenta la posizione del mouse è un "pixelone" di 8 per 8 pixel. Il "pixelone" è bianco se nessun pulsante è premuto, verde se è premuto il pulsante sinistro, rosso se è premuto il destro, giallo se entrambi i pulsanti sono premuti. Si passa poi agli stati egrd_ini e egrd, che trasmettono la banda di guardia E che conclude la trasmissione di una riga. Quando sono state trasmesse tutte le 480 righe dallo stato qwrite si passa allo sequenza di stati sgrd_ini e sgrd che trasmettono la banda di guardia S la quale conclude la trasmissione del quadro. La macchina ritorna poi allo stato di start e ricomincia a trasmettere il quadro successivo.

3.5 Sender

Si tratta di una macchina a sei stati i cui ingressi significativi sono datain e mouseclk e le cui uscite sono dataout, txfin e timeout. Sull'ingresso datain è presente la stringa che deve essere trasmessa; essa è 11B - FFH - 0B nella macchina sender attivata da resetmouse, e 11B - EBH - 0B in quella attivata da mousecom. Il piedino mouseclk, in input al sender, è connesso attraverso le macchine superiori al piedino fisico bidirezionale mclk, e, in conseguenza di opportune transizioni su tale piedino, determina la trasmissione della trama attraverso l'uscita dataout: l'uscita di tale piedino, a livello di macchina superiore (resetmouse e mousecom), passa attraverso un mux che seleziona dataout o Vcc, e a livello ancora superiore attraverso un altro mux che seleziona l'ingresso al buffer di I/O fra l’uscita di resetmouse e quella di mousecom. La macchina superiore abbassa la linea mouseclk per 163 microsecondi, attiva poi la macchina sender, che invia in uscita il bit di start, e tiene basso il clock ancora per 10 microsecondi. Il piedino timeout viene attivato per un ciclo di clock, e la macchina torna in start, nel caso in cui, una volta lasciato libero, il clock rimanga a zero per 15 millisecondi, oppure esso non sia riportato a livello basso dal mouse entro il medesimo intervallo di tempo. La stringa da inviare al mouse arriva in ingresso ad un registro a 11bit, e il bit da inviare viene selezionato attraverso un multiplexer a 11 vie i cui ingressi di selezione sono pilotati da un registro che viene incrementato solamente sul fronte in discesa delle transizioni di mouseclk, ovvero quando, in accordo al protocollo, il mouse ha sicuramente campionato la linea dati.

Per quanto riguarda il comportamento nei vari stati, in start vengono inizializzati i registri e i contatori, in waitclockrise si attende che mouseclk torni a uno prima di iniziare la sequenza di trasmissione con il primo bit di dati. Se, per qualche motivo, dopo 15 millisecondi il clock non è ancora tornato alto, significa che c'è un problema perché è allora il mouse a tenere il clock a zero (dopo dieci microsecondi dall'attivazione della macchina sender il clock dovrebbe tornare a uno in quanto rilasciato dalla macchina superiore). Quando è possibile cominciare la comunicazione, nei vari stati la macchina esegue ciclicamente le seguenti operazioni 1) clupwait : quando il clock è tornato alto, attende 5 microsecondi per evitare di rilevare una transizione spuria verso il basso; 2) clup : attende di rilevare la transizione verso il basso del clock, e quando ciò avviene incrementa il valore del registro di selezione del multiplexer, presentando un nuovo bit sull'uscita dataout; 3) cldownwait : attende 5 microsecondi per evitare di rilevare nuove transizioni spurie verso l'alto 4) cldown : controlla che non ci sia stata violazione del tempo massimo di 15 millisecondi; se ciò è avvenuto, pone timeout a uno per un ciclo di clock e torna nello stato di start; se è stato trasmesso il bit di stop, torna a start e asserisce txfin per un ciclo di clock, altrimenti attende la transizione in salita di mouseclk e torna nello stato di clupwait.

La macchina sender, in conseguenza di timeout o alla fine della trasmissione, torna in start e lì rimane in quanto le viene tolta l’abilitazione.

3.6 Receiver

Si tratta di una macchina a sei stati che ha il compito di ricevere ciascuna trama trasmessa serialmente dal mouse e presentarla alla macchina superiore mousecom, dalla quale è attivata, in un registro dataout a 9 bit. Sono esclusi da tale uscita i bit di start e stop, mentre è presente il bit di parità, controllato dalla macchina superiore alla fine della ricezione delle quattro trame previste. Le altre uscite sono rxfin e timeout. Gli ingressi significativi sono mouseclk, connesso al piedino fisico bidirezionale della linea dati, che in questa macchina serve solo come ingresso, e delayctrl, che controlla il massimo ritardo ammissibile fra l'istante di attivazione della macchina recbyte e l'inizio della trasmissione da parte del mouse: se delayctrl è a uno, significa che recbyte è stata attivata per ricevere la prima trama generata dal mouse, per la quale il tempo massimo di attesa ammissibile a partire dall'invio di un comando è di 20 millisecondi; se delayctrl è a zero, significa che la trama che viene attesa non è la prima, pertanto si tratta di verificare che il tempo trascorso dalla fine della ricezione della trama precedente non ecceda i 2 millisecondi.

Nello stato di start vengono inizializzati i contatori con opportuni valori; nello stato successivo, startwait, si attende la discesa del clock, che deve avvenire entro il tempo massimo ammesso; se ciò non avviene, timeout passa a uno per un ciclo di clock e la macchina torna in start; appena invece mouseclk passa a zero, si inserisce nel registro di ricezione il valore campionato sulla linea dati, ovvero il bit di start, e si passa a cldownwait, dove si attendono 5 microsecondi per evitare di rilevare transizioni spurie; si passa poi in cldown dove, se sono stati ricevuti i nove bit previsti, si torna a start asserendo rxfin per un ciclo di clock, altrimenti si attende di vedere mouseclk a uno, al che si va in clupwait per la solita attesa di 5 microsecondi, e poi in clup; in tale stato si campiona la linea mouseclk finché, rilevando una transizione in salita, si inserisce il valore sulla linea data nel registro di ricezione e si torna in cldown. In ogni stato è prevista l'uscita per timeout.

Come per la macchina sender, in conseguenza di timeout o alla fine della ricezione, anche la macchina receiver torna in start e lì rimane in quanto le viene tolta l’abilitazione.

3.7 Registri RBR e TBR

Abbiamo utilizzato due registri a scorrimento come receiver buffer register e trasmitter buffer register. In particolare RBR è un registro a 11 bit a caricamento seriale e ad uscita parallela, mentre TBR è un registro a 11 bit a caricamento parallelo e ad uscita seriale.

3.8 Contatori

I contatori utilizzati sono riportati nelle figure successive. Abbiamo utilizzato molti contatori di dimensioni diverse per sfruttare meglio le loro caratteristiche. In alcune macchine a stati alcuni contatori sono utilizzati più volte e sono caricati con costanti diverse secondo lo scopo. Da notare che in tutti i contatori, tranne in quello da zero a undici, l'uscita RCO è stata registrata perché tale uscita, essendo combinatoria, non ci permetteva di campionare il segnale di fine conteggio entro i tempi di setup e per evitare di rilevare transizioni spurie. La differenza di circa 40 nanosecondi rispetto alla reale transizioni di RCO non ha alcuna conseguenza, visto il fattore dell'ordine di uno su mille rispetto ai tempi di clock del mouse.

Contatori utilizzati:

contatore da 0 a 11
contatore a 8 bit
contatore a 9 bit
contatore a 10 bit
contatore a 12 bit
contatore a 16 bit
contatore a 20 bit
contatore a 24 bit

3.9 Bus di I/O

Per implementare i piedini bidirezionali del mouse abbiamo utilizzato un bus di ingresso/uscita con porte open drain, viste le caratteristiche elettriche del collegamento PS/2. Trattandosi di comunicazione essenzialmente asincrona, è stato necessario inserire un flip-flop di protezione fra il bus e gli ingressi della macchina a stati (ovviamente sincrona) per evitare un incorretto pilotaggio dei flip flop di stato.

3.10 Multiplexer

Per pilotare correttamente le uscite bidirezionali abbiamo utilizzato due multiplexer, un mux 2 to 1 e un mux 4 to 1.

4. Simulazioni

La verifica della correttezza delle temporizzazioni è stata condotta preliminarmente mediante simulazione delle varie sottomacchine e della macchina globale.

Dati gli alti tempi di calcolo, per la simulazione della macchina principale mousetester abbiamo adottato un modello di vga ridotta (vgadriverreduced), le cui caratteristiche sono un numero molto inferiore di righe rispetto alla vga reale e ridotte bande di guardia. Abbiamo quindi ridotto il periodo di attesa fra il comando di reset e la risposta del mouse a soli 20 microsecondi, mentre abbiamo limitato a 12 microsecondi il periodo del clock generato dal dispositivo.

Simulazioni eseguite:

simulazione di due cicli completi di quadro della macchina VGAreduced
particolare dell'accensione del cursore largo otto pixel alla colonna 256
simulazione dell'invio della trama di Read Data e disabilitazione della macchina Sender a seguito di un impulso su txfin
simulazione della ricezione della trama di Acknowledge e disabilitazione della macchina Receiver a seguito di impulso su rxfin
simulazione generale della fase di reset e della ricezione della prima sequenza completa.

Comunicazione Host - Mouse PS/2 - Parte I

Se volete contattarmi per chiarimenti o suggerimenti potete farlo al seguente indirizzo:

f_iacopetti@libero.it

 
Ultimo aggiornamento: 20 Dicembre 2001, 20.05 HyperCounter