Solicitudes de tarjeta SD
Después de que un controlador de dispositivo de tarjeta Secure Digital (SD) se haya abierto e inicializado una interfaz al controlador de bus SD, puede enviar solicitudes. Hay dos maneras de enviar solicitudes: sincrónicamente mediante la rutina SdBusSubmitRequest y de forma asincrónica mediante la rutina SdBusSubmitRequestAsync . Ambas rutinas se exportan mediante la biblioteca sd bus (sdbus.lib).
La rutina de solicitud sincrónica toma dos parámetros: un contexto de interfaz y un paquete de solicitud.
Contexto de interfaz
El controlador de dispositivo recupera el contexto de interfaz del miembro Context de la estructura SDBUS_INTERFACE_STANDARD después de abrir una interfaz SD con SdBusOpenInterface. El controlador debe pasar esta información de contexto en cada vez que llama a un método en la interfaz .
Solicitud de paquete
El controlador de dispositivo debe asignar e inicializar una estructura de SDBUS_REQUEST_PACKET . Esta estructura especifica la función de solicitud y otras características de la solicitud.
Dado que SdBusSubmitRequest es sincrónico, no devuelve STATUS_PENDING. El controlador de dispositivo debe ejecutarse en IRQL < DISPATCH_LEVEL cuando llama a esta rutina.
La rutina de solicitud asincrónica toma los cinco parámetros siguientes: un contexto de interfaz, un paquete de solicitud, un IRP, un puntero a una rutina de finalización y un contexto de finalización.
Contexto de interfaz
Este parámetro es el mismo que el parámetro con el mismo nombre usado con el caso sincrónico.
Solicitud de paquete
Este parámetro es el mismo que el parámetro con el mismo nombre usado con el caso sincrónico.
IRP
Este parámetro contiene un IRP que el controlador de dispositivo ha asignado o un IRP que el controlador recibió del controlador ubicado encima de él en la pila de controladores. El IRP se usa como operador para la solicitud.
Rutina de finalización
Este parámetro contiene una rutina de IoCompletion para el IRP proporcionado en el parámetro IRP.
Contexto de usuario
Este parámetro contiene un puntero a los datos de contexto de usuario que el sistema pasa a la rutina de finalización especificada en el parámetro de rutina de finalización.
El controlador de dispositivo debe ejecutarse en IRQL <= DISPATCH_LEVEL cuando llama a la rutina SdBusSubmitRequestAsync . SdBusSubmitRequest es un contenedor que asigna su propio IRP y llama a SdBusSubmitRequestAsync. Se proporciona para mayor comodidad del escritor de controladores.
En las secciones siguientes se proporcionan ejemplos de código que muestran cómo un controlador de dispositivo envía cada una de las dos categorías principales de solicitudes SD: para obtener una descripción de las distintas solicitudes, consulte SD_REQUEST_FUNCTION.
Solicitudes de propiedad Digital segura (SD)
Los controladores de tarjeta Digital (SD) seguros usan solicitudes de propiedad para leer o establecer las propiedades de la tarjeta. Por ejemplo, un controlador de tarjeta SD podría leer una propiedad para determinar si el conmutador de protección de escritura de la tarjeta SD está en la posición bloqueada, o un controlador para una función determinada en una tarjeta SDIO multifunción podría solicitar el número que el controlador de autobús asigna a la función que administra.
En el ejemplo de código siguiente se muestra cómo un controlador para una función en una tarjeta multifunción podría solicitar su número de función desde el controlador de autobús:
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;
}
En este ejemplo de código, un controlador de dispositivo inicializa un paquete de solicitud de bus SD, SDBUS_REQUEST_PACKET y lo pasa a SdBusSubmitRequest. El paquete de solicitud totalmente inicializado tiene las siguientes características:
Tipo de la solicitud
El ejemplo de código especifica una solicitud de SDRF_GET_PROPERTY en el miembro RequestFunction del paquete de solicitud, que indica al controlador de bus que recupere una propiedad de la tarjeta. Para obtener una descripción de la solicitud de SDRF_GET_PROPERTY, consulte SD_REQUEST_FUNCTION.
Propiedad que se va a recuperar
El ejemplo de código especifica la propiedad SDP_FUNCTION_NUMBER en el miembro Parameters.GetSetProperty.Property del paquete de solicitud, que indica al controlador de bus que recupere el contenido de la propiedad de número de función. Para obtener una descripción de la propiedad SDP_FUNCTION_NUMBER, vea SDBUS_PROPERTY.
Contenido y longitud de la propiedad
El ejemplo de código coloca un puntero a un búfer en la extensión del dispositivo en .
Parameters.GetSetProperty.Buffer miembro del paquete de solicitud. El controlador de autobús almacenará el número de función en esta ubicación. El código de ejemplo también almacena el tamaño de este búfer en el miembro Parameters.GetSetProperty.Length del paquete de solicitud.
Solicitudes de comandos de dispositivo digital segura (SD)
Los controladores usan solicitudes de comandos de tarjeta Secure Digital (SD) para enviar comandos a un dispositivo SD. El protocolo para los comandos SD se define en la especificación de tarjeta digital segura . Los controladores pueden enviar solicitudes de comandos en cualquier momento después de que el IRP de IRP_MN_START_DEVICE que inicia el dispositivo se complete correctamente.
Esta sección contiene dos ejemplos de código: una solicitud de comando que lee un byte de datos de un registro de una tarjeta SD mediante E/S directa y una solicitud de comando de dispositivo que escribe una mayor cantidad de datos en una tarjeta SD mediante E/S extendida. La explicación de la segunda sección depende de la primera, por lo tanto, los lectores deben estudiar la primera sección antes de estudiar la segunda: