Método IWDFDevice3::MapIoSpace (wudfddi.h)
[Advertencia: UMDF 2 es la versión más reciente de UMDF y sustituye a UMDF 1. Todos los controladores UMDF nuevos deben escribirse con UMDF 2. No se agregan nuevas características a UMDF 1 y hay compatibilidad limitada con UMDF 1 en versiones más recientes de Windows 10. Los controladores universales de Windows deben usar UMDF 2. Para obtener más información, consulta Introducción con UMDF.
El método MapIoSpace asigna el intervalo de direcciones físicos especificado al espacio de direcciones del sistema y devuelve una dirección pseudo base.
Sintaxis
HRESULT MapIoSpace(
[in] PHYSICAL_ADDRESS PhysicalAddress,
[in] SIZE_T NumberOfBytes,
[in] MEMORY_CACHING_TYPE CacheType,
[out] void **pPseudoBaseAddress
);
Parámetros
[in] PhysicalAddress
Especifica la dirección física de 64 bits inicial del intervalo de E/S que se va a asignar.
[in] NumberOfBytes
Especifica un valor mayor que cero, que indica el número de bytes que se van a asignar.
[in] CacheType
Especifica un valor de MEMORY_CACHING_TYPE , que indica el atributo de caché que se va a usar para asignar el intervalo de direcciones físico. El tipo de enumeración MEMORY_CACHING_TYPE se define en Wudfwdm.h.
[out] pPseudoBaseAddress
Dirección de una ubicación que recibe un puntero a la dirección pseudo base.
Valor devuelto
El método devuelve S_OK si la operación se realiza correctamente. De lo contrario, este método devuelve uno de los códigos de error definidos en Winerror.h.
Comentarios
Un controlador debe llamar a este método durante el inicio del dispositivo si recibe recursos traducidos de tipo CmResourceTypeMemory en una estructura de CM_PARTIAL_RESOURCE_DESCRIPTOR . MapIoSpace asigna la dirección física devuelta en la lista de recursos a una dirección administrada por el marco denominada pseudo base.
A continuación, el controlador puede usar la dirección pseudo base para acceder a los registros de dispositivos con las funciones READ_REGISTER_Xxx y WRITE_REGISTER_Xxx . Para obtener un ejemplo, consulte Lectura y escritura en registros de dispositivos en controladores UMDF 1.x.
Un controlador que llama a MapIoSpace debe establecer la directiva UmdfDirectHardwareAccess INF en AllowDirectHardwareAccess.
Si el controlador establece la directiva INF UmdfRegisterAccessMode en RegisterAccessUsingUserModeMapping, la llamada a MapIoSpace también asigna el intervalo de direcciones físicos especificado a un intervalo de direcciones base en modo de usuario al que el controlador puede tener acceso posteriormente llamando a GetHardwareRegisterMappedAddress.
Para obtener más información sobre las directivas INF que pueden usar los controladores UMDF, vea Especificar directivas WDF en archivos INF.
El tipo de PHYSICAL_ADDRESS se define en Wudfwdm.h, como se indica a continuación:
typedef LARGE_INTEGER PHYSICAL_ADDRESS;
Ejemplos
En el ejemplo de código siguiente, un controlador UMDF usa su función de devolución de llamada IPnpCallbackHardware2::OnPrepareHardware para examinar sus recursos de registro asignados a memoria y asignarlos al espacio de direcciones en modo de usuario. A continuación, el ejemplo implementa un método WriteToDevice que accede a las ubicaciones de memoria. A continuación, el controlador llama a UnmapIoSpace desde su devolución de llamada IPnpCallbackHardware2::OnReleaseHardware . El archivo INF del controlador debe habilitar la característica de acceso de hardware UMDF estableciendo la directiva UmdfDirectHardwareAccess en AllowDirectHardwareAccess.
HRESULT
CMyDevice::OnPrepareHardware(
__in IWDFDevice3 * pWdfDevice,
__in IWDFCmResourceList * pRaw,
__in IWDFCmResourceList * pTrans
)
{
PCM_PARTIAL_RESOURCE_DESCRIPTOR desc = NULL;
PHYSICAL_ADDRESS regBasePA = {0};
ULONG regLength = 0;
BOOLEAN found = FALSE;
HRESULT hr = S_OK;
//
// Scan the list to identify our resource.
//
for (i=0; i < pWdfResTranslated->GetCount(); i++) {
desc = (PCM_PARTIAL_RESOURCE_DESCRIPTOR) pTrans->GetDescriptor(i);
switch (desc->Type) {
case CmResourceTypeMemory:
//
// See if this is the memory resource we’re looking for.
//
if (desc->u.Memory.Length == 0x200) {
regsBasePA = desc->u.Memory.Start;
regsLength = desc->u.Memory.Length;
found = TRUE;
}
break;
default:
// Ignore all other descriptors.
break;
}
}
//
// Map the resource. Store the register base in partner device
// object for later access.
//
if (found) {
hr = pWdfDevice->MapIoSpace(regBasePA,
regLengthlength,
MmNonCached,
(void **)&m_RegBase);
if (SUCCEEDED(hr)) {
//
// Store the register range in partner object. This will
// be needed for unmapping.
//
m_RegLength = regLength;
}
}
…
}
//
// UMDF driver uses one of the register access APIs such as
// WRITE_REGISTER_Xxx or READ_REGISTER_Xxx macros to access device register.
//
VOID
CMyQueue::WriteToDevice(
__in IWDFDevice3* pWdfDevice,
__in UCHAR Value
)
{
//
// Write the UCHAR value at offset 2 from register base.
//
WRITE_REGISTER_UCHAR(pWdfDevice,
(m_MyDevice->m_RegBase)+2,
Value);
}
HRESULT
CMyDevice::OnReleaseHardware(
__in IWDFDevice3 * pWdfDevice,
__in IWDFCmResourceList * pTrans
)
{
//
// Unmap registers memory resource.
//
pWdfDevice->UnmapIoSpace(m_RegBase, m_RegLength);
return S_OK;
}
Requisitos
Requisito | Value |
---|---|
Finalización del soporte técnico | No disponible en UMDF 2.0 y versiones posteriores. |
Plataforma de destino | Escritorio |
Versión mínima de UMDF | 1.11 |
Encabezado | wudfddi.h |
Archivo DLL | WUDFx.dll |