다음을 통해 공유


IWDFDevice3::MapIoSpace 메서드(wudfddi.h)

[경고: UMDF 2는 UMDF의 최신 버전이며 UMDF 1을 대체합니다. 모든 새 UMDF 드라이버는 UMDF 2를 사용하여 작성해야 합니다. UMDF 1에는 새로운 기능이 추가되지 않으며 최신 버전의 Windows 10에서는 UMDF 1에 대한 지원이 제한되어 있습니다. 유니버설 Windows 드라이버는 UMDF 2를 사용해야 합니다. 자세한 내용은 UMDF시작 .]을 참조하세요.

MapIoSpace 메서드는 지정된 실제 주소 범위를 시스템 주소 공간에 매핑하고 의사 기본 주소를 반환합니다.

통사론

HRESULT MapIoSpace(
  [in]  PHYSICAL_ADDRESS    PhysicalAddress,
  [in]  SIZE_T              NumberOfBytes,
  [in]  MEMORY_CACHING_TYPE CacheType,
  [out] void                **pPseudoBaseAddress
);

매개 변수

[in] PhysicalAddress

매핑할 I/O 범위의 시작 64비트 물리적 주소를 지정합니다.

[in] NumberOfBytes

매핑할 바이트 수를 나타내는 0보다 큰 값을 지정합니다.

[in] CacheType

실제 주소 범위를 매핑하는 데 사용할 캐시 특성을 나타내는 MEMORY_CACHING_TYPE 값을 지정합니다. MEMORY_CACHING_TYPE 열거형 형식은 Wudfwdm.h에 정의되어 있습니다.

[out] pPseudoBaseAddress

의사 기준 주소에 대한 포인터를 받는 위치의 주소입니다.

반환 값

이 메서드는 작업이 성공하면 S_OK 반환합니다. 그렇지 않으면 이 메서드는 Winerror.h에 정의된 오류 코드 중 하나를 반환합니다.

발언

드라이버는 CM_PARTIAL_RESOURCE_DESCRIPTOR 구조에서 cmResourceTypeMemory 형식의 변환된 리소스를 수신하는 경우 디바이스를 시작하는 동안 이 메서드를 호출해야 합니다. MapIoSpace 리소스 목록에 반환된 실제 주소를 의사 기본 주소라고 하는 프레임워크 관리형 주소에 매핑합니다.

그런 다음 드라이버는 의사 기준 주소를 사용하여 READ_REGISTER_Xxx 사용하여 디바이스 레지스터에 액세스하고 Xxx함수를 WRITE_REGISTER_ 수 있습니다. 예를 들어 UMDF 1.x 드라이버 읽기 및 디바이스 레지스터에 쓰기를 참조하세요.

MapIoSpace 호출하는 드라이버는 UmdfDirectHardwareAccess INF 지시문을 AllowDirectHardwareAccess 설정해야 합니다.

드라이버가 UmdfRegisterAccessMode INF 지시문을 RegisterAccessUsingUserModeMapping 설정하는 경우 MapIoSpace 호출하면 지정된 실제 주소 범위도 사용자가 액세스할 수 있는 사용자 모드 기준 주소 범위에 매핑됩니다GetHardwareRegisterMappedAddress.

UMDF 드라이버에서 사용할 수 있는 INF 지시문에 대한 자세한 내용은 INF 파일WDF 지시문 지정을 참조하세요.

PHYSICAL_ADDRESS 형식은 다음과 같이 Wudfwdm.h에 정의됩니다.

typedef LARGE_INTEGER PHYSICAL_ADDRESS;

예제

다음 코드 예제에서 UMDF 드라이버는 IPnpCallbackHardware2::OnPrepareHardware 콜백 함수를 사용하여 메모리 매핑된 레지스터 리소스를 검사하고 사용자 모드 주소 공간에 매핑합니다. 그런 다음, 메모리 위치에 액세스하는 WriteToDevice 메서드를 구현합니다. 그런 다음 드라이버는 IPnpCallbackHardware2::OnReleaseHardware 콜백에서 UnmapIoSpace 호출합니다. 드라이버의 INF 파일은 UmdfDirectHardwareAccess 지시문을 AllowDirectHardwareAccess 설정하여 UMDF 하드웨어 액세스 기능을 사용하도록 설정해야 합니다.


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;
}


요구 사항

요구
지원 종료 UMDF 2.0 이상에서는 사용할 수 없습니다.
대상 플랫폼 바탕 화면
최소 UMDF 버전 1.11
헤더 wudfddi.h
DLL WUDFx.dll

참고 항목

IWDFDevice3