引用 63 楼 liuxmzc 的回复:
这里好像只给出了动态加载新的中断,请问“旧”的中断是如何保存,或者恢复的。
[/quote]
正在看,
现在先调试wifi先了。呵呵,外部中断初始化。
///
/// intr_init: Initialize the Interrupt
/// Input:
/// pHC - Hard context
/// Output:
/// None
/// Return:
/// 0 - success
/// -1 - fail
static int intr_init(PSSP_HARDWARE_CONTEXT pHC)
{
int result = 0;
int irqreturn = 5;
///DWORD threadID; // thread ID
ENTERFUNC();
if (pHC == NULL) {
result = -1;
goto funcFinal;
}
//#if 1
// Setup EINT11 (GPG3)
pHC->pGPIORegs->GPGCON &= ~(0x3 pGPIORegs->GPGCON |= (0x2 pGPIORegs->EXTINT1 &= ~(0x7 pGPIORegs->EXTINT1 |= (0x2 pGPIORegs ->GPGUP&=~(0x0008);
//#else
// Configure the interrupt pin
// IRQ_EINT20
//SPIINT
pHC->pGPIORegs->GPGCON &= ~(3GPGCON |= (2EXTINT2 &= ~(0xfEXTINT2 |= (0x2GPGUP&=~(1GPFCON &= ~(0x03 pGPIORegs->GPFCON |= 0x01 pGPIORegs->GPFUP |= (0x00 pGPIORegs->GPFDAT &= ~(0x01 pGPIORegs->GPFDAT |= (0x00 pGPIORegs->GPBCON &= ~(0x03 pGPIORegs->GPBCON |= 0x01 pGPIORegs->GPBUP |= (0x00 pGPIORegs->GPBDAT &= ~(0x01 pGPIORegs->GPBDAT |= (0x00 pGPIORegs->EINTMASK &= ~(0x1 DevIntrInfo.irq = IRQ_EINT8_23;
pHC->DevIntrInfo.irq = IRQ_EINT11;//20 11
pHC->DevIntrInfo.pIstFunc = (MYISTFUNC) dev_ist;
pHC->DevIntrInfo.param = (LPVOID)pHC;
#if (USE_DEVIRQ == 1)
///Initialize the interrupt, IST
GSPIMSG(1, (TEXT("USE_DEVIRQ == 1\n")));
irqreturn = setupInterrupt(&pHC->DevIntrInfo);
RETAILMSG(1, (TEXT("irqreturn: %d!\n"), irqreturn));
///Load the ISR
//installISR(&pHC->DevIntrInfo);
#else
{
GSPIMSG(1, (TEXT("USE_DEVIRQ == 0\n")));
MYINTRINFO* pMyIntrInfo = &pHC->DevIntrInfo;
DWORD threadID;
if(!(pMyIntrInfo->hIntrEvent = CreateEvent( NULL, FALSE, FALSE, NULL))) {
GSPIMSG(ERRMSG, (TEXT("CreateEvent(DevIntrInfo.hIntrEvent) FAILED!\n")));
goto funcFinal;
}
pMyIntrInfo->hISTHandle = CreateThread((LPSECURITY_ATTRIBUTES)NULL,
0,
dev_isrpoll_func,
pHC,
0,
&threadID);
if (pMyIntrInfo->hISTHandle == NULL) {
GSPIMSG(ERRMSG, (TEXT("hSSPInterThread Create FAILED!\n")));
goto funcFinal;
}
CeSetThreadPriority(pMyIntrInfo->hISTHandle, DEFAULT_IST_PRIORITY);
}
#endif ///USE_DEVIRQ
/*
// set_GPIO_mode(pHC->pGPIORegs, SSP_INTR|SSPIRQ_ATTR); ///INTR
// set_GPIO_IRQ_edge(pHC->pGPIORegs, SSP_INTR, SIG_FALLING);
///Initialize the device interrupt info
pHC->DevIntrInfo.irq = IRQ_GPIOXX_2;
pHC->DevIntrInfo.pIstFunc = (MYISTFUNC) dev_ist;
pHC->DevIntrInfo.param = (LPVOID)pHC;
#if (USE_DEVIRQ == 1)
///Initialize the interrupt, IST
setupInterrupt(&pHC->DevIntrInfo);
///Load the ISR
//installISR(&pHC->DevIntrInfo);
#else
{
MYINTRINFO* pMyIntrInfo = &pHC->DevIntrInfo;
DWORD threadID;
if(!(pMyIntrInfo->hIntrEvent = CreateEvent( NULL, FALSE, FALSE, NULL))) {
GSPIMSG(ERRMSG, (TEXT("CreateEvent(DevIntrInfo.hIntrEvent) FAILED!\n")));
goto funcFinal;
}
pMyIntrInfo->hISTHandle = CreateThread((LPSECURITY_ATTRIBUTES)NULL,
0,
dev_isrpoll_func,
pHC,
0,
&threadID);
if (pMyIntrInfo->hISTHandle == NULL) {
GSPIMSG(ERRMSG, (TEXT("hSSPInterThread Create FAILED!\n")));
goto funcFinal;
}
CeSetThreadPriority(pMyIntrInfo->hISTHandle, DEFAULT_IST_PRIORITY);
}
#endif ///USE_DEVIRQ
*/
funcFinal:
EXITFUNC(result);
return result;
}复制代码