19,502
社区成员
发帖
与我相关
我的任务
分享
BOOL MSR_IST_Init(void)
{
UINT32 MSR_PhyIRQArray[3];
HANDLE g_hMsrIntrThread;
DWORD g_dwMsrIntrThread;
MSR_MSG((TEXT("[MSR] %s(%d)\r\n"),TEXT(__FUNCTION__),__LINE__));
g_MSR_IST_EXIT = FALSE;
MSR_PhyIRQArray[0] = -1;
MSR_PhyIRQArray[1] = OAL_INTR_TRANSLATE;
MSR_PhyIRQArray[2] = MCR_PHY_IRQ;
//g_MsrSysIrq = SYSINTR_UNDEFINED;
g_MsrIntrEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
if(NULL == g_MsrIntrEvent)
{
MSR_ERR((TEXT("[MSR] Create Event Failed!\r\n")));
goto cleanup;
}
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, MSR_PhyIRQArray, sizeof(DWORD), &g_MsrSysIrq, sizeof(DWORD), NULL))
{
// invalid matrix_key_sysintr SYSINTR value!
MSR_ERR((TEXT("[MSR] ERROR(@3): Failed to request sysintr value for IRQ_EINT0(%d) interrupt.\r\n"),IRQ_TIMER1));
goto cleanup;
}
MSR_INF((TEXT("[MSR] Mapped MSR_PhyIRQ 0x%x to g_MsrSysIrq 0x%x.\r\n"),MSR_PhyIRQArray[2], g_MsrSysIrq));
// initialize the interrupt event
if (!InterruptInitialize (g_MsrSysIrq, g_MsrIntrEvent, NULL, 0))
{
MSR_ERR((TEXT("[MSR]ERROR(@4): Interrupt g_MsrIntrEvent initialize failed.\r\n")));
}
g_hMsrIntrThread = CreateThread((LPSECURITY_ATTRIBUTES)NULL,
0,
(LPTHREAD_START_ROUTINE)mcr_receive_data_isr,
0,
0,
&g_dwMsrIntrThread);
if (!g_hMsrIntrThread)
{
MSR_ERR( (TEXT("[MSR] ERROR(@%s)]: Unable to create Thread\r\n"),(__FUNCTION__)));
goto cleanup;
}
MSR_INF( (TEXT("[MSR] MSR initialized IST Done\n")));
return TRUE ;
cleanup:
MSR_ERR( (TEXT("[MSR] fail to initial intr and thread\r\n")));
return FALSE ;
}
DWORD mcr_receive_data_isr(LPVOID lpParams)
{
int rv;
DWORD dwErr;
LONG lVicIntEnable,tmp3;
UINT32 PendService,nGroup, IntrruptNo;
MSR_MSG((TEXT("[MSR] mcr_receive_data_isr thread start...\r\n")));
while(!g_MSR_IST_EXIT)
{
MSR_MSG((TEXT("[MSR] WaitForSingleObject...\r\n")));
dwErr = WaitForSingleObject(g_MsrIntrEvent,INFINITE);
PendService = GPIO_EINTGetService((LPVOID)g_pMsrIOReg ,&nGroup,&IntrruptNo);
if ((PendService&0x76) !=0x76)
{
RETAILMSG(TRUE, (_T("[PWR:INF] EINT Serivce not MSR Intrrupt\r\n"), PendService));
//InterruptDone(g_MsrSysIrq);
continue;
}
//}
RETAILMSG(1, (TEXT("in: %s(%d)\r\n"),TEXT(__FUNCTION__),__LINE__));
mcr_mask_interrupt();
//*暂时关中断
lVicIntEnable=InterlockedExchange((LPLONG)&g_pVICReg->VICINTENABLE,(LONG)0xffffffff);
InterlockedExchange((LPLONG)&g_pVICReg->VICINTENCLEAR,(LONG)0xffffffff); //Clear All Intr
//一些和主题无关的代码已经删掉了
//*开中断
InterlockedExchange((LPLONG)&g_pVICReg->VICINTENABLE,(LONG)lVicIntEnable);
// 打开磁条卡阅读器中断
mcr_unmask_interrupt();
InterruptDone(g_MsrSysIrq);
}
MSR_MSG((TEXT("[MSR] mcr_receive_data_isr thread done!!!\r\n")));
return TRUE;
}
static BOOL AllocResources(void)
{
UINT32 aIRQ[3];
PHYSICAL_ADDRESS ioPhysicalBase = {0,0};
RETAILMSG(PWR_ZONE_ENTER, (_T("[PWR] ++%s()\r\n"), _T(__FUNCTION__)));
//------------------
// GPIO Controller SFR
//------------------
ioPhysicalBase.LowPart = S3C6410_BASE_REG_PA_GPIO;
g_pGPIOReg = (S3C6410_GPIO_REG *)MmMapIoSpace(ioPhysicalBase, sizeof(S3C6410_GPIO_REG), FALSE);
if (g_pGPIOReg == NULL)
{
RETAILMSG(PWR_ZONE_ERROR,(_T("[PWR:ERR] %s() : pGPIOReg MmMapIoSpace() Failed \n\r"), _T(__FUNCTION__)));
return FALSE;
}
//--------------------
// Power Button Interrupt
//--------------------
aIRQ[0] = -1;
aIRQ[1] = OAL_INTR_TRANSLATE;
aIRQ[2] = IRQ_RESERVED;
//g_dwSysIntrPowerBtn = SYSINTR_UNDEFINED;
g_hEventPowerBtn = NULL;
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, aIRQ, sizeof(aIRQ), &g_dwSysIntrPowerBtn, sizeof(DWORD), NULL))
{
RETAILMSG(PWR_ZONE_ERROR, (_T("[PWR:ERR] %s() : IOCTL_HAL_REQUEST_SYSINTR Power Button Failed \n\r"), _T(__FUNCTION__)));
g_dwSysIntrPowerBtn = SYSINTR_UNDEFINED;
return FALSE;
}
g_hEventPowerBtn = CreateEvent(NULL, FALSE, FALSE, NULL);
if(NULL == g_hEventPowerBtn)
{
RETAILMSG( PWR_ZONE_ERROR, (_T("[PWR:ERR] %s() : CreateEvent() Power Button Failed \n\r"), _T(__FUNCTION__)));
return FALSE;
}
if (!(InterruptInitialize(g_dwSysIntrPowerBtn, g_hEventPowerBtn, 0, 0)))
{
RETAILMSG( PWR_ZONE_ERROR, (_T("[PWR:ERR] %s() : InterruptInitialize() Power Button Failed \n\r"), _T(__FUNCTION__)));
return FALSE;
}
// Create Power Button Thread
g_hThreadPowerBtn = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) PowerButtonThread, NULL, 0, NULL);
if (g_hThreadPowerBtn == NULL )
{
RETAILMSG( PWR_ZONE_ERROR, (_T("[PWR:ERR] %s() : CreateThread() Power Button Failed \n\r"), _T(__FUNCTION__)));
goto CleanUp;
}
RETAILMSG( PWR_ZONE_ENTER, (_T("[PWR] --%s()\r\n"), _T(__FUNCTION__)));
return TRUE;
}
INT WINAPI PowerButtonThread(void)
{
DWORD nBtnCount = 0;
DWORD dwCurTick = 0 ;
DWORD dwOldTick = 0;
DWORD dwErr;
UINT32 PendService,Group,uNo;
RETAILMSG(PWR_ZONE_ENTER, (_T("[PWR:INF] ++%s()\r\n"), _T(__FUNCTION__)));
while(!g_bExitThread)
{
WaitForSingleObject(g_hEventPowerBtn, INFINITE);
if(g_bExitThread)
{
break;
}
PendService = GPIO_EINTGetService((LPVOID)g_pGPIOReg,&Group,&uNo);
RETAILMSG(PWR_ZONE_EVENT_HOOK, (_T("[PWR:INF] Serivce=%08X\r\n"), PendService));
if ((PendService&0x88) !=0x88)
{
//ResetEvent
continue;
}
Button_pwrbtn_disable_interrupt(); // Mask EINT
Button_pwrbtn_clear_interrupt_pending(); // Clear Interrupt Pending
//一些和主题无关的代码已经删掉了
InterruptDone(g_dwSysIntrPowerBtn);
}
return 0;
}