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 |