EOS

USB embedded facile

Lo sviluppo di un sistema embedded con interfaccia USB viene sensibilmente agevolato grazie alla libreria software USB per i microcontroller da 16 e 32 bit di Fujitsu Semiconductor.

Il bus seriale universale (USB) diventa sempre più l’interfaccia standard per sistemi embedded di qualsiasi tipo. Oltre ad offrire la possibilità di connettere supporti di archiviazione portatili (es. chiavette USB) o dispositivi di controllo (es. mouse o tastiera), uno degli usi più frequenti è la connessione al PC che viene usata per vari scopi, ad esempio aggiornare firmware, scambiare dati di vario tipo o semplicemente impostare parametri operativi e di controllo. L’USB può essere utilizzato anche come interfaccia di diagnostica per la manutenzione, e sta sostituendo mano a mano interfacce seriali consolidate come la RS232, la PS/2 e perfino la Centronics/IEEE-1284 parallela. Questo non è dovuto solo all’aumento dei volumi di dati da trasferire, ma anche al fatto che i nuovi PC e notebook non sono più dotati di queste interfacce, ma di numerose porte USB. Tra gli altri fattori associati alla diffusione dell’USB segnaliamo l’elevato grado di correzione degli errori, la funzionalità plug&play e la possibilità di alimentare i dispositivi con una tensione stabilizzata attraverso l’interfaccia USB. Per sviluppare componenti firmware adatti per l’USB il programmatore deve avere una profonda conoscenza della specifica USB e delle macro hardware implementate sul chip. Se non viene applicata nessuna classe USB standard contenuta nel sistema operativo quando il sistema embedded viene usato come funzione USB (es. collegamento slave al PC), occorre sviluppare un driver specifico. Naturalmente è necessario anche sapere come programmare il sistema operativo del PC.

Figura 1: USB Assistant (programma di configurazione).

Figura 1: USB Assistant (programma di configurazione).

La maggior parte i progettisti evita di affrontare questa spesa e ricorre a classi standard già implementate (es. Human Interface Device, come mouse, tastiere e dispositivi simili) o a dispositivi di archiviazione di massa (es. chiavette USB, hard dischi esterni, ecc...). Anche diversi moduli convertitori RS232-USB hanno riscosso un notevole successo sul mercato ma, pur consentendo la connessione USB al PC, convertono i dati solo nel formato standard RS232 sul lato embedded. Sul lato del PC viene simulata una porta COM virtuale con la classe CDC (Communication Device Class). Il driver necessario viene implementato nei sistemi operativi basati su Windows e Linux. Tuttavia questa soluzione può essere utilizzata solo in alcuni casi e, ovviamente, le prestazioni del protocollo RS232 seriale sono limitate. Per poter utilizzare l’intera larghezza di banda dei dati e le diverse modalità di trasmissione USB, ad esempio interrupt transfer, bulk transfer o isochronous transfer, a seconda dell’applicazione, è essenziale implementare un codice della classe USB intero. A questo proposito Fujitsu offre modelli di progetto per lo sviluppo di firmware per i suoi microcontroller da 16 (serie MB96330) e 32 bit (serie MB91660/665). Tali modelli contengono una libreria che si occupa delle funzioni base dell’USB, ad esempio procedure di log-on e logoff del bus (definite anche enumerazione) e impostazione di ‘punti finali’ per la trasmissione dati. Sulla base di queste funzioni, la libreria contiene un’implementazione campione di una USB Vendor Class personalizzata. L’implementazione di classi standard tipiche come HID o MSD è illustrata negli esempi. Per imparare a utilizzare l’USB occorrono tool di configurazione adatti che aiutano a creare un dispositivo USB, tra cui l’effettiva configurazione USB (descrittori USB) e il modulo di comunicazione che crea l’interfaccia tra l’applicazione e il driver (classe USB). Il "Fujitsu USB Assistant" (vedi in figura 1), che crea tutti i file necessari per l’USB come codice C, è uno di questi tool. Per rendere la classe USB più trasparente tra il driver e l’applicazione utente, il configuratore, come classe USB, crea un modello per le routine di comunicazione che viene adattato alla configurazione corrispondente (vedi figura 2).

Figura 2: modello di riferimento sul microcontroller.

Figura 2: modello di riferimento sul microcontroller.

 

Figura 3: modello di riferimento MCU-PC .

Figura 3: modello di riferimento MCU-PC .

La classe USB (vedi figura 3) si occupa principalmente dei trasferimenti dei dati ricevuti o trasmessi come trasferimenti di blocchi “interrupt-controlled” e fornisce i dati per l’applicazione utente. Infine il protocollo di trasmissione viene convertito nella classe USB e può essere controllato dall’applicazione utente mediante la API, consentendo quindi all’applicazione embedded di accedere facilmente all’USB. Un programma campione (listato 1) mostra un loopback device semplice che riceve dati mediante il punto finale 1 e li ritrasmette attraverso il punto finale 2.

void main(void)
{
     uint8_t* pu8Buffer;
     uint32_t u32DataSize;
     UsbClass_Init();                   //Init buffers and event handlers
     UsbFunction_Initialize(TRUE);      //TRUE: Autoconnect, FALSE: Manual
connect
     for(;;)
     {
        /* returns 0, if no data was received. Otherwise the received
data length */
       u32DataSize = UsbClass_GetReceivedDataEndpoint1(&pu8Buffer);
       if (u32DataSize > 0)
       {
            UsbClass_SendDataVia2(pu8Buffer, u32DataSize,
USB_SENDING_MODE_POLLED);
       }
    }
}
Listato 1

Una volta impostato il puntatore al buffer di trasmissione/ricezione e una variabile intera per la lunghezza di dati, la classe USB è inizializzata. Le relative informazioni provenienti dai descrittori USB generate prima con il configuratore vengono usate per questo; vengono impostati il gestore degli eventi, il buffer di dati e il gestore delle richieste necessari. In questo caso il punto finale 1 viene inizializzato come destinatario (HOST OUT) e il punto finale 2 come mittente (HOST IN). Quindi viene avviata la libreria con funzione USB. Il parametro TRUE consente di utilizzare le funzioni di connessione automatica della libreria. Nel loop infinito risultante vengono scritti nel buffer di ricezione i dati ricevuti al punto finale 1. La funzione di lettura del punto finale 1 rimanda la lunghezza dei dati ricevuti che viene salvata nella variabile u32DataSize. Quando viene richiamata la funzione di trasmissione al punto finale 2, questo valore viene inviato come parametro insieme alle informazioni sul buffer di trasmissione. Anche la modalità di trasmissione viene inviata come ulteriore parametro. In questo caso il processo di trasmissione deve essere controllato mediante polling. Tra le altre opzioni sono inclusi interrupt interni alla MCU o DMA interni per fornire dati alla macro USB. Ma la maggior parte dei problemi dei progettisti riguardano il computer visto che anche in questo caso occorrono driver adatti. Questo è il motivo per cui classi standard come la porta COM virtuale o gli HDI vengono utilizzati spesso come alternativa per sviluppare driver adatti a livello interno, sebbene in questo caso i progettisti si limitino a determinate velocità e protocolli di trasmissione predefiniti. La situazione diventa più complessa quando si usano protocolli e classi proprietari, ma gli utenti possono avere velocità più elevate. Fujitsu ha trovato una soluzione grazie al progetto “open source” LibUsbDotNet. Il pacchetto comprende il driver LibUsb e un tool di configurazione per adattarlo. Su questa base Fujitsu offre una libreria “wrapper” .NET utilizzabile per accedere al dispositivo USB dell’utente anche sul lato del PC. In primo luogo la libreria “wrapper” assicura l’implementazione stabile di LibUsbDotNet in progetti proprietari e una netta separazione tra il codice con protezione GPL e il codice proprietario. Particolare attenzione è stata data all’hot plug dato che l’USB non può più essere considerato una connessione statica. La libreria “wrapper” supporta anche diversi ambienti di programmazione .NET come Visual Studio, Borland e LabVIEW. Nuove formulazioni di LibUsbDotNet, a loro volta, aprono applicazioni .NET USB a Linux e Mac OS, eliminando la necessità del porting tra sistemi diversi. Oltre alla libreria con funzione USB esaminata in questo articolo, il tool di configurazione ‘Fujitsu USB Assistant’ supporta anche l’uso del microcontroller come host USB (cioè master di sistema) al quale è possibile connettere, ad esempio, un mouse o una chiavetta di memoria. Anche in questo caso il tool genera i file di configurazione necessari nel codice C che controllano la libreria software dell’host USB compresa nei modelli USB. In base a questo l’USB Supervisor supporta anche l’implementazione di diverse classi standard. Sul proprio sito Fujitsu Semiconductor offre altre demo e note applicative sull’USB. Con il driver USB sviluppato da Thesycon, per i microcontroller Fujitsu sono disponibili anche altri software di terze parti (in alcuni casi gratuiti). Fujitsu offre inoltre seminari di due giorni sull’host USB e sul0la funzione USB per presentare ai clienti interessati l’USB embedded in modo semplice.

Scrivi un commento

EOS