求助!6410外部中断组如何设置中断线程?

[复制链接]
查看11 | 回复1 | 2021-1-27 05:48:45 | 显示全部楼层 |阅读模式
6410的外部中断为EXINT0~27(GROUP0),Ext.InterruptGroup1~Ext.InterruptGroup9,从Ext.InterruptGroup1到Ext.InterruptGroup9每一组都有若干个中断。除了EXINT0~27每一个中断都有一个中断号对应一个中断,外部中断组EXINTGROUP[1]~EXINTGROUP[9]都使用同一个中断号#defineIRQ_RESERVED91//53。
如果我使用GPO6(Ext.InterruptGroup7[6])和GPP8(Ext.InterruptGroup8[8])我的中断线程初始化应该怎么设置呢?请各位大师指点啊!!!!
下面是GPO6的中断设置

BOOLMSR_IST_Init(void)
{
UINT32MSR_PhyIRQArray[3];
HANDLEg_hMsrIntrThread;
DWORDg_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]CreateEventFailed!\r\n")));
gotocleanup;
}
if(!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR,MSR_PhyIRQArray,sizeof(DWORD),&g_MsrSysIrq,sizeof(DWORD),NULL))
{
//invalidmatrix_key_sysintrSYSINTRvalue!
MSR_ERR((TEXT("[MSR]ERROR(@3):FailedtorequestsysintrvalueforIRQ_EINT0(%d)interrupt.\r\n"),IRQ_TIMER1));
gotocleanup;
}
MSR_INF((TEXT("[MSR]MappedMSR_PhyIRQ0x%xtog_MsrSysIrq0x%x.\r\n"),MSR_PhyIRQArray[2],g_MsrSysIrq));
//initializetheinterruptevent
if(!InterruptInitialize(g_MsrSysIrq,g_MsrIntrEvent,NULL,0))
{
MSR_ERR((TEXT("[MSR]ERROR(@4):Interruptg_MsrIntrEventinitializefailed.\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)]:UnabletocreateThread\r\n"),(__FUNCTION__)));
gotocleanup;
}
MSR_INF((TEXT("[MSR]MSRinitializedISTDone\n")));
returnTRUE;
cleanup:
MSR_ERR((TEXT("[MSR]failtoinitialintrandthread\r\n")));
returnFALSE;
}

DWORDmcr_receive_data_isr(LPVOIDlpParams)
{
intrv;
DWORDdwErr;
LONGlVicIntEnable,tmp3;
UINT32PendService,nGroup,IntrruptNo;
MSR_MSG((TEXT("[MSR]mcr_receive_data_isrthreadstart...\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]EINTSerivcenotMSRIntrrupt\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);//ClearAllIntr
//一些和主题无关的代码已经删掉了
//*开中断
InterlockedExchange((LPLONG)&g_pVICReg->VICINTENABLE,(LONG)lVicIntEnable);
//打开磁条卡阅读器中断
mcr_unmask_interrupt();
InterruptDone(g_MsrSysIrq);
}
MSR_MSG((TEXT("[MSR]mcr_receive_data_isrthreaddone!!!\r\n")));
returnTRUE;
}



下面是GPP8的设置

staticBOOLAllocResources(void)
{
UINT32aIRQ[3];
PHYSICAL_ADDRESSioPhysicalBase={0,0};
RETAILMSG(PWR_ZONE_ENTER,(_T("[PWR]++%s()\r\n"),_T(__FUNCTION__)));
//------------------
//GPIOControllerSFR
//------------------
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():pGPIORegMmMapIoSpace()Failed\n\r"),_T(__FUNCTION__)));
returnFALSE;
}
//--------------------
//PowerButtonInterrupt
//--------------------
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_SYSINTRPowerButtonFailed\n\r"),_T(__FUNCTION__)));
g_dwSysIntrPowerBtn=SYSINTR_UNDEFINED;
returnFALSE;
}
g_hEventPowerBtn=CreateEvent(NULL,FALSE,FALSE,NULL);
if(NULL==g_hEventPowerBtn)
{
RETAILMSG(PWR_ZONE_ERROR,(_T("[PWR:ERR]%s():CreateEvent()PowerButtonFailed\n\r"),_T(__FUNCTION__)));
returnFALSE;
}
if(!(InterruptInitialize(g_dwSysIntrPowerBtn,g_hEventPowerBtn,0,0)))
{
RETAILMSG(PWR_ZONE_ERROR,(_T("[PWR:ERR]%s():InterruptInitialize()PowerButtonFailed\n\r"),_T(__FUNCTION__)));
returnFALSE;
}
//CreatePowerButtonThread
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()PowerButtonFailed\n\r"),_T(__FUNCTION__)));
gotoCleanUp;
}
RETAILMSG(PWR_ZONE_ENTER,(_T("[PWR]--%s()\r\n"),_T(__FUNCTION__)));
returnTRUE;
}

INTWINAPIPowerButtonThread(void)
{
DWORDnBtnCount=0;
DWORDdwCurTick=0;
DWORDdwOldTick=0;
DWORDdwErr;
UINT32PendService,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();//MaskEINT
Button_pwrbtn_clear_interrupt_pending();//ClearInterruptPending
//一些和主题无关的代码已经删掉了
InterruptDone(g_dwSysIntrPowerBtn);
}
return0;
}

分 -->
回复

使用道具 举报

千问 | 2021-1-27 05:48:45 | 显示全部楼层
忘了说了
#defineMCR_PHY_IRQIRQ_RESERVED
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行