armsys2410 大容量sd卡驱动开发 (续)

CBEMA 2008-09-16 04:08:11
没错我按照您的方法修改了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到注册表?
...全文
1010 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
CBEMA 2008-09-19
  • 打赏
  • 举报
回复
谢谢,我调调看
gsymichael 2008-09-18
  • 打赏
  • 举报
回复
SDbus的Prefix是SDC,你可以看SDClient.cpp函数,里面是SDbus的接口函数。
SD Host驱动是使用的SDH,代码应该在Sdhcmain.cpp函数。

还有你提到的SDIOirq应该是使用SDIO卡的使用用到的中断,这部分我也不太清楚。
但是你用存储卡的时候应该关心Detect Irq才对。不知道你是怎么实现卡的插入和
移除的检测的,应该是用一个外部中断来做的吧。首先要看看驱动对于插拔卡是不是
有相应的中断产生吧。
xumercury 2008-09-18
  • 打赏
  • 举报
回复
mark下..以后可能会用到
CBEMA 2008-09-18
  • 打赏
  • 举报
回复
另外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这三个中断的关系了。

CBEMA 2008-09-18
  • 打赏
  • 举报
回复
sdbus.dll的prefix为sdc对还是sdh对。
我更新完微软的有关sd的更新是不是sdbus.dll的prefix是sdh。因为SDHC_SC2410.dll的prefix是sdh,它们是不是应该配套。
实际上更新完后sdbus.dll的prefix还是sdc,这个到底有没有错?
gsymichael 2008-09-18
  • 打赏
  • 举报
回复
系统起来以后sdhc_sc2410.dll和Sdbus.dll都应该有,只有在插入卡后才会有SDmemory.dll。
你现在什么卡都不能用只能一点一点调,看看问题出在那里。这部分工作只能你自己做,别人帮不了你。
从你贴出的信息看,Card Detect是使用的GPG10,也就是EINT18。首先要确认你的卡在插入后代码
能不能跑到CardDetect Thread。如果能走到,说明在这之前就出了问题,你首先看看你的那两个Dll都
加载上了没有,中断是不是关联上了。
还有你的驱动关于SDbus和SDmemory都是微软的不用改,那你底层的Host驱动是用的什么?这个微软也提供了
吗?你应该主要关注底层的这部分代码。
CBEMA 2008-09-18
  • 打赏
  • 举报
回复
刚才我在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 <l Interrupt ID's.Interrupt ID's> for a list of possble values.
LPVOID pvData, // @parm ptr to data passed in in the <f InterruptInitialize> call
DWORD cbData) // @parm Size of data pointed to be <p pvData>
{
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 <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;
}
}



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卡存数据,迫不得已做起了驱动,第一次开发,请多多指教!!
CBEMA 2008-09-17
  • 打赏
  • 举报
回复
不像是注册表设置的问题了.DLL文件中有没有把导出的函数定义好?

用的是微软的源代码。但是改动了一些。
beyondma 2008-09-17
  • 打赏
  • 举报
回复
不像是注册表设置的问题了.DLL文件中有没有把导出的函数定义好?
songtitan 2008-09-16
  • 打赏
  • 举报
回复
[Quote=引用楼主 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…
[/Quote]
bib和reg添加没有问题,注意如果是在files目录下修改的话需要手动复制到%_FLATRELEASEDIR%目录下再makeimg。

另外,支持大容量的SDHC卡,只需要更新SDbus到最新版本即可。如果你一直有安装微软最新的QFE的话,sdbus.dll已经可以支持SDHC.
gsymichael 2008-09-16
  • 打赏
  • 举报
回复
你生成的Dll是sdhc_sc2410.dll那么在注册表里“DLL”就要用sdhc_sc2410.dll。
注册表的内容可以放到Platform.reg中。
SDHC_SC2410.DLL $(_FLATRELEASEDIR)\SDHC_SC2410.dll NK SH 的添加也没有问题。
CBEMA 2008-09-16
  • 打赏
  • 举报
回复
直接加载的CataLog里的sd memory以及samsung 2410 sdio host.
CBEMA 2008-09-16
  • 打赏
  • 举报
回复
系统不能识别任何sd卡,包括非sdhc的。
是注册表有问题吗?
在系统注册表里有
SDHC_SC2410.dll(主控制端) sdmemory.dll(客户端) sdbus.dll(总线),是否他们并不配套。

19,523

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧