6410|17

88

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

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
请高手帮我分析一下吧!!!!!!万分感谢!!!!
此帖出自ARM技术论坛

最新回复

汗,去年的十月份,我居然问出这么雷人的问题。汗 感觉进步挺大哦。  详情 回复 发表于 2009-5-6 09:58
点赞 关注
 

回复
举报

64

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
楼主,你自己开发SD卡驱动,?微软不是有了吗?自己弄很吃力啊。对了,三星新出的5.0BSP下面有SD卡驱动,但是不知道能不能用大容量SD卡
此帖出自ARM技术论坛
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
使用微软的,可是中断有问题。我得修改中断,可是就如上面的问题一样困难重重。
此帖出自ARM技术论坛
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

4
 
我的也不行,但是这个东西在别人那里却行。唉,现在更加郁闷的是使用DNW下载NK到内存胡导致异常,自动重启电脑五次刚才。
此帖出自ARM技术论坛
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

5
 
呵呵,我也有遇到过,不过慢慢来,其实我是第一次做驱动,会遇到很多问题。
此帖出自ARM技术论坛
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

6
 
这是我刚刚在一片博客上看到的
一个外部中断,必须首先在驱动IST中调用KernelIOControl(IOCTL_HAL_REQUEST_SYSINTR) 将IRQ和SysIntr关联起来。不过很多时候是静态关联的(调用OALStaticTranslate)。我的驱动是不是应该使用静态关联呢
此帖出自ARM技术论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

7
 
用这个函数静态的设置中断,OALIntrStaticTranslate(SYSINTR_SDMMC, IRQ_XXX);
IRQ_XXX设为你的21号中断,也就是你插拔卡的检测中断。
这个函数可以放在BSP下的src/kernel/oal/intr.c中。
此帖出自ARM技术论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

8
 
gsymichael :
终于把您等来了,这段时间刚刚倒出点功夫,又开始研究这个了。
是把它放到OEMInterruptHandler函数中吗?
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")));
//放这里1,还是
return SYSINTR_SDMMC_SDIO_INTERRUPT;
}
else {
RETAILMSG(1, (TEXT("INT:SYSINTR_SDMMC INT\r\n")));
//放这里2,还是
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;
//放这里3
RETAILMSG(1, (TEXT("ARMINT.C - SYSINTR_SDMMC_CARD_DETECT\r\n")));
return SYSINTR_SDMMC_CARD_DETECT;
}
}

按您的提示,我查看里bsp保有有关的sd的中断,竟然有3个,就是问题中的那三个,我有点糊度
此帖出自ARM技术论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

9
 
我这里那个函数是放在BSP下的src/kernel/oal/intr.c的。
在我这里的OEMInterruptHandler最后有这样的代码:
sysIntr = NKCallIntChain((UCHAR)irq);
        if (sysIntr == SYSINTR_CHAIN || !NKIsSysIntrValid(sysIntr)) {
            // IRQ wasn't claimed, use static mapping
            sysIntr = OALIntrTranslateIrq(irq);
        }
通过调用OALIntrTranslateIrq(irq);来静态关联中断。

还有你说的3个中断的问题,一个是用来检测SD插拔的中断;一个是SDIO中断,应该是在使用SDIO卡时用到;
还有DMA当然就是在卡传输数据时用到DMA才会用。
此帖出自ARM技术论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

10
 
如果是ce4.2 就不要用kernelIOControl了
此帖出自ARM技术论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

11
 
ce5.0 我在打算按gsymichael 说的修改bsp包以及驱动,希望有效果。
我的OEMInterruptHandler函数没有调用OALIntrTranslateIrq(irq);而主控制驱动调用KernelIOControl老是失败,我查看相关文章,可能是我的板子不支持KernelIOControl这个函数?
此帖出自ARM技术论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

12
 

1.问题会不会bsp的代码相关,如果代码不一样的话,很难解决你的问题。
你的的bsp是直接在PB里面自带的?
还是从第三方那里得到的。如果是第三方修改过的bsp代码,很有可能是第三方在修改BSP代码的时候存在错误。

2.
在\SMDK2410\INC中的oalintr.h中有定义了系统的逻辑中断

// These are the 'standard' interrupts

#define SYSINTR_KEYBOARD          (SYSINTR_FIRMWARE+0)

#define SYSINTR_TOUCH              (SYSINTR_FIRMWARE+1)

#define SYSINTR_ADC                 (SYSINTR_FIRMWARE+2)

#define SYSINTR_SERIAL               (SYSINTR_FIRMWARE+3)

#define SYSINTR_AUDIO               (SYSINTR_FIRMWARE+4)

#define SYSINTR_PCMCIA_STATE    (SYSINTR_FIRMWARE+5)

#define SYSINTR_PCMCIA_EDGE     (SYSINTR_FIRMWARE+6)

#define SYSINTR_PCMCIA_LEVEL    (SYSINTR_FIRMWARE+7)

#define SYSINTR_TOUCH_CHANGED   (SYSINTR_FIRMWARE+8)

#define SYSINTR_IR            (SYSINTR_FIRMWARE+9)

#define SYSINTR_ETHER               (SYSINTR_FIRMWARE+10)


#define SYSINTR_USB                  (SYSINTR_FIRMWARE+11)


#define SYSINTR_USBD                (SYSINTR_FIRMWARE+12)

#define SYSINTR_POWER             (SYSINTR_FIRMWARE+13)



#define    SYSINTR_SDMMC                                    (SYSINTR_FIRMWARE+14)

#define SYSINTR_SDMMC_CARD_DETECT       (SYSINTR_FIRMWARE+15)

#define SYSINTR_SDMMC_SDIO_INTERRUPT (SYSINTR_FIRMWARE+16)


#define SYSINTR_BUTTON               (SYSINTR_FIRMWARE+17)

#define    SYSINTR_DMA0                                (SYSINTR_FIRMWARE+18)


#define SYSINTR_SERIAL1              (SYSINTR_FIRMWARE+19)

#define SYSINTR_SERIAL2              (SYSINTR_FIRMWARE+9)

3.
OEMInterruptHandler()函数充当了ISR的角色,它主要是把物理中断号翻译为逻辑中断号,
具体看呢 你的开发板所带的\SMDK2410\KERNEL\HAL\ARM\armint.c
此帖出自ARM技术论坛
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

13
 
引用 9 楼 Reallyu 的回复:
如果是ce4.2 就不要用kernelIOControl了


如果wince5.0+从wince4.2升级二来的BSP呢?会怎么样?
此帖出自ARM技术论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

14
 
to 12楼,
据说自己找些从4.2移植过来的号称支持ce 5.0的smdk2410 bsp,代码质量很差,可能是第三方在修改BSP代码的时候存在错误。
此帖出自ARM技术论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

15
 
回答11,13楼:
  由于我用的是购买的开发板,所以不清楚bsp是否是从4.2升级的,bsp已肯定被修改过。

本人正在bsp中加入静态中断关联,之前bsp包的确没有做中断关联,估计是在它给的sd主控制端驱动的dll文件里做了。而这个文件又是我要从新修改的,所以我打算把微软给的这个SDIOControllerBase.cpp文件中的KernelIOControl去掉,在bsp中加入静态OALIntrTranslateIrq。
此帖出自ARM技术论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

16
 
引用 14 楼 CBEMA 的回复:
回答11,13楼:
  由于我用的是购买的开发板,所以不清楚bsp是否是从4.2升级的,bsp已肯定被修改过。

本人正在bsp中加入静态中断关联,之前bsp包的确没有做中断关联,估计是在它给的sd主控制端驱动的dll文件里做了。而这个文件又是我要从新修改的,所以我打算把微软给的这个SDIOControllerBase.cpp文件中的KernelIOControl去掉,在bsp中加入静态OALIntrTranslateIrq。


你看多几个BSP就知道怎么回事,是原版还是升级了。
此帖出自ARM技术论坛
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

17
 
gsymichael :
非常感谢,我把动态变静态,中断通过了。devece.exe中已经看见主控制端和客户端。但是sd卡还是无法显示出来,明天还要看调试信息,继续研究。
今天很振奋,谢谢。结贴!!!!!!!!!!!!!
此帖出自ARM技术论坛
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

18
 
引用 12 楼 gooogleman 的回复:
引用 9 楼 Reallyu 的回复:
如果是ce4.2 就不要用kernelIOControl了


如果wince5.0+从wince4.2升级二来的BSP呢?会怎么样?


汗,去年的十月份,我居然问出这么雷人的问题。汗

感觉进步挺大哦。
此帖出自ARM技术论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表