1
Windows Embedded Compact 2013을 실행하는 플랫폼의 경우 사용자 모드에서 실제 메모리에 액세스해야합니다. 메모리 매핑은 커널 모드 드라이버에서 수행되고 주소는 사용자 모드 프로그램에 반환됩니다. 이 코드는 물리적 메모리 0xe000a000 (zynq 칩 GPIO베이스 주소)에 매핑된다Windows CE : 사용자 모드에서 실제 메모리 매핑
LPOID GetVirtualAddress()
{
volatile DWORD sDevPhysAddr = 0xe000a000;
volatile DWORD dwSize = PAGE_SIZE;
LPVOID lpUserAddr;
volatile ULONG SourceSize;
volatile ULONG SourcePhys;
void* pvProcess = (void*)GetCallerVMProcessId();
SourcePhys = sDevPhysAddr & ~(PAGE_SIZE - 1);
SourceSize = PAGE_SIZE;
RETAILMSG(1, (L"Address: %08x Size: %08x.\r\n", SourcePhys, SourceSize));
lpUserAddr = (LPDWORD)VirtualAllocEx(pvProcess, 0, SourceSize, MEM_RESERVE, PAGE_NOACCESS);
if (lpUserAddr == NULL) {
RETAILMSG(1, (L"VirtualAllocEx failed. GetLastError %d.\r\n", GetLastError()));
return NULL;
}
if (!VirtualCopyEx(pvProcess, lpUserAddr, GetCurrentProcess(), (PVOID)
/*(*/SourcePhys/* >> 8)*/, SourceSize,
/*PAGE_PHYSICAL | */PAGE_READWRITE | PAGE_NOCACHE)) {
RETAILMSG(1, (L"VirtualCopyEx failed. Error %d.\r\n", GetLastError()));
return NULL;
}
RETAILMSG(1, (L"Before round up lpUserAddr=0x%x\r\n", lpUserAddr));
lpUserAddr = (LPVOID)((ULONG)lpUserAddr + (sDevPhysAddr & (PAGE_SIZE - 1)));
shared_mem = lpUserAddr;
RETAILMSG(1, (L"After round up gUserAddr=0x%x\r\n", shared_mem));
return lpUserAddr;
}
다음과 같이 함수 GetVirtualMemory은 커널 드라이버
BOOL BTN_IOControl(DWORD context, DWORD code, UCHAR *pInBuffer, DWORD inSize, UCHAR *pOutBuffer,DWORD outSize, DWORD *pOutSize)
{
PDWORD tValue = (PDWORD)pOutBuffer;
switch(code)
{
case IOCTL_MAP_MEMORY:
*tValue = GetVirtualAddress();
*pOutSize = 4;
break;
.....
}
에서
. 오류 87 (잘못된 매개 변수)으로 VirtualCopyEx에서 코드가 실패합니다. 그러나이 코드는 기본 물리적 주소 0x81F00000에서 작동합니다 (이 주소는 원래 프로그래머가 사용했습니다). 내 질문은 어떻게 GPIO 주소에 대한 매핑을 활성화하는 것입니다. 나는 가능한 다른 방법을 시도해 볼 의향이있다.