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 및 WRITE_REGISTER_Xxx 함수를 사용하여 디바이스 레지스터에 액세스할 수 있습니다. 예를 들어 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