最早在CE下调屏的值的时候,因为没有挂仿真器,如果每次都是改好下载镜像看效果的话,速度显然太慢了。于是老大就给我出了一个注意,写个小软件直接写LCDC的寄存器看效果。于是就写了一个,效果也很不错,特别是设置IO的时候就变得很方便了。但是这是静态内存映射的,是参考了OAL层中OALPAtoVA函数直接把物理地址根据g_oalAddressTable中的对应关系直接转成虚拟地址的。然而在CE中,需要在全内核模式方可直接访问虚拟地址,而且不同平台下g_oalAddressTable列表也不一样,于是就想做成动态的映射,然而EVC下竟然不支持VirtualCopy,搜了一下帮助竟然没有找到,我的天,那咋整。
还好优快云上卧虎藏龙,发了个帖子,终于有个兄弟xqhrs232回帖说,EVC下使用VirtualCopy需要声明一下:
#ifdef __cplusplus
extern "C"
{
#endif
BOOL VirtualCopy( LPVOID, LPVOID, DWORD, DWORD );
#ifdef __cplusplus
}
#endif
试了一下,果然可以。呵呵,谢谢这位兄台。
参考了一下函数MmMapIoSpace,稍作修改,终于可以用了。
ULONG CRWregisterDlg::GetVirtMem(ULONG phyaddr)
{
PVOID pVirtualAddress;
ULONG SourceSize;
BOOL bSuccess;
ULONGLONG SourcePhys;
ULONG tempvalue;
SourcePhys = phyaddr & ~(PAGE_SIZE - 1); //页对齐
SourceSize = 4 + (phyaddr & (PAGE_SIZE - 1)); //大小
pVirtualAddress = VirtualAlloc(0, SourceSize, MEM_RESERVE, PAGE_NOACCESS);
if (pVirtualAddress != NULL)
{
bSuccess = VirtualCopy(
pVirtualAddress, (PVOID)(SourcePhys >> 8), SourceSize,
PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE);
if (bSuccess)
{
tempvalue = (ULONG)pVirtualAddress ;
tempvalue += phyaddr & (PAGE_SIZE - 1);
}
else
{
VirtualFree(pVirtualAddress, 0, MEM_RELEASE);
pVirtualAddress = NULL;
tempvalue = 0;
}
}
return tempvalue;
}
再次感谢xqhrs232!