新手乍到,看“LEDDriver.cpp”时遇到拦路虎:
void Virtual_Alloc()
{
s2440IOP = (volatile IOPreg *) VirtualAlloc(0,sizeof(IOPreg),MEM_RESERVE, PAGE_NOACCESS);
if(s2440IOP == NULL) {
RETAILMSG(1,(TEXT("For s2440IOP: VirtualAlloc faiLED!\r\n")));
}
else {
if(!VirtualCopy((PVOID)s2440IOP,(PVOID)(IOP_BASE),sizeof(IOPreg),PAGE_READWRITE | PAGE_NOCACHE )) {
RETAILMSG(1,(TEXT("For s2440IOP: VirtualCopy faiLED!\r\n")));
}
}
}
在网上找的资料:
/*GPIO Virtual alloc 先是用VirtualAlloc()来预留一块内存,如果成功则用VirtualCopy()映射IOP_BASE到刚申请的一块内存里。
在WINCE下能够直接访问的都是虚拟地址,不能直接访问GPIO端口,因此我们首先需要将GPIO口的物理地址映射到虚拟地址上来。
分别使用VirtualAlloc和VirtualCopy这两个函数来完成映射!
这两个函数的原型:
LPVOID VirtualAlloc( LPVOID lpAddress, DWORD dwSize,DWORD flAllocationType, DWORD flProtect );
BOOL VirtualCopy( LPVOID lpvDest, LPVOID lpvSrc, DWORD cbSize, DWORD fdwProtect );
如果这两个函数执行成功,哪么VirtualAlloc将返回一个指针,使用这个指针我们就可以直接访问GPIO,通过读写相关地址寄存器,来控制GPIO端口!*/
发现 “#define IOP_BASE 0xB1600000 // 0x56000000”
在这儿彻底晕倒。。 产生一大堆问号。。
为什么0x56000000映射到虚拟地址是0xB1600000 ?
CE系统就是这样规定的?
还是这就是一条”定理“?
还是有太多东西不懂了,要想理解这个 我需要补充什么东西?
请好心人指教!小弟先行谢过!