Compartir a través de


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

Consulte también

IWDFDevice3 de