背光代码
volatile S3C2440A_IOPORT_REG * v_pIOPregs= NULL;
BOOL
BacklightInitialize()
{
BOOL bRet = TRUE;
BL_PowerOn(TRUE);
// key backlight
v_pIOPregs->GPBCON = v_pIOPregs->GPBCON & (~(0x3<<4)) | (0x2<<4);
// lcd backlight
v_pIOPregs->GPBCON = v_pIOPregs->GPBCON & (~(0x3<<6)) | (0x2<<6);
v_pIOPregs->GPBUP &= (1<<2) | (1<<3);
RETAILMSG(1, (TEXT("BAK: IO init \r\n")));
return bRet;
}
系统起来后,背光驱动加载不上
提示
Data Abort: Thread=83b812c0 Proc=81226360 'device.exe'
AKY=00000005 PC=03251aec(backlight.dll+0x00001aec) RA=03251c74(backlight.dll+0x00001c74) BVA=06000014 FSR=00000007
RaiseException: Thread=83b812c0 Proc=81226360 'device.exe'
AKY=00000005 PC=03f8de68(coredll.dll+0x0001de68) RA=8022cd40(NK.EXE+0x0002cd40) BVA=00000001 FSR=00000001
在程序中吧IO定义和初始化屏蔽后,背光驱动可以加载,是不是定义有问题啊。
我遇到这个问题都是虚拟地址和物理地址映射有问题,你查这个地方的代码估计可以找到问题的所在。
PC=03251aec(backlight.dll+0x00001aec)
——找到驱动名.map文件定位即可。
就是虚拟地址和物理地址映射问题,我加了这个函数后问题还是一样啊
BOOL InitializeAddresses(VOID)
{
BOOL RetValue = TRUE;
/* IO Register Allocation */
v_pIOPregs = (volatile S3C2440A_IOPORT_REG *)VirtualAlloc(0, sizeof(S3C2440A_IOPORT_REG), MEM_RESERVE, PAGE_NOACCESS);
if (v_pIOPregs == NULL)
{
ERRORMSG(1,(TEXT("For IOPregs : VirtualAlloc failed!\r\n")));
RetValue = FALSE;
}
else
{
if (!VirtualCopy((PVOID)v_pIOPregs, (PVOID)(S3C2440A_BASE_REG_PA_IOPORT >> 8), sizeof(S3C2440A_IOPORT_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE))
{
ERRORMSG(1,(TEXT("For IOPregs: VirtualCopy failed!\r\n")));
RetValue = FALSE;
}
}
if (!RetValue)
{
if (v_pIOPregs)
{
VirtualFree((PVOID) v_pIOPregs, 0, MEM_RELEASE);
}
v_pIOPregs = NULL;
}
return(RetValue);
}