6415|13

61

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

armsys2410 大容量sd卡驱动开发 (续) [复制链接]

没错我按照您的方法修改了C:\WINCE500\PUBLIC\COMMON\OAK\CSP\ARM\SAMSUNG\S3C2410X\SDHC\SDHCBASE 中的函数。
但是C:\WINCE500\PUBLIC\COMMON\OAK\CSP\ARM\SAMSUNG\S3C2410X\SDHC\SDHC中有一个注册表内容是:

[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SDHC_SMDK2410]
    "Order"=dword:21
    "Dll"="sdhc_smdk2410.dll"  ‘实际生成的是sdhc_sc2410.dll,这里是不是要手动修改成sdhc_sc2410.dll’
    "Prefix"="SDH"
   
    "DMAChannel"=dword:0            ; DMA channel to use.  Set to 0xffffffff to disable DMA
    "DMAIrq"=dword:11
    "DMA_IST_Priority"=dword:96

    "SDIOIrq"=dword:15
    "SDIO_IST_Priority"=dword:97
   
    "PollingTimeout"=dword:100      ; 100 ms
    "CardDetect_Thread_Priority"=dword:98
   
    "CardDetectGPIO"="G"            ; card detect on GPG10
    "CardDetectMask"=dword:400
    "CardDetectFlag"=dword:0
    "CardDetectControlMask"=dword:fffcffff
    "CardDetectControlFlag"=dword:0
    "CardDetectPullupMask"=dword:ffffffef
    "CardDetectPullupFlag"=dword:10
   
    "CardReadWriteGPIO"="H"         ; card R/W on GPH8
    "CardReadWriteMask"=dword:100
    "CardReadWriteFlag"=dword:100
    "CardReadWriteControlMask"=dword:ffcfffff
    "CardReadWriteControlFlag"=dword:0
    "CardReadWritePullupMask"=dword:ffffffbf
    "CardReadWritePullupFlag"=dword:40

    "HandleBusyFinishOnCommand38"=dword:1
    "DmaTransferTimeoutFactor"=dword:8
    "DmaTransferTimeoutConstant"=dword:3000

由于这个驱动通过Catalog无法直接加载,所以我在platform.bib文件中的MODULES段加入了
SDHC_SC2410.DLL    $(_FLATRELEASEDIR)\SDHC_SC2410.dll     NK    SH
然后手动将上面那个注册表的内容添加到platform.reg里。这样做可不可以?还是注册表是自动加进去的,可是我通过观察
wince注册表,运行的系统并没有直接加入SDHC_SC2410.dll到注册表?
此帖出自ARM技术论坛

最新回复

谢谢,我调调看  详情 回复 发表于 2008-9-19 08:15
点赞 关注
 

回复
举报

85

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
系统不能识别任何sd卡,包括非sdhc的。
是注册表有问题吗?
在系统注册表里有
SDHC_SC2410.dll(主控制端)    sdmemory.dll(客户端) sdbus.dll(总线),是否他们并不配套。
此帖出自ARM技术论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
直接加载的CataLog里的sd memory以及samsung 2410 sdio host.
此帖出自ARM技术论坛
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

4
 
你生成的Dll是sdhc_sc2410.dll那么在注册表里“DLL”就要用sdhc_sc2410.dll。
注册表的内容可以放到Platform.reg中。
SDHC_SC2410.DLL    $(_FLATRELEASEDIR)\SDHC_SC2410.dll    NK    SH 的添加也没有问题。
此帖出自ARM技术论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用楼主 CBEMA 的帖子:
没错我按照您的方法修改了C:\WINCE500\PUBLIC\COMMON\OAK\CSP\ARM\SAMSUNG\S3C2410X\SDHC\SDHCBASE 中的函数。
但是C:\WINCE500\PUBLIC\COMMON\OAK\CSP\ARM\SAMSUNG\S3C2410X\SDHC\SDHC中有一个注册表内容是:

[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SDHC_SMDK2410]
    "Order"=dword:21
    "Dll"="sdhc_smdk2410.dll"  ‘实际生成的是sdhc_sc2410.dll,这里是不是要手动修改成sdhc_sc2410.dll’
    "Prefix"="SDH…

bib和reg添加没有问题,注意如果是在files目录下修改的话需要手动复制到%_FLATRELEASEDIR%目录下再makeimg。

另外,支持大容量的SDHC卡,只需要更新SDbus到最新版本即可。如果你一直有安装微软最新的QFE的话,sdbus.dll已经可以支持SDHC.
此帖出自ARM技术论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

6
 
不像是注册表设置的问题了.DLL文件中有没有把导出的函数定义好?
此帖出自ARM技术论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

7
 
不像是注册表设置的问题了.DLL文件中有没有把导出的函数定义好?

用的是微软的源代码。但是改动了一些。
此帖出自ARM技术论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

8
 
sdbus.dll的prefix为sdc对还是sdh对。
我更新完微软的有关sd的更新是不是sdbus.dll的prefix是sdh。因为SDHC_SC2410.dll的prefix是sdh,它们是不是应该配套。
实际上更新完后sdbus.dll的prefix还是sdc,这个到底有没有错?
此帖出自ARM技术论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

9
 
另外sdhc_sd2410.reg注册表中提到
"SDIOIrq"=dword:15
我在查bsp包里硬件初始化的源代码时发现
                         irq
sdmmc                 14
sdmmc-card-detect     15
sdmmc-sdio            16  (这里是16,而上面是15,是不是有问题。这三个中断与上面那个有什么关系)。


我用开发板原来提供的sd驱动做了一个映像文件,插入4G在串口调试信息显示
::: SYSINTR_SDMMC_CARD_DETECT    OEMInterruptDone
而SYSINTR_SDMMC_CARD_DETECT    与中断号15时对应的。
那么注册表中的
"SDIOIrq"=dword:15 是不是应该改为16呢?对应的主控制端程序中 中断号是不是也要改。

我现在搞不清楚 14 15 16这三个中断的关系了。

此帖出自ARM技术论坛
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

10
 
mark下..以后可能会用到
此帖出自ARM技术论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

11
 
SDbus的Prefix是SDC,你可以看SDClient.cpp函数,里面是SDbus的接口函数。
SD Host驱动是使用的SDH,代码应该在Sdhcmain.cpp函数。

还有你提到的SDIOirq应该是使用SDIO卡的使用用到的中断,这部分我也不太清楚。
但是你用存储卡的时候应该关心Detect Irq才对。不知道你是怎么实现卡的插入和
移除的检测的,应该是用一个外部中断来做的吧。首先要看看驱动对于插拔卡是不是
有相应的中断产生吧。
此帖出自ARM技术论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

12
 
刚才我在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卡存数据,迫不得已做起了驱动,第一次开发,请多多指教!!

此帖出自ARM技术论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

13
 
系统起来以后sdhc_sc2410.dll和Sdbus.dll都应该有,只有在插入卡后才会有SDmemory.dll。
你现在什么卡都不能用只能一点一点调,看看问题出在那里。这部分工作只能你自己做,别人帮不了你。
从你贴出的信息看,Card Detect是使用的GPG10,也就是EINT18。首先要确认你的卡在插入后代码
能不能跑到CardDetect Thread。如果能走到,说明在这之前就出了问题,你首先看看你的那两个Dll都
加载上了没有,中断是不是关联上了。
还有你的驱动关于SDbus和SDmemory都是微软的不用改,那你底层的Host驱动是用的什么?这个微软也提供了
吗?你应该主要关注底层的这部分代码。
此帖出自ARM技术论坛
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

14
 
谢谢,我调调看
此帖出自ARM技术论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表