• Non ci sono risultati.

4. ASPETTI REALIZZATIVI E SPERIMENTAZIONE

4.2 Caricamento driver

Quando avviene il collegamento tra il prototipo contenente il controller Cypress e l'host attraverso il cavo USB, inizia la fase di enumerazione del dispositivo. Durante questa fase, il sistema operativo deve selezionare e caricare un driver compatibile con la periferica.

Windows cerca informazioni all’interno di tutti i file INF (file di testo che contengono informazioni riguardo una o più periferiche e situati in una precisa cartella, ad esempio WINDOWS\System32\inf) confrontando il Vendor ID ed il Product ID del dispositivo con quelli memorizzati all’interno di tali file INF. Se viene trovato un match, viene caricato il driver (file in formato .sys) specificato all’interno di tale file. Nel caso in cui non venga trovato niente, Windows cerca di utilizzare driver della stessa classe, sottoclasse o protocollo della periferica.

4.2.1 Driver Cypress

CyUSB.sys che offre la possibilità di comunicare con ogni dispositivo Cypress compatibile. E' un driver general purpose che riconosce i comandi USB di basso livello senza implementarne di più alto livello, dipendenti dalla classe del dispositivo per i quali sono necessarie le opportune librerie.

La funzione principale di questo driver è inizialmente quella di permettere l'invio di comandi elementari verso la periferica per i test preliminari, atti a verificarne il corretto funzionamento, come per esempio alcuni trasferimenti o la lettura della configurazione di default del nostro dispositivo, salvo poi permettere ad un'applicazione utente di comunicare con la periferica.

Le caratteristiche principali del driver sono le seguenti:

• compatibile con il Windows Driver Model (WDM);

• certificato WHDL (privo di firma);

• supporta endpoint di tipo Control, Bulk, Interrupt ed Isochronous;

• supporta il Wake Up remoto;

• supporta la connessione multipla di più dispositivi USB contemporaneamente;

• supporta la modifica del GUID senza il re-build del driver;

• supporta l'esecuzione di script eseguiti all'avvio del sistema per trasferimenti di tipo control, atti alla configurazione del dispositivo.

4.2.2 Il file CyUSB.inf

Il file CyUSB.inf fornito nella SuiteUSB necessita di essere modificato in alcune sue parti, in particolar modo devono essere aggiunti il Vendor ID (che per i prodotti Cypress sarà sempre 04B4H) ed il Product ID (dipendente dal particolare dispositivo utilizzato con cui vogliamo collegare il driver).

;%VID_XXXX&PID_XXXX.DeviceDesc%=CyUsb, USB\VID_XXXX&PID_XXXX

dovrà essere sostituita con

;%VID_04B4&PID_8613.DeviceDesc%=CyUsb, USB\VID_04B4&PID_8613

Se si vuole far riconoscere la periferica con un nome differente rispetto a quello di default si deve modificare la stringa DeviceDesc. Sarà sufficiente sostituire la riga

VID_XXXX&PID_XXXX.DeviceDesc="Cypress USB Generic Driver (3.4.2.00)"

con

VID_04B4&PID_8613.DeviceDesc="Nome Personalizzato"

Se si desiderano apportare ulteriori modifiche al file è consigliabile creare una copia sia del file INF che del driver CyUSB.sys, rinominandoli in modo opportuno.

I parametri editabili sono tutti nella sezione [Strings], in particolare :

CYUSB_Provider = "Cypress"

CYUSB_Company = "Cypress Semiconductor Corporation" CYUSB_Description = "Cypress Generic USB Driver" CYUSB_DisplayName = "Cypress USB Generic"

CYUSB_Install = "Cypress CYUSB Driver Installation Disk"

Infine, è modificabile anche il Guid, ovvero il Global Unique Identifier, un numero a 16 byte utilizzato dalle applicazioni per accedere alle periferiche. L'univocità tra due Guid non è garantita, ma essendo le possibili combinazioni un numero molto alto (2128), la probabilità di generare due Guid identici è

trascurabile.

Per generare un nuovo Guid è disponibile l'utility GuidGen, distribuita con Microsoft Visual Studio.

Un'altra interessante opportunità offerta da questo driver è il trasferimento automatico verso il Control endpoint di default (endpoint di indirizzo 0) all'avvio della periferica.

Questo trasferimento può essere usato creando uno script, ad esempio, per caricare un firmware personalizzato ogniqualvolta la periferica venga collegata all'host, provocando una re-enumerazione del dispositivo. E' quindi fondamentale che il nuovo firmware imponga un nuovo PID, altrimenti la periferica continuerà ad essere re-enumerata in un loop infinito, in quanto verrà sempre messo in esecuzione lo script.

In alternativa, si deve configurare il file INF in modo tale che venga eseguito lo script solo se la periferica collegata ha una particolare coppia {VID, PID} (ad esempio quelli di default).

4.2.3 Riconoscimento della periferica

Dopo aver modificato il file INF, per il corretto funzionamento della periferica è necessario associarle il driver CyUSB.sys.

Questa procedura è dipendente dal sistema operativo usato, ma comunque deve essere fatta manualmente. Innanzitutto, se il sistema operativo utilizzato è a 64 bit, occorre disabilitare il caricamento dei soli driver con firma digitale. Per fare ciò, durante il boot di sistema, occorre tenere premuto il tasto F8, e successivamente selezionare l'opzione:

Disable Driver Signature Enforcement

Dopo aver collegato la periferica, il sistema operativo segnalerà che nessun driver è stato trovato. Quindi bisogna forzare manualmente l'installazione, eseguendo i seguenti passi:

• Entrare nel Device Manager;

“Universal Serial Bus Controllers”, cliccare due volte;

• Selezionare “Driver” nella finestra di dialogo;

• Inserire il Path del nostro driver. Per fare ciò, selezionare l'opzione:

Don't search. I will choose the driver to install

e successivamente

Have Disk

• Dopo aver dato conferma, l'installazione è terminata.

L'installazione del driver libusb 0.1 e winusb per libusb 1.0 sono molto simili alla procedura vista in precedenza, per cui si è scelto di non ripetere.

Documenti correlati