|
armsys2410 大容量sd卡驱动开发 (再续)
[复制链接]
经过这一段时间的研究,我发现sd卡的中断与系统中断无法KernelIoControl成功。查找了bsp包,发现了3个与之有关的文件:
1)oalintr.h定义了系统的逻辑中断(SYSINTR_FIRMWARE=16)
#define SYSINTR_SDMMC_CARD_DETECT (SYSINTR_FIRMWARE+15) 用于发觉sd卡的中断,实际中断号18在armint.c中定义并将中断与逻辑中断关联
#define SYSINTR_SDMMC (SYSINTR_FIRMWARE+14) 实际中断号21在armint.c中定义并将中断与逻辑中断关联
#define SYSINTR_SDMMC_SDIO_INTERRUPT (SYSINTR_FIRMWARE+16) 实际中断号21在armint.c中定义并将中断与逻辑中断关联,但是这两个中断对应的系统中断不一样,这两个中断分别表示什么意思?
#define SYSINTR_DMA0 (SYSINTR_FIRMWARE+18) 实际中断号17在armint.c中定义并将中断与逻辑中断关联
函数
_inline
DWORD
MapIrq2SysIntr(DWORD _Irq)
{
if( _Irq<=20 )//sd的中断21,那岂不是要返回0xffffffff
return ( SYSINTR_FIRMWARE + _Irq );
else
return (0xffffffff);
}
2)armint.c中建立逻辑中断与实际中断的关联
int OEMInterruptHandler(unsigned int ra)
{
。。。。。省
IntPendVal = s2410INT->rINTOFFSET; // Get pending IRQ mode interrupt in INTPND.
。。。。。。省
if(IntPendVal == INTSRC_MMC) // SD, MMC,INTSRC_MMC=21
{
s2410INT->rINTMSK |= BIT_MMC;
s2410INT->rSRCPND = BIT_MMC;
if (s2410INT->rINTPND & BIT_MMC) s2410INT->rINTPND = BIT_MMC;
RETAILMSG(1, (TEXT("ARMINT.C-INT:INTSRC_MMC INT\r\n")));
if( s2410SDIO->rSDIDATSTA & (0x1<<9) ){
RETAILMSG(1, (TEXT("INT:SYSINTR_SDMMC_SDIO_INTERRUPT INT\r\n")));
return SYSINTR_SDMMC_SDIO_INTERRUPT;
}
else {
RETAILMSG(1, (TEXT("INT:SYSINTR_SDMMC INT\r\n")));
return SYSINTR_SDMMC;
}
}
else if(IntPendVal == INTSRC_DMA0) // SD DMA interrupt,INTSRC_DMA0=17
{
s2410INT->rINTMSK |= BIT_DMA0;
s2410INT->rSRCPND = BIT_DMA0;
if (s2410INT->rINTPND & BIT_DMA0) s2410INT->rINTPND = BIT_DMA0;
return SYSINTR_DMA0;
}
if (IntPendVal == INTSRC_EINT8_23) // EINT8 ~ 23,INTSRC_EINT8_23=5;
{
s2410INT->rINTMSK |= BIT_EINT8_23;
submask = s2410IOP->rEINTPEND;
if ( submask & (1 << 18)) // EINT28 : SDMMC_CARD_DETECT,利用中断18来发现sd卡是否插入
{
s2410IOP->rEINTMASK |= (1 << 18);
s2410IOP->rEINTPEND = (1 << 18);
s2410INT->rSRCPND = BIT_EINT8_23;
if (s2410INT->rINTPND & BIT_EINT8_23) s2410INT->rINTPND = BIT_EINT8_23;
RETAILMSG(1, (TEXT("ARMINT.C - SYSINTR_SDMMC_CARD_DETECT\r\n")));
return SYSINTR_SDMMC_CARD_DETECT;
}
}
由于这里有了3个sd的逻辑中断,因此,在驱动中(m_dwSDIOIrq=21)
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &m_dwSDIOIrq, sizeof(DWORD), &m_dwSDIOSysIntr, sizeof(DWORD), NULL))
{
// invalid SDIO SYSINTR value!
DEBUGMSG(SDCARD_ZONE_ERROR, (TEXT("invalid SDIO SYSINTR value!\n")));//总是失败为什么呢?
m_dwSDIOSysIntr = SYSINTR_UNDEFINED;
fRetVal = FALSE;
goto FUNCTION_EXIT;
}[/size
这里KernelIoControl是不是动态建立逻辑中断与实际中断的联系,而bsp包中上两个文件已经建立好了联系,这里就不用调用KernelIoControl,我试了一下令
m_dwSDIOIrq=21;m_dwSDIOSysIntr=SYSINTR_SDMMC_SDIO_INTERRUPT;结果调试信息显示在进入下面函数时出现了异常。
if( !CustomSetup( pszRegistryPath ) )//
{
fRetVal = FALSE;
goto FUNCTION_EXIT;
}
进入CustomSetup函数,调试信息显示如下:
Data Abort: Thread=8ff9fbf8 Proc=8e026280 'device.exe'
AKY=00000005 PC=8c259a54(NK.EXE+0x00059a54) RA=8c2522e0(NK.EXE+0x000522e0) BVA=06000044 FSR=00000007
RaiseException: Thread=8ff9fbf8 Proc=8e026280 'device.exe'
AKY=00000005 PC=03f8e048(coredll.dll+0x0001e048) RA=8c22ab10(NK.EXE+0x0002ab10) BVA=00000001 FSR=00000001
请高手帮我分析一下吧!!!!!!万分感谢!!!!
|
|