📄 cfw.c
字号:
s2410INT->rINTMSK &= ~BIT_DMA1;
// DMA2 (output).
//
//s2410INT->rSRCPND = BIT_DMA2;
// S3C2410X Developer Notice (page 4) warns against writing a 1 to a 0 bit in the INTPND register.
//if (s2410INT->rINTPND & BIT_DMA2) s2410INT->rINTPND = BIT_DMA2;
s2410INT->rINTMSK &= ~BIT_DMA2;
break;
case SYSINTR_ADC:
//return(FALSE);
break;
case SYSINTR_PCMCIA_LEVEL: // PCMCIA data on EINT8.
s2410INT->rINTMSK &= ~BIT_EINT8_23;
//s2410INT->rSRCPND = BIT_EINT8_23;
//s2410INT->rINTPND = BIT_EINT8_23;
s2410IOP->rEINTMASK &= ~0x100;
//s2410IOP->rEINTPEND = 0x100;
RETAILMSG(1,(TEXT("::: SYSINTR_PCMCIA_LEVEL OEMInterruptEnable\r\n")));
break;
case SYSINTR_PCMCIA_EDGE:
//return(FALSE);
break;
case SYSINTR_PCMCIA_STATE: // PCMCIA insertion interrupt.
s2410INT->rSRCPND = BIT_EINT3; // to clear the previous pending states
// S3C2410X Developer Notice (page 4) warns against writing a 1 to a 0 bit in the INTPND register.
if (s2410INT->rINTPND & BIT_EINT3) s2410INT->rINTPND = BIT_EINT3;
s2410INT->rINTMSK &= ~BIT_EINT3;
RETAILMSG(1,(TEXT("::: SYSINTR_PCMCIA_STATE OEMInterruptEnable\r\n")));
break;
case SYSINTR_TIMING:
//return(FALSE);
break;
case SYSINTR_ETHER: // Ethernet on EINT9.
s2410IOP->rEINTPEND = 0x200;
s2410IOP->rEINTMASK &= ~0x200;
s2410INT->rSRCPND = BIT_EINT8_23; // by shim
// S3C2410X Developer Notice (page 4) warns against writing a 1 to a 0 bit in the INTPND register.
if (s2410INT->rINTPND & BIT_EINT8_23) s2410INT->rINTPND = BIT_EINT8_23;
s2410INT->rINTMSK &= ~BIT_EINT8_23;
break;
case SYSINTR_DM9000: // Ethernet on EINT14.
s2410IOP->rEINTPEND = 0x4000;
s2410IOP->rEINTMASK &= ~0x4000;
//s2410INT->rSRCPND = BIT_EINT8_23; // by shim
// S3C2410X Developer Notice (page 4) warns against writing a 1 to a 0 bit in the INTPND register.
if (s2410INT->rINTPND & BIT_EINT8_23) s2410INT->rINTPND = BIT_EINT8_23;
s2410INT->rINTMSK &= ~BIT_EINT8_23;
// RETAILMSG(1,(TEXT("::: SYSINTR_DM9000 OEMInterruptEnable\r\n")));
break;
case SYSINTR_16550: // Ethernet on EINT13.
s2410IOP->rGPGCON = (s2410IOP->rGPGCON & ~(0x3 << 10)) | (0x2 << 10);
s2410IOP->rEINTPEND = 0x2000;
s2410IOP->rEINTMASK &= ~0x2000;
s2410INT->rSRCPND = BIT_EINT8_23; // by shim
// S3C2410X Developer Notice (page 4) warns against writing a 1 to a 0 bit in the INTPND register.
if (s2410INT->rINTPND & BIT_EINT8_23) s2410INT->rINTPND = BIT_EINT8_23;
s2410INT->rINTMSK &= ~BIT_EINT8_23;
RETAILMSG(1,(TEXT("liudiping:OEMInterruptEnable-----\r\n")));
break;
#if 0
case SYSINTR_USB:
// USB host interrupt enable bit. by hjcho
s2410INT->rINTMSK &= ~BIT_USBH;
break;
case SYSINTR_USBD:
s2410INT->rINTMSK &= ~BIT_USBD;
//RETAILMSG(1,(TEXT("::: SYSINTR_USBD OEMInterruptEnable\r\n")));
break;
#else
case SYSINTR_USB: // USB host.
s2410INT->rSRCPND = BIT_USBH;
// S3C2410X Developer Notice (page 4) warns against writing a 1 to a 0 bit in the INTPND register.
if (s2410INT->rINTPND & BIT_USBH) s2410INT->rINTPND = BIT_USBH;
s2410INT->rINTMSK &= ~BIT_USBH;
break;
case SYSINTR_USBD:
s2410INT->rSRCPND = BIT_USBD;
// S3C2410X Developer Notice (page 4) warns against writing a 1 to a 0 bit in the INTPND register.
if (s2410INT->rINTPND & BIT_USBD) s2410INT->rINTPND = BIT_USBD;
s2410INT->rINTMSK &= ~BIT_USBD;
break;
#endif
case SYSINTR_POWER:
s2410INT->rSRCPND = BIT_EINT0;
// S3C2410X Developer Notice (page 4) warns against writing a 1 to a 0 bit in the INTPND register.
if (s2410INT->rINTPND & BIT_EINT0) s2410INT->rINTPND = BIT_EINT0;
s2410INT->rINTMSK &= ~BIT_EINT0;
s2410INT->rSRCPND = BIT_EINT2;
// S3C2410X Developer Notice (page 4) warns against writing a 1 to a 0 bit in the INTPND register.
if (s2410INT->rINTPND & BIT_EINT2) s2410INT->rINTPND = BIT_EINT2;
s2410INT->rINTMSK &= ~BIT_EINT2;
break;
default:
bRet = FALSE; /* unsupported interrupt value */
//return(FALSE);
break;
}
INTERRUPTS_ON();
return bRet;
//return(TRUE);
}
//------------------------------------------------------------------------------
//
// @func BOOL | OEMInterruptDisable | Disable a hardware interrupt
// @rdesc none
// @comm OEMInterruptDisable is called by the Kernel when a device driver
// calls <f InterruptDisable>. The system is not preemtible when this
// function is called.
// @xref <l Overview.Windows CE Kernel OEM Interface> <f InterruptDisable>
//
//------------------------------------------------------------------------------
void
OEMInterruptDisable(DWORD idInt) // @parm Interrupt ID to be disabled. See <t Interrupt ID's>
// for the list of possible values.
{
volatile INTreg *s2410INT = (INTreg *)INT_BASE;
volatile IOPreg *s2410IOP = (IOPreg *)IOP_BASE;
volatile MMCreg *s2410SDIO = (MMCreg *)MMC_BACE;
INTERRUPTS_OFF();
switch (idInt)
{
case SYSINTR_BREAK: // There is no halt button on P2.
break;
case SYSINTR_DMA0:
s2410INT->rINTMSK |= BIT_DMA0; // SDIO DMA interrupt
//RETAILMSG(1,(TEXT("::: SYSINTR_DMA0 OEMInterruptDisable\r\n")));
break;
case SYSINTR_SDMMC:
s2410INT->rINTMSK |= BIT_MMC;
//RETAILMSG(1,(TEXT("::: SYSINTR_SDMMC OEMInterruptDisable\r\n")));
break;
case SYSINTR_SDMMC_SDIO_INTERRUPT:
s2410INT->rINTMSK |= BIT_MMC;
s2410SDIO->rSDIINTMSK &= ~(0x1<<12); // interrupt from SDIO card
//RETAILMSG(1,(TEXT("::: SYSINTR_SDMMC_SDIO_INTERRUPT OEMInterruptDisable\r\n")));
break;
case SYSINTR_SDMMC_CARD_DETECT:
s2410IOP->rEINTMASK |= (1 << 18);
s2410INT->rINTMSK |= BIT_EINT8_23;
//RETAILMSG(1,(TEXT("::: SYSINTR_SDMMC_CARD_DETECT OEMInterruptDisable\r\n")));
break;
case SYSINTR_TOUCH:
break;
case SYSINTR_TOUCH_CHANGED:
s2410INT->rINTMSK |= BIT_ADC;
s2410INT->rINTSUBMSK |= INTSUB_TC;
break;
case SYSINTR_KEYBOARD:
s2410INT->rINTMSK |= BIT_EINT1;
break;
case SYSINTR_SERIAL:
s2410INT->rINTMSK |= BIT_UART0;
s2410INT->rINTSUBMSK |= INTSUB_RXD0;
s2410INT->rINTSUBMSK |= INTSUB_TXD0;
s2410INT->rINTSUBMSK |= INTSUB_ERR0;
break;
case SYSINTR_IR:
s2410INT->rINTMSK |= BIT_UART2;
s2410INT->rINTSUBMSK |= INTSUB_RXD2;
s2410INT->rINTSUBMSK |= INTSUB_TXD2;
s2410INT->rINTSUBMSK |= INTSUB_ERR2;
break;
case SYSINTR_AUDIO:
s2410INT->rINTMSK |= BIT_DMA1; // Audio input DMA.
s2410INT->rINTMSK |= BIT_DMA2; // Audio output DMA.
break;
case SYSINTR_ADC:
break;
case SYSINTR_PCMCIA_LEVEL:
s2410IOP->rEINTMASK |= 0x100;
s2410INT->rINTMSK |= BIT_EINT8_23;
//RETAILMSG(1,(TEXT("::: SYSINTR_PCMCIA_LEVEL OEMInterruptDisable\r\n")));
break;
case SYSINTR_PCMCIA_EDGE:
break;
case SYSINTR_PCMCIA_STATE:
s2410INT->rINTMSK |= BIT_EINT3;
//RETAILMSG(1,(TEXT("::: SYSINTR_PCMCIA_STATE OEMInterruptDisable\r\n")));
break;
case SYSINTR_ETHER:
s2410INT->rINTMSK |= BIT_EINT8_23;
s2410IOP->rEINTMASK |= 0x200;
break;
case SYSINTR_DM9000: // Ethernet on EINT14.
s2410INT->rINTMSK |= BIT_EINT8_23;
s2410IOP->rEINTMASK |= 0x4000;
// RETAILMSG(1,(TEXT("::: SYSINTR_DM9000 OEMInterruptDisable\r\n")));
break;
case SYSINTR_16550:
s2410INT->rINTMSK |= BIT_EINT8_23;
s2410IOP->rEINTMASK |= 0x2000;
break;
case SYSINTR_USB:
s2410INT->rINTMSK |= BIT_USBH;
break;
case SYSINTR_USBD:
s2410INT->rINTMSK |= BIT_USBD;
//RETAILMSG(1,(TEXT("::: SYSINTR_USBD OEMInterruptDisable\r\n")));
break;
case SYSINTR_POWER:
s2410INT->rINTMSK |= BIT_EINT0;
s2410INT->rINTMSK |= BIT_EINT2;
break;
default:
break;
}
INTERRUPTS_ON();
}
//------------------------------------------------------------------------------
//
// @func BOOL | OEMInterruptDone | Signal completion of interrupt processing
// @rdesc none
// @comm OEMInterruptDone is called by the Kernel when a device driver
// calls <f InterruptDone>. The system is not preemtible when this
// function is called.
// @xref <l Overview.Kernel Interrupt Support> <f InterruptDone>
//
//------------------------------------------------------------------------------
void
OEMInterruptDone(DWORD idInt) // @parm Interrupt ID. See <t Interrupt ID's>
// for the list of possible values.
{
volatile INTreg *s2410INT = (INTreg *)INT_BASE;
volatile IOPreg *s2410IOP = (IOPreg *)IOP_BASE;
INTERRUPTS_OFF();
switch (idInt)
{
case SYSINTR_DMA0:
s2410INT->rINTMSK &= ~BIT_DMA0; // SDIO DMA interrupt
//RETAILMSG(1,(TEXT("::: SYSINTR_DMA0 OEMInterruptDone\r\n")));
break;
case SYSINTR_SDMMC:
s2410INT->rINTMSK &= ~BIT_MMC;
//RETAILMSG(1,(TEXT("::: SYSINTR_SDMMC OEMInterruptDone\r\n")));
break;
case SYSINTR_SDMMC_SDIO_INTERRUPT:
s2410INT->rINTMSK &= ~BIT_MMC;
//RETAILMSG(1,(TEXT("::: SYSINTR_SDMMC_SDIO_INTERRUPT OEMInterruptDone\r\n")));
break;
case SYSINTR_SDMMC_CARD_DETECT:
s2410IOP->rEINTMASK &= ~(1 << 18);
s2410INT->rINTMSK &= ~BIT_EINT8_23;
//RETAILMSG(1,(TEXT("::: SYSINTR_SDMMC_CARD_DETECT OEMInterruptDone\r\n")));
break;
case SYSINTR_TOUCH:
/*
* Nothing has to be done here as interrupts are masked and unmasked by the touch
* handler in the HAL.
*/
s2410INT->rINTMSK &= ~BIT_TIMER1;
break;
case SYSINTR_TOUCH_CHANGED:
/*
* Nothing has to be done here as interrupts are masked and unmasked by the touch
* handler in the HAL.
*/
s2410INT->rINTMSK &= ~BIT_ADC;
s2410INT->rINTSUBMSK &= ~INTSUB_TC;
//RETAILMSG(0,(TEXT("OEMInterruptDone:TOUCH CHANGED\n\r\n")));
break;
case SYSINTR_KEYBOARD:
s2410INT->rINTMSK &= ~BIT_EINT1;
break;
case SYSINTR_SERIAL:
s2410INT->rINTMSK &= ~BIT_UART0;
s2410INT->rINTSUBMSK &= ~INTSUB_RXD0;
break;
case SYSINTR_IR:
s2410INT->rINTMSK &= ~BIT_UART2;
s2410INT->rINTSUBMSK &= ~INTSUB_RXD2;
break;
case SYSINTR_AUDIO:
// DMA1 is for audio input.
// DMA2 is for audio output.
s2410INT->rSRCPND = (BIT_DMA1 | BIT_DMA2);
if (s2410INT->rINTPND & BIT_DMA1) s2410INT->rINTPND = BIT_DMA1;
if (s2410INT->rINTPND & BIT_DMA2) s2410INT->rINTPND = BIT_DMA2;
s2410INT->rINTMSK &= ~BIT_DMA1;
s2410INT->rINTMSK &= ~BIT_DMA2;
break;
case SYSINTR_ADC:
break;
case SYSINTR_PCMCIA_LEVEL:
s2410INT->rSRCPND = BIT_EINT8_23;
if (s2410INT->rINTPND & BIT_EINT8_23) s2410INT->rINTPND = BIT_EINT8_23;
s2410INT->rINTMSK &= ~BIT_EINT8_23;
s2410IOP->rEINTMASK &= ~(1<<8);
//RETAILMSG(1,(TEXT("::: SYSINTR_PCMCIA_LEVEL OEMInterruptDone\r\n")));
break;
case SYSINTR_PCMCIA_EDGE:
//RETAILMSG(1,(TEXT("::: SYSINTR_PCMCIA_EDGE OEMInterruptDone\r\n")));
break;
case SYSINTR_PCMCIA_STATE:
s2410INT->rINTMSK &= ~BIT_EINT3;
//RETAILMSG(1,(TEXT("::: SYSINTR_PCMCIA_STATE OEMInterruptDone\r\n")));
break;
case SYSINTR_ETHER:
s2410INT->rINTMSK &= ~BIT_EINT8_23;
s2410IOP->rEINTMASK &= ~0x200;
break;
case SYSINTR_DM9000: // Ethernet on EINT14.
s2410INT->rINTMSK &= ~BIT_EINT8_23;
s2410IOP->rEINTMASK &= ~0x4000;
// RETAILMSG(1, (TEXT("::: SYSINTR_DM9000 OEMInterruptDone\r\n")));
break;
case SYSINTR_16550:
//s2410INT->rINTMSK &= ~BIT_EINT8_23;
//s2410IOP->rEINTMASK &= ~0x2000;
// s2410IOP->rGPGCON = (s2410IOP->rGPGCON & ~(0x3 << 10)) | (0x2 << 10); // GPG5 == EINT13.
//s2410IOP->rGPGUP = (s2410IOP->rGPGUP | (0x1 << 0x5)); // Disable pull-up.
//s2410IOP->rEXTINT1 = (s2410IOP->rEXTINT1 & ~(0xf << 20)) |(0x1<<20) ; // Level-high triggered.
// RETAILMSG(1,(TEXT("s2410IOP->rGPGCON=0x%x\r\n"),s2410IOP->rGPGCON));
// RETAILMSG(1,(TEXT("s2410IOP->rGPGUP=0x%x\r\n"),s2410IOP->rGPGUP));
// RETAILMSG(1,(TEXT("s2410IOP->rEXTINT1=0x%x\r\n"),s2410IOP->rEXTINT1));
s2410IOP->rEINTPEND = 0x2000;
s2410IOP->rEINTMASK &= ~0x2000;
s2410INT->rSRCPND = BIT_EINT8_23; // by shim
//S3C2410X Developer Notice (page 4) warns against writing a 1 to a 0 bit in the INTPND register.
if (s2410INT->rINTPND & BIT_EINT8_23) s2410INT->rINTPND = BIT_EINT8_23;
s2410INT->rINTMSK &= ~BIT_EINT8_23;
//RETAILMSG(1,(TEXT("s2410IOP->rGPGCON=0x%x\r\n"),s2410IOP->rGPGCON));
RETAILMSG(1,(TEXT("OEMInterruptDone-----\r\n")));
break;
case SYSINTR_USB:
s2410INT->rINTMSK &= ~BIT_USBH;
break;
case SYSINTR_USBD:
s2410INT->rINTMSK &= ~BIT_USBD;
//RETAILMSG(1,(TEXT("::: SYSINTR_USBD OEMInterruptDone\r\n")));
break;
case SYSINTR_POWER:
s2410INT->rSRCPND = BIT_EINT0;
// S3C2410X Developer Notice (page 4) warns against writing a 1 to a 0 bit in the INTPND register.
if (s2410INT->rINTPND & BIT_EINT0) s2410INT->rINTPND = BIT_EINT0;
s2410INT->rINTMSK &= ~BIT_EINT0;
s2410INT->rSRCPND = BIT_EINT2;
// S3C2410X Developer Notice (page 4) warns against writing a 1 to a 0 bit in the INTPND register.
if (s2410INT->rINTPND & BIT_EINT2) s2410INT->rINTPND = BIT_EINT2;
s2410INT->rINTMSK &= ~BIT_EINT2;
break;
}
INTERRUPTS_ON();
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
BOOL
OEMGetExtensionDRAM(
LPDWORD lpMemStart,
LPDWORD lpMemLen
)
{
return FALSE; // no extension DRAM
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -