阅读:3780回复:22
还是SDMMC驱动的问题,看源码就已经设定了512MB阿!
如提,程序中就被设定为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,已经搞了一个多月都还没搞定,大家帮帮忙啰 |
|
沙发#
发布于:2007-10-26 09:36
什么啊,SD卡cap的识别要到CSD里去读啊,这个在SDbus里做的,2440我不知道
|
|
板凳#
发布于:2007-10-26 12:39
这是2410的程序?貌似你拿的不对吧。
这个大小是要计算的。看SD的Spec里面有计算的办法。 也是楼上说的在CSD寄存器里面(又CMD9获得)。 在WINCE下可擦写档案,但拿到PC却无法判读,这有可能是哪边出的问题? 至于这个问题, 拿到PC上之后还能识别嘛??如果不能识别有可能你写的地址不对(把MBR写坏了) 如果可以识别,但是里面东西不对,要查两个方面: 一是:上面传下来的Scatter_gather buffer处理。在IOCTL部分。 二是:自己的读写。(如果是DMA的话,数据拷贝要分清楚,读的时候先拷贝到DMA BUFFER) 写的时候,后拷贝) |
|
|
地板#
发布于: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; } |
|
|
地下室#
发布于:2007-10-26 13:51
zhuxiaofeng ,
看来我下载来的版本,和你的完全不同, 可以把你的版本,上传一份完整的吗? 感恩啦 (用这去修改后,可以判断到2G了,但256的误判为64的) |
|
5楼#
发布于:2007-10-26 15:19
别人给我的,不确定能用否。
我没有2410的板子。也无法测试。 不过应该是正确的。 |
|
|
6楼#
发布于:2007-10-26 15:32
感謝啦...我先試試
|
|
7楼#
发布于:2007-10-26 17:49
可以用你的load.因为你的load看来应该是正常的。
用我发的这个的Driver来试试。 这样就比较好调试。 |
|
|
8楼#
发布于:2007-10-29 09:50
最新进度:
1.插入SD卡,一秒左右盘符出现,音效同步有声,可以马上读写 2.SD卡拔出,无法进入中断,卸载盘符 3. 256MB,误判为64MB,512MB正常, 1G正常, 2G系统会卡住 4.SECTOR和档案: 和PC可互通,目前还没有问题 |
|
9楼#
发布于:2007-10-29 16:04
2.SD卡拔出,无法进入中断,卸载盘符
:那系统刚起来的时候,卡不在的时候,插入是否有中断? 插拔应该是一个中断。。这个是硬体的反应,可以通过AXD,直接插拔, 看相应的硬件状态位是否会变? 3. 256MB,误判为64MB,512MB正常, 1G正常, 2G系统会卡住 这个是相应对CSD的处理,发完CMD9之后是怎么处理的? 如果处理的地方有误。就会出现你说得情况,不过一般不应该出现这种情况。 而且2G的应该也没问题。 如果没有Response7的话,2G以上的不能处理。。 |
|
|
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 |
|
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这个是怎么算出来的? 这个计算的不对。。导致大小错误。 |
|
|
12楼#
发布于:2007-10-29 18:10
di_total_sectors计算公式还在看…
相同的计算方法,只在256的卡出问题… 还在伤脑筋中~~~ |
|
13楼#
发布于:2007-10-30 09:28
這個計算方法是固定的。spec上有的。
都一樣的。隨便看一個好的能用的就行。 |
|
|
14楼#
发布于:2007-10-30 14:46
256MB误判64MB这个问题先挪后,
想先解决SD卡退出,无法卸载的问题. 不知道改了几回 卡退出时,确定有到ARMINT.C 去产生 SYSINTR_SDMMC_CARD_DETECT 但却没有到 SDMMCDetectThread 去执行... 真的快昏倒了,搞不定.... 先去小睡一会...累歪了 |
|
15楼#
发布于:2007-10-30 15:54
真是变态到不行
SD卡驱动要放在注册表最后加载... 才可插入/拔出都正常判断 |
|
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 请问这有解吗? 因为目前读较大的档,会出现问题. 或许跟这有关联... |
|
17楼#
发布于:2007-10-30 23:11
这个我还不知道,
不过我觉得你读大文件有问题,小文件没问题。 会不是开辟的copy 的 BUFFER不够大,导致一部分数据被咔掉了。 看看每次最多可以传多少?和你开辟的buffer大小。。 还有驱动加载顺序和放注册表什么位置没关系。 主要是看注册表中的order的值的大小。 我看samsung 2410设置的是21, 基本上是最后加载了,不过不知道为啥。 |
|
|
18楼#
发布于:2007-10-30 23:14
引用第14楼harktrip于2007-10-30 14:46发表的 : 可以看看这时候在oal成是否发出这个中断了。 好像是个oalinterruptdone()函数里面。具体有点记不清楚。 在那里面打印一下,看这个中断能否出来,如果能出来肯定能进中断线程。 否则就是硬体的问题。。 |
|
|
19楼#
发布于:2007-10-31 16:32
to harktrip zhuxiaofeng
不知道你们两位把USE_SDMMC_CONTROLLER这个宏置为1没有,我原来用2410的参口来试过,用IO方式可以读写,但是速度很慢啊,不知你们使用什么方式,速度如何,谢谢! |
|
上一页
下一页