harktrip
驱动小牛
驱动小牛
  • 注册日期2003-11-30
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分51分
  • 威望457点
  • 贡献值0点
  • 好评度170点
  • 原创分0分
  • 专家分2分
阅读:3780回复:22

还是SDMMC驱动的问题,看源码就已经设定了512MB阿!

楼主#
更多 发布于:2007-10-25 16:36
如提,程序中就被设定为512M了,如果插入256或128的卡,都识别为512
程序:

if(mmc_read_sector(secbuf,0))
{
bootsector=(BOOTSECTOR50*)secbuf;
bpb=(BPB50*)(bootsector->bsBPB);

pDiskInfo->di_bytes_per_sect=MMC_SECTOR_SIZE; //Start with 512,then go with SetInfo changes
pDiskInfo->di_cylinders=1;
pDiskInfo->di_heads=1;
pDiskInfo->di_sectors=32;
pDiskInfo->di_total_sectors=0x100000;//最大512MB
pDiskInfo->di_flags=DISK_INFO_FLAG_MBR;

return TRUE;
}

这是2410的程序...现在不管这些,我要让程序自动去判别卡的大小,要如何做呢?
另外,
在WINCE下可擦写档案,但拿到PC却无法判读,这有可能是哪边出的问题?

各位老大,高抬贵手...
2440/wince4.2 的SDMMC,已经搞了一个多月都还没搞定,大家帮帮忙啰
werna
驱动牛犊
驱动牛犊
  • 注册日期2007-10-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望105点
  • 贡献值0点
  • 好评度50点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-10-26 09:36
什么啊,SD卡cap的识别要到CSD里去读啊,这个在SDbus里做的,2440我不知道
zhuxiaofeng
驱动小牛
驱动小牛
  • 注册日期2007-04-06
  • 最后登录2010-04-15
  • 粉丝0
  • 关注0
  • 积分1013分
  • 威望243点
  • 贡献值0点
  • 好评度202点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-10-26 12:39
这是2410的程序?貌似你拿的不对吧。
这个大小是要计算的。看SD的Spec里面有计算的办法。
也是楼上说的在CSD寄存器里面(又CMD9获得)。

在WINCE下可擦写档案,但拿到PC却无法判读,这有可能是哪边出的问题?

至于这个问题,
拿到PC上之后还能识别嘛??如果不能识别有可能你写的地址不对(把MBR写坏了)
如果可以识别,但是里面东西不对,要查两个方面:
一是:上面传下来的Scatter_gather buffer处理。在IOCTL部分。
二是:自己的读写。(如果是DMA的话,数据拷贝要分清楚,读的时候先拷贝到DMA BUFFER) 写的时候,后拷贝)
做一个出色的程序员!
zhuxiaofeng
驱动小牛
驱动小牛
  • 注册日期2007-04-06
  • 最后登录2010-04-15
  • 粉丝0
  • 关注0
  • 积分1013分
  • 威望243点
  • 贡献值0点
  • 好评度202点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-10-26 12:56
2410中关于大小处理的部分如下(估计和用的是一样的架构):
红色部分就是根据CSD寄存起来计算卡的大小的:
BOOL mmc_send_csd(DISK_INFO *pDiskInfo)
{
    //获取分区表信息

    U8 buf[16];
    U32 m_Size;
    t_MMC_CSD m_CSD;

    memset((U8*)&m_CSD,0,sizeof(t_MMC_CSD));
    Card_sel_desel(0);    // Card deselect
        if(!CMD9())
        RETAILMSG(1,(TEXT("\nmmc_send_csd::cmd9 error\n")));

    buf[0] = ((v_pSDMMCregs->rSDIRSP0)>>24)&0xff;
    buf[1] = ((v_pSDMMCregs->rSDIRSP0)>>16)&0xff;
    buf[2] = ((v_pSDMMCregs->rSDIRSP0)>>8)&0xff;
    buf[3] = (v_pSDMMCregs->rSDIRSP0)&0xff;
    
    buf[4] = ((v_pSDMMCregs->rSDIRSP1)>>24)&0xff;
    buf[5] = ((v_pSDMMCregs->rSDIRSP1)>>16)&0xff;
    buf[6] = ((v_pSDMMCregs->rSDIRSP1)>>8)&0xff;
    buf[7] = (v_pSDMMCregs->rSDIRSP1)&0xff;
    
    buf[8] = ((v_pSDMMCregs->rSDIRSP2)>>24)&0xff;
    buf[9] = ((v_pSDMMCregs->rSDIRSP2)>>16)&0xff;
    buf[10] = ((v_pSDMMCregs->rSDIRSP2)>>8)&0xff;
    buf[11] = (v_pSDMMCregs->rSDIRSP2)&0xff;
    
    buf[12] = ((v_pSDMMCregs->rSDIRSP3)>>24)&0xff;
    buf[13] = ((v_pSDMMCregs->rSDIRSP3)>>16)&0xff;
    buf[14] = ((v_pSDMMCregs->rSDIRSP3)>>8)&0xff;
    buf[15] = (v_pSDMMCregs->rSDIRSP3)&0xff;

    Card_sel_desel(1);    // Card deselect
    
    //分析CSD
    mmc_parse_csd((U8 *)buf,&m_CSD);
    pDiskInfo->di_bytes_per_sect=MMC_SECTOR_SIZE;    //Start with 512,then go with SetInfo changes
    pDiskInfo->di_cylinders=1;
    pDiskInfo->di_heads=1;
    pDiskInfo->di_sectors=32;

   m_Size=(m_CSD.b12CSize+1)*(pow(2,m_CSD.b3CSizeMult)*4)*4*(pow(2,m_CSD.b4ReadBLLen-9));

    pDiskInfo->di_total_sectors=m_Size;
    pDiskInfo->di_flags=DISK_INFO_FLAG_MBR;
    
    return TRUE;
}

void mmc_parse_csd(U8 *buf,t_MMC_CSD* pCSD)
{
    RETAILMSG(1,(TEXT("csd :%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x .\r\n"),
        buf[0],buf[1],buf[2],buf[3],buf[4],buf[5],buf[6],buf[7],
        buf[8],buf[9],buf[10],buf[11],buf[12],buf[13],buf[14],buf[15]));

    pCSD->b2CSDStructure=(buf[0]&0xc0)>>6;
    pCSD->b4SpecVers=(buf[0]&0x3c)>>2;
    pCSD->b2Reserved1=buf[0]&0x03;

    pCSD->byTAAC=buf[1];
    pCSD->byNSAC=buf[2];
    pCSD->byTranSpeed=buf[3];
    
    pCSD->b12CCC=buf[4];
    pCSD->b12CCC<<=4;
    pCSD->b12CCC|=((buf[5]&0xf0)>>4);

    pCSD->b4ReadBLLen=(buf[5]&0x0f);
    
    pCSD->b1ReadBLPartial=((buf[6]&0x80)>>7);
    pCSD->b1WriteBlkMisalign=((buf[6]&0x40)>>6);
    pCSD->b1ReadBlkMisalign=((buf[6]&0x20)>>5);
    pCSD->b1DSRImp=((buf[6]&0x10)>>4);

    pCSD->b2Reserved2=((buf[6]&0x0c)>>2);
    
    pCSD->b12CSize=(buf[6]&0x03);
    pCSD->b12CSize<<=8;
    pCSD->b12CSize|=buf[7];
    pCSD->b12CSize<<=2;
    pCSD->b12CSize|=((buf[8]&0xc0)>>6);

    pCSD->b3VDDRCurrMin=((buf[8]&0x38)>>3);
    pCSD->b3VDDRCurrMax=(buf[8]&0x07);

    pCSD->b3VDDWCurrMin=((buf[9]&0xe0)>>5);
    pCSD->b3VDDWCurrMax=((buf[9]&0x1c)>>2);
    
    pCSD->b3CSizeMult=(buf[9]&0x03);
    pCSD->b3CSizeMult<<=2;
    pCSD->b3CSizeMult|=((buf[10]&0x80)>>7);

    pCSD->b5EraseGrpSize=((buf[10]&0x7c)>>2);
    pCSD->b5EraseGrpMult=(buf[10]&0x03);
    pCSD->b5EraseGrpMult<<=3;
    pCSD->b5EraseGrpMult|=((buf[11]&0xe0)>>5);
    pCSD->b5WPGrpSize=(buf[11]&0x1f);
    
    pCSD->b1WPGrpEnable=((buf[12]&0x80)>>7);
    pCSD->b2DefaultECC=((buf[12]&0x60)>>5);
    pCSD->b3R2WFactor=((buf[12]&0x1c)>>2);
    
    pCSD->b4WriteBLLen=(buf[12]&0x03);
    pCSD->b4WriteBLLen<<=2;
    pCSD->b4WriteBLLen|=((buf[13]&0xc0)>>6);

    pCSD->b1WriteBLPartial=((buf[13]&0x20)>>5);
    pCSD->b4Reserved3=((buf[13]&0x1e)>>1);
    pCSD->b1ContentProtAPP=(buf[13]&0x01);

    pCSD->b1FileFormatGrp=((buf[14]&0x80)>>7);
    pCSD->b1Copy=((buf[14]&0x40)>>6);
    pCSD->b1PermWriteProtect=((buf[14]&0x20)>>5);
    pCSD->b1TmpWriteProtect=((buf[14]&0x10)>>4);

    pCSD->b2FileFormat=((buf[14]&0x0c)>>2);
    pCSD->b2ECC=(buf[14]&0x03);

    pCSD->b7CRC=((buf[15]&0xfe)>>1);
    pCSD->b1NouUsed=buf[15]&0x01;
}
做一个出色的程序员!
harktrip
驱动小牛
驱动小牛
  • 注册日期2003-11-30
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分51分
  • 威望457点
  • 贡献值0点
  • 好评度170点
  • 原创分0分
  • 专家分2分
地下室#
发布于:2007-10-26 13:51
zhuxiaofeng ,

看来我下载来的版本,和你的完全不同,
可以把你的版本,上传一份完整的吗?

感恩啦

(用这去修改后,可以判断到2G了,但256的误判为64的)
zhuxiaofeng
驱动小牛
驱动小牛
  • 注册日期2007-04-06
  • 最后登录2010-04-15
  • 粉丝0
  • 关注0
  • 积分1013分
  • 威望243点
  • 贡献值0点
  • 好评度202点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-10-26 15:19
别人给我的,不确定能用否。
我没有2410的板子。也无法测试。
不过应该是正确的。
附件名称/大小 下载次数 最后更新
SDMMC.7z (73KB)  28 2007-10-26 15:20
做一个出色的程序员!
harktrip
驱动小牛
驱动小牛
  • 注册日期2003-11-30
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分51分
  • 威望457点
  • 贡献值0点
  • 好评度170点
  • 原创分0分
  • 专家分2分
6楼#
发布于:2007-10-26 15:32
感謝啦...我先試試
zhuxiaofeng
驱动小牛
驱动小牛
  • 注册日期2007-04-06
  • 最后登录2010-04-15
  • 粉丝0
  • 关注0
  • 积分1013分
  • 威望243点
  • 贡献值0点
  • 好评度202点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-10-26 17:49
可以用你的load.因为你的load看来应该是正常的。
用我发的这个的Driver来试试。
这样就比较好调试。
做一个出色的程序员!
harktrip
驱动小牛
驱动小牛
  • 注册日期2003-11-30
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分51分
  • 威望457点
  • 贡献值0点
  • 好评度170点
  • 原创分0分
  • 专家分2分
8楼#
发布于:2007-10-29 09:50
最新进度:
1.插入SD卡,一秒左右盘符出现,音效同步有声,可以马上读写
2.SD卡拔出,无法进入中断,卸载盘符
3. 256MB,误判为64MB,512MB正常, 1G正常, 2G系统会卡住
4.SECTOR和档案: 和PC可互通,目前还没有问题
zhuxiaofeng
驱动小牛
驱动小牛
  • 注册日期2007-04-06
  • 最后登录2010-04-15
  • 粉丝0
  • 关注0
  • 积分1013分
  • 威望243点
  • 贡献值0点
  • 好评度202点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-10-29 16:04
2.SD卡拔出,无法进入中断,卸载盘符
:那系统刚起来的时候,卡不在的时候,插入是否有中断?
 插拔应该是一个中断。。这个是硬体的反应,可以通过AXD,直接插拔,
看相应的硬件状态位是否会变?
3. 256MB,误判为64MB,512MB正常, 1G正常, 2G系统会卡住
这个是相应对CSD的处理,发完CMD9之后是怎么处理的?
如果处理的地方有误。就会出现你说得情况,不过一般不应该出现这种情况。
而且2G的应该也没问题。
如果没有Response7的话,2G以上的不能处理。。
做一个出色的程序员!
harktrip
驱动小牛
驱动小牛
  • 注册日期2003-11-30
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分51分
  • 威望457点
  • 贡献值0点
  • 好评度170点
  • 原创分0分
  • 专家分2分
10楼#
发布于:2007-10-29 16:25
插入256MB SD卡,容量误判只有64MB的信息

ARMINT.C - SYSINTR_SDMMC_CARD_DETECT-20
SYSINTR_SDMMC_CARD_DETECT interrupt.
SDMMC CARD INSERT!
DoRegSetUp is done successfully
ATAPI DLL_PROCESS_ATTACH
SDMMC:DSK_Init ActiveKey=Drivers\Active\25
SDMMC_InitializeAddresses - Success

CMD0 Chk_CMDend:1.

In idle.
Chk_MMC_OCR
Chk_MMC_OCR
Chk_MMC_OCR
Chk_MMC_OCR
Chk_MMC_OCR
Chk_MMC_OCR
Chk_MMC_OCR
Chk_MMC_OCR
Chk_MMC_OCR
Chk_MMC_OCR
Chk_MMC_OCR
Chk_MMC_OCR
Chk_MMC_OCR
Chk_MMC_OCR
Chk_MMC_OCR

In SD ready.

End id.

RCA=0xb368

In stand-by
mmc_card_init OK.
SDMMC_Identify
SDMMC_Identify in...
SDIRSP0=0x7f0032
SDIRSP1=0x1f5983cf
SDIRSP2=0xf6dabf9f
SDIRSP3=0x9660006f
csd :0 7f 0 32 1f 59 83 cf f6 da bf 9f 96 60 0 6f .
---------------------------------
b2CSDStructure=0.
b4SpecVers=0.
b2Reserved1=0.
byTAAC=127.
byNSAC=0.
byTranSpeed=50.
b12CCC=501.
b4ReadBLLen=9.
b1ReadBLPartial=1.
b1WriteBlkMisalign=0.
b1ReadBlkMisalign=0.
b1DSRImp=0.
b12CSize=3903.
b3VDDRCurrMin=6.
b3VDDRCurrMax=6.
b3VDDWCurrMin=6.
b3VDDWCurrMax=6.
b3CSizeMult=1.
b5EraseGrpSize=15.
b5EraseGrpMult=28.
b5WPGrpSize=31.
b1WPGrpEnable=1.
b2DefaultECC=0.
b3R2WFactor=5.
b4WriteBLLen=9.
b1WriteBLPartial=1.
b4Reserved3=0.
b1ContentProtAPP=0.
b1FileFormatGrp=0.
b1Copy=0.
b1PermWriteProtect=0.
b1TmpWriteProtect=0.
b2FileFormat=0.
b2ECC=0.
b7CRC=55.
b1NouUsed=1.
---------------------------------
di_bytes_per_sect=512.
di_cylinders=1.
di_heads=1.
di_sectors=32.
di_total_sectors=124928.
mmc_send_csd OK.
SDMMC:DSK_Open=00000001
SD IOCTL:9-
pDisk->PerformIoctl FALSE:0x4
SDMMC:DSK_Close request Handle=00000001
SDMMC:DSK_Open=00000001
SD IOCTL:1+
SDMMC:GetDiskInfo!!!
SD IOCTL:1-
SD IOCTL:2+
SDMMC:GetDeviceInfo!!!
SD IOCTL:2-
SD IOCTL:7+
SDMMC:GetStorageId
SD IOCTL:7-
hDevice=0x4db260.
SD IOCTL:1+
SDMMC:GetDiskInfo!!!
SD IOCTL:1-
SD IOCTL:1+
SDMMC:GetDiskInfo!!!
SD IOCTL:1-
SD IOCTL:1+
SDMMC:GetDiskInfo!!!
SD IOCTL:1-
SD IOCTL:1+
SDMMC:GetDiskInfo!!!
SD IOCTL:1-
SD IOCTL:1+
SDMMC:GetDiskInfo!!!
SD IOCTL:1-
SD IOCTL:1+
SDMMC:GetDiskInfo!!!
SD IOCTL:1-
SD IOCTL:1+
SDMMC:GetDiskInfo!!!
SD IOCTL:1-
SD IOCTL:1+
SDMMC:GetDiskInfo!!!
SD IOCTL:1-
SD IOCTL:9-
pDisk->PerformIoctl FALSE:0x71c4c
zhuxiaofeng
驱动小牛
驱动小牛
  • 注册日期2007-04-06
  • 最后登录2010-04-15
  • 粉丝0
  • 关注0
  • 积分1013分
  • 威望243点
  • 贡献值0点
  • 好评度202点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2007-10-29 17:38
对呀。
di_bytes_per_sect=512.
di_cylinders=1.
di_heads=1.
di_sectors=32.
di_total_sectors=124928.
124928个sector大小就是64M。。
看看di_total_sectors这个是怎么算出来的?
这个计算的不对。。导致大小错误。
做一个出色的程序员!
harktrip
驱动小牛
驱动小牛
  • 注册日期2003-11-30
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分51分
  • 威望457点
  • 贡献值0点
  • 好评度170点
  • 原创分0分
  • 专家分2分
12楼#
发布于:2007-10-29 18:10
di_total_sectors计算公式还在看…
相同的计算方法,只在256的卡出问题…
还在伤脑筋中~~~
zhuxiaofeng
驱动小牛
驱动小牛
  • 注册日期2007-04-06
  • 最后登录2010-04-15
  • 粉丝0
  • 关注0
  • 积分1013分
  • 威望243点
  • 贡献值0点
  • 好评度202点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2007-10-30 09:28
這個計算方法是固定的。spec上有的。
都一樣的。隨便看一個好的能用的就行。
做一个出色的程序员!
harktrip
驱动小牛
驱动小牛
  • 注册日期2003-11-30
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分51分
  • 威望457点
  • 贡献值0点
  • 好评度170点
  • 原创分0分
  • 专家分2分
14楼#
发布于:2007-10-30 14:46
256MB误判64MB这个问题先挪后,
想先解决SD卡退出,无法卸载的问题.
不知道改了几回
卡退出时,确定有到ARMINT.C 去产生  SYSINTR_SDMMC_CARD_DETECT
但却没有到 SDMMCDetectThread 去执行...

真的快昏倒了,搞不定....

先去小睡一会...累歪了
harktrip
驱动小牛
驱动小牛
  • 注册日期2003-11-30
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分51分
  • 威望457点
  • 贡献值0点
  • 好评度170点
  • 原创分0分
  • 专家分2分
15楼#
发布于:2007-10-30 15:54
真是变态到不行
SD卡驱动要放在注册表最后加载...
才可插入/拔出都正常判断
harktrip
驱动小牛
驱动小牛
  • 注册日期2003-11-30
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分51分
  • 威望457点
  • 贡献值0点
  • 好评度170点
  • 原创分0分
  • 专家分2分
16楼#
发布于:2007-10-30 16:13
SDMMC:GetDiskInfo!!!
SD IOCTL:1-
SD IOCTL:1+
SDMMC:GetDiskInfo!!!
SD IOCTL:1-
SD IOCTL:1+
SDMMC:GetDiskInfo!!!
SD IOCTL:1-
SD IOCTL:1+
SDMMC:GetDiskInfo!!!
SD IOCTL:1-
SD IOCTL:1+
SDMMC:GetDiskInfo!!!
SD IOCTL:1-
SD IOCTL:9-
pDisk->PerformIoctl FALSE:0x71c4c

zhuxiaofeng
请教这个问题, 卡插入后
最后面会执行 IOCTL 9这项,
但程序中是把他当成未定义(未支持的)
所以后面跟着出现  pDisk->PerformIoctl FALSE

请问这有解吗?
因为目前读较大的档,会出现问题.
或许跟这有关联...
zhuxiaofeng
驱动小牛
驱动小牛
  • 注册日期2007-04-06
  • 最后登录2010-04-15
  • 粉丝0
  • 关注0
  • 积分1013分
  • 威望243点
  • 贡献值0点
  • 好评度202点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2007-10-30 23:11
这个我还不知道,
不过我觉得你读大文件有问题,小文件没问题。
会不是开辟的copy 的 BUFFER不够大,导致一部分数据被咔掉了。
看看每次最多可以传多少?和你开辟的buffer大小。。

还有驱动加载顺序和放注册表什么位置没关系。
主要是看注册表中的order的值的大小。
我看samsung 2410设置的是21,
基本上是最后加载了,不过不知道为啥。
做一个出色的程序员!
zhuxiaofeng
驱动小牛
驱动小牛
  • 注册日期2007-04-06
  • 最后登录2010-04-15
  • 粉丝0
  • 关注0
  • 积分1013分
  • 威望243点
  • 贡献值0点
  • 好评度202点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2007-10-30 23:14
引用第14楼harktrip于2007-10-30 14:46发表的  :
256MB误判64MB这个问题先挪后,
想先解决SD卡退出,无法卸载的问题.
不知道改了几回
卡退出时,确定有到ARMINT.C 去产生  SYSINTR_SDMMC_CARD_DETECT
但却没有到 SDMMCDetectThread 去执行...
.......


可以看看这时候在oal成是否发出这个中断了。
好像是个oalinterruptdone()函数里面。具体有点记不清楚。
在那里面打印一下,看这个中断能否出来,如果能出来肯定能进中断线程。
否则就是硬体的问题。。
做一个出色的程序员!
jyc_1
驱动小牛
驱动小牛
  • 注册日期2003-09-13
  • 最后登录2009-01-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望110点
  • 贡献值0点
  • 好评度110点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2007-10-31 16:32
to harktrip  zhuxiaofeng
不知道你们两位把USE_SDMMC_CONTROLLER这个宏置为1没有,我原来用2410的参口来试过,用IO方式可以读写,但是速度很慢啊,不知你们使用什么方式,速度如何,谢谢!
上一页
游客

返回顶部