刚才我在devece.exe下只看见了sdbus.dll
我用原开发包做映像文件的时候devece.exe下有sdbusdriver.dll sdcsdcard.dll,插上2Gsd卡,devece.exe下又出现sdmemory.dll。说明我目前开发的sdhc_sc2410.dll并没有加载入devece.exe。因此连低容量的sd卡也驱动不起来。
gsymichael之前又让我检查中断,我在2410的bsp包里找到了有关2410对sd中断使能的配置
对比了没有修改的映像文件的调试信息与我现在开发的sdhc时生成的调试信息,有些与中断有关的调试信息没有出现
BOOL
OEMInterruptEnable(DWORD idInt, // @parm Interrupt ID to be enabled. See for a list of possble values.
LPVOID pvData, // @parm ptr to data passed in in the call
DWORD cbData) // @parm Size of data pointed to be
{
volatile INTreg *s2410INT = (INTreg *)INT_BASE;
volatile IOPreg *s2410IOP = (IOPreg *)IOP_BASE;
volatile MMCreg *s2410SDIO = (MMCreg *)MMC_BACE;
BOOL bRet = TRUE;
INTERRUPTS_OFF();
switch (idInt)
{
case SYSINTR_DMA0:
s2410INT->rINTMSK &= ~BIT_DMA0; // SDIO DMA interrupt
RETAILMSG(1,(TEXT("::: SYSINTR_DMA0 OEMInterruptDisable\r\n")));
break;
case SYSINTR_SDMMC: //SYSINTR_SDMMC=16+14 14为中断号
s2410INT->rINTMSK &= ~BIT_MMC;
RETAILMSG(1,(TEXT("::: SYSINTR_SDMMC OEMInterruptDisable\r\n")));//此调试信息没有出现
break;
case SYSINTR_SDMMC_SDIO_INTERRUPT: //SYSINTR_SDMMC_SDIO_INTERRUPT=16+15 15为中断号
s2410INT->rINTMSK &= ~BIT_MMC;
RETAILMSG(1,(TEXT("::: SYSINTR_SDMMC_SDIO_INTERRUPT OEMInterruptEnable\r\n")));//此调试信息没有出现
break;
case SYSINTR_SDMMC_CARD_DETECT://SYSINTR_SDMMC_CARD_DETECT=16+16 16为中断号
s2410IOP->rEINTPEND = (1 << 18);
s2410IOP->rEINTMASK &= ~(1 << 18);
s2410INT->rSRCPND = BIT_EINT8_23;
if (s2410INT->rINTPND & BIT_EINT8_23) s2410INT->rINTPND = BIT_EINT8_23;
s2410INT->rINTMSK &= ~BIT_EINT8_23;
RETAILMSG(1,(TEXT("::: SYSINTR_SDMMC_CARD_DETECT OEMInterruptEnable\r\n")));//此调试信息没有出现 break;
}
}
void
OEMInterruptDone(DWORD idInt) // @parm Interrupt ID. See
// 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;
}
}
static void InitSDMMC(void) //用于初始化,此部分在调试信息显示正常。
{
volatile IOPreg *s2410IOP = (IOPreg *)IOP_BASE;
/* Initialize SDMMC and Configure SDMMC Card Detect */
/* ::::::::::::::::::::::::::::::::::: GPIO Configure ::::::::::::::::::::::::::::::::::::: */
RETAILMSG(1,(TEXT("SDMMC config current rGPGCON: %x\r\n"), s2410IOP->rGPGCON));
/* We must need this PULL-UP routines to inialize. */
//s2410IOP->rGPGUP = 0xF800;
s2410IOP->rGPGUP &= ~(1<<10);
s2410IOP->rGPGCON &= ~((0x3 << 20));
s2410IOP->rGPGCON |= ((0x2 << 20)); /* External Interrupt #18 Enable */
RETAILMSG(1,(TEXT("SDMMC config set rGPGCON: %x\r\n"), s2410IOP->rGPGCON));
s2410IOP->rGPGCON = (s2410IOP->rGPGCON & ~(0x3 << 10)) | (0x2 << 10);
s2410IOP->rEXTINT2 &= ~(0x7 << 8); /* Configure EINT18 as Both Edge Mode */
s2410IOP->rEXTINT2 |= (0x7 << 8);
/* Configure SDMMC Write Protect */
s2410IOP->rGPHUP = 0x0;
s2410IOP->rGPHCON &= ~((0x3 << 16));
s2410IOP->rGPHCON |= ((0x0 << 16)); /* GPH8/UCLK Write Protect Pin */
RETAILMSG(1,(TEXT("SDMMC config Init Done.\r\n")));
}
由此可见我的sdhc_sc2410.dll的中断的确有问题,但是程序是微软提供的
void CSDIOControllerBase::Enable_SDIO_Interrupts()
{
vm_pSDIReg->SDICON |= SDIO_INTERRUPT_ENABLE; //#define SDIO_INTERRUPT_ENABLE 0x00000008
vm_pSDIReg->SDIIMSK |= SDIO_HOST_IO_INT; //#define SDIO_HOST_IO_INT 0x00001000
}
看来都是用寄存器操作的。
gsymichael能否给我一点提示,在哪察看中断的设置,本人从前是做应用的,由于需要16G sd卡存数据,迫不得已做起了驱动,第一次开发,请多多指教!!