Condividi tramite


Richieste di schede SD

Dopo l'apertura e l'inizializzazione di un'interfaccia per il driver del bus SD, un driver di scheda Secure Digital (SD) può inviare richieste. Esistono due modi per inviare richieste: in modo sincrono tramite la routinesdBusSubmitRequeste in modo asincrono tramite la routinesdBusSubmitRequestAsync. Entrambe queste routine vengono esportate dalla libreria del bus SD (sdbus.lib).

La routine di richiesta sincrona accetta due parametri: un contesto di interfaccia e un pacchetto di richiesta.

contesto dell'interfaccia
Il driver di dispositivo recupera il contesto dell'interfaccia dal Context membro della struttura SDBUS_INTERFACE_STANDARD dopo aver aperto un'interfaccia SD con SdBusOpenInterface. Il driver deve passare queste informazioni di contesto in ogni volta che chiama un metodo nell'interfaccia.

pacchetto di richiesta
Il driver di dispositivo deve allocare e inizializzare una struttura SDBUS_REQUEST_PACKET. Questa struttura specifica la funzione di richiesta e altre caratteristiche della richiesta.

Poiché SdBusSubmitRequest è sincrono, non restituisce STATUS_PENDING. Il driver di dispositivo deve essere in esecuzione in IRQL < DISPATCH_LEVEL quando chiama questa routine.

La routine di richiesta asincrona accetta i cinque parametri seguenti: un contesto di interfaccia, un pacchetto di richiesta, un IRP, un puntatore a una routine di completamento e un contesto di completamento.

contesto dell'interfaccia
Questo parametro è uguale al parametro con lo stesso nome usato con il caso sincrono.

pacchetto di richiesta
Questo parametro è uguale al parametro con lo stesso nome usato con il caso sincrono.

IRP
Questo parametro contiene un IRP allocato dal driver di dispositivo o un IRP ricevuto dal driver che si trova sopra nello stack di driver. L'IRP viene usato come vettore per la richiesta.

Routine di completamento
Questo parametro contiene una routine di IoCompletion per l'IRP fornito nel parametro IRP.

contesto utente
Questo parametro contiene un puntatore ai dati del contesto utente che il sistema passa alla routine di completamento specificata nel parametro corrispondente.

Il driver di dispositivo deve essere in esecuzione a IRQL <= DISPATCH_LEVEL nel momento in cui chiama la routine SdBusSubmitRequestAsync. SdBusSubmitRequest è un wrapper che alloca il proprio IRP e chiama SdBusSubmitRequestAsync. Viene fornito per comodità dell'autore del driver.

Le sezioni seguenti forniscono esempi di codice che illustrano come un driver di dispositivo invia ognuna delle due categorie principali di richieste SD: per una descrizione delle diverse richieste, vedere SD_REQUEST_FUNCTION.

Richieste di proprietà Secure Digital (SD)

I driver di scheda Secure Digital (SD) usano richieste di proprietà per leggere o impostare le proprietà della scheda. Ad esempio, un driver di scheda SD potrebbe leggere una proprietà per determinare se l'opzione di protezione da scrittura sulla scheda SD si trova nella posizione bloccata o un driver per una determinata funzione su una scheda SDIO multifunzione potrebbe richiedere il numero assegnato dal driver del bus alla funzione gestita.

L'esempio di codice seguente illustra come un driver per una funzione su una scheda multifunzione potrebbe richiedere il numero di funzione dal driver del bus.

 sdrp = ExAllocatePool(NonPagedPool, 
 sizeof(SDBUS_REQUEST_PACKET));
 if (!sdrp) {
 return STATUS_INSUFFICIENT_RESOURCES;
 }
 RtlZeroMemory(sdrp, sizeof(SDBUS_REQUEST_PACKET));
 sdrp->RequestFunction = SDRF_GET_PROPERTY;
 sdrp->Parameters.GetSetProperty.Property = 
 SDP_FUNCTION_NUMBER;
 sdrp->Parameters.GetSetProperty.Buffer = 
 &pDevExt->FunctionNumber;
 sdrp->Parameters.GetSetProperty.Length = 
 sizeof(pDevExt->FunctionNumber);
 status = SdBusSubmitRequest (pDevExt->BusInterface.Context,sdrp);
 ExFreePool(sdrp);
 if (!NT_SUCCESS(status)) {
 return status;
 }

In questo esempio di codice, un driver di dispositivo inizializza un pacchetto di richiesta del bus SD, SDBUS_REQUEST_PACKETe lo passa a SdBusSubmitRequest. Il pacchetto di richiesta completamente inizializzato presenta le caratteristiche seguenti:

Tipo di richiesta
Nell'esempio di codice viene specificata una richiesta SDRF_GET_PROPERTY nel membro RequestFunction del pacchetto di richiesta, che indica al driver del bus di recuperare una proprietà dalla scheda. Per una descrizione della richiesta di SDRF_GET_PROPERTY, vedere SD_REQUEST_FUNCTION.

proprietà per recuperare
Nell'esempio di codice, la proprietà SDP_FUNCTION_NUMBER viene specificata nel membro Parameters.GetSetProperty.Property del pacchetto di richiesta, che istruisce il driver bus a recuperare il contenuto della proprietà del numero di funzione. Per una descrizione della proprietà SDP_FUNCTION_NUMBER, vedere SDBUS_PROPERTY.

Contenuto delle proprietà e lunghezza
L'esempio di codice inserisce un puntatore a un buffer nell'estensione del dispositivo.

Parameters.GetSetProperty.Buffer membro del pacchetto di richiesta. Il conducente del bus archivierà il numero di funzione in questa posizione. Il codice di esempio archivia anche le dimensioni di questo buffer nel Parameters.GetSetProperty.Length membro del pacchetto di richiesta.

Richieste di comandi del dispositivo Secure Digital (SD)

I driver usano richieste di comando della scheda Secure Digital (SD) per inviare comandi a un dispositivo SD. Il protocollo per i comandi SD è definito nella specifica Secure Digital Card. I driver possono inviare richieste di comando in qualsiasi momento dopo il completamento con successo dell'IRP IRP_MN_START_DEVICE che avvia il dispositivo.

Questa sezione contiene due esempi di codice: una richiesta di comando che legge un byte di dati da un registro di una scheda SD usando l'I/O diretto e una richiesta di comando del dispositivo che scrive una quantità maggiore di dati in una scheda SD usando operazioni di I/O estese. La spiegazione nella seconda sezione dipende dal primo, quindi, i lettori devono studiare la prima sezione prima di studiare il secondo:

richieste digitali sicure che usano

Richieste digitali sicure che utilizzano I/O esteso