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 nuevos controladores UMDF deben escribirse mediante 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 a 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.
Observaciones
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 dirección pseudo base.
A continuación, el controlador puede usar la dirección pseudo base para acceder a los registros de dispositivos con READ_REGISTER_Xxx y WRITE_REGISTER_funciones de Xxx. Para obtener un ejemplo, consulte lectura y escritura en registros de dispositivos en controladores de UMDF 1.x.
Un controlador que llama a MapIoSpace debe establecer la directiva UmdfDirectHardwareAccess INF en AllowDirectHardwareAccess.
Si el controlador establece la directiva UmdfRegisterAccessMode INF en RegisterAccessUsingUserModeMapping, al llamar a MapIoSpace también se asigna el intervalo de direcciones físicos dado a un intervalo de direcciones base en modo de usuario al que el controlador puede acceder posteriormente llamando a GetHardwareRegisterMappedAddress.
Para obtener más información sobre las directivas INF que pueden usar los controladores UMDF, vea Especificación de directivas WDF en archivos INF.
El tipo 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 IPnpCallbackHardware2::OnPrepareHardware función de devolución de llamada 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 IPnpCallbackHardware2::OnReleaseHardware devolución de llamada. 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 | Valor |
---|---|
fin del soporte técnico | No disponible en UMDF 2.0 y versiones posteriores. |
de la plataforma de destino de | Escritorio |
versión mínima de UMDF | 1.11 |
encabezado de | wudfddi.h |
DLL de | WUDFx.dll |