求助:SD卡升级WinCE问题

zxioy   2009-7-28 21:14 楼主
最近需要做SD卡升级系统。由于是第一次做,又没有人教下思路,所以多是自己在看在想的。
思路:在EBOOT里直接添加这部分功能。跟具体一点是在DownLoadImage() =》OEMReadData()多实现一个从SD卡读数据来完成。也就是说本来OEMReadData()是实现读PC机上的Image到memory上建立的buffer,换成:读SD卡上的Image到memory上建立的buffer。这种方式不清楚是否可行?现在问题:SD卡是FAT格式,可NK.BIN是写在nand flash BINFS格式的区,不知道这样是否有不妥的地方?还请大家指点下SD卡升级系统的方向,感激不尽。

回复评论 (25)

帮顶一下,呵呵
点赞  2009-7-28 21:42
引用: 引用楼主 chinatzar1 的回复:
最近需要做SD卡升级系统。由于是第一次做,又没有人教下思路,所以多是自己在看在想的。
思路:在EBOOT里直接添加这部分功能。跟具体一点是在DownLoadImage() =》OEMReadData()多实现一个从SD卡读数据来完成。也就是说本来OEMReadData()是实现读PC机上的Image到memory上建立的buffer,换成:读SD卡上的Image到memory上建立的buffer。这种方式不清楚是否可行?现在问题:SD卡是FAT格式,可NK.BIN是写在nand flash BINFS格式的区,不知道这样是否有不妥的地方?还请大家指点下SD卡升级系统的方向,感激不尽。

关键问题就是FAT文件的读取,sd卡升级也就是在sd中放个nk文件,再把文件读取出来下载到flash上
点赞  2009-7-28 21:56
回xunjingzhpu,关键问题就是FAT文件的读取,能说下这个地方的难点吗?因为我刚接触SD卡这部分.
这两天争取把SD卡裸机下的文件读取完成.
点赞  2009-7-28 22:53
引用: 引用楼主 chinatzar1 的回复:
最近需要做SD卡升级系统。由于是第一次做,又没有人教下思路,所以多是自己在看在想的。
思路:在EBOOT里直接添加这部分功能。跟具体一点是在DownLoadImage() =》OEMReadData()多实现一个从SD卡读数据来完成。也就是说本来OEMReadData()是实现读PC机上的Image到memory上建立的buffer,换成:读SD卡上的Image到memory上建立的buffer。这种方式不清楚是否可行?现在问题:SD卡是FAT格式,可NK.BIN是写在nand flash BINFS格式的区,不知道这样是否有不妥的地方?还请大家指点下SD卡升级系统的方向,感激不尽。


对,在OEMReadData里面,加一个分支,读出SD卡的数据,然后在buffer里面,再从buffer存到nand falsh

读卡的时候,加上FAT文件系统的解析,读出来纯数据,就可以直接存储到flash了
点赞  2009-7-29 09:06
引用: 引用 2 楼 xunjingzhpu 的回复:


关键问题就是FAT文件的读取,sd卡升级也就是在sd中放个nk文件,再把文件读取出来下载到flash上


well done
点赞  2009-7-29 09:08
Eboot中支持SD卡升级主要实现:
1. SD卡接口支持,以便识别SD卡。
2. FAT文件格式支持,以便从SD卡读出镜像文件。
3. SD卡读取数据函数,用以支持升级函数正确的读出数据在RAM中形成有效的镜像数据。

你需要先实现SD卡支持,再了解FAT文件格式。然后才能继续。
点赞  2009-7-29 09:42
关注中...
点赞  2009-7-29 10:11
谢谢大家`````
引用: 引用 6 楼 shuiyan 的回复:
Eboot中支持SD卡升级主要实现:
2. FAT文件格式支持,以便从SD卡读出镜像文件。

FAT文件格式支持,我不大理解.SD卡不是本来就支持FAT格式的吗?
点赞  2009-7-29 11:50
引用: 引用 4 楼 aaassd_cn 的回复:
读卡的时候,加上FAT文件系统的解析,读出来纯数据,就可以直接存储到flash了

原来还需要解析,本以为直接读写数据就OK了,谢谢了
点赞  2009-7-29 11:55
引用: 引用 8 楼 chinatzar1 的回复:
谢谢大家`````
引用 6 楼 shuiyan 的回复:
Eboot中支持SD卡升级主要实现:
2. FAT文件格式支持,以便从SD卡读出镜像文件。

FAT文件格式支持,我不大理解.SD卡不是本来就支持FAT格式的吗?


哎,FAT文件系统仅仅是一种存储方式,可以用在在很多平台上,ucos 裸奔,PC机子
只是复杂程度不同。SD卡升级也使用了它的存储方式而已。
这个FAT文件系统都写好了,楼主只要移植进来就可以用了。
点赞  2009-7-29 11:59
SD卡一般在经过Windows用户格式化后,才支持FAT/FAT32等格式文件存储。出厂时是裸FLASH,可支持读写,但无文件系统的存在。

具体的看了FAT介绍就知道了。这类研究极其成熟,而且在Windows下随时可以验证、查看,所以熟悉起来很快。比NTFS/ext2之类的方便多了。
点赞  2009-7-29 12:19
引用: 引用 4 楼 aaassd_cn 的回复:

对,在OEMReadData里面,加一个分支,读出SD卡的数据,然后在buffer里面,再从buffer存到nand falsh

读卡的时候,加上FAT文件系统的解析,读出来纯数据,就可以直接存储到flash了

升级系统应该是直接放的NK.bin到SD卡上的吧,也是*.bin的格式放到flash的binfs区.怎么又读出纯数据?
点赞  2009-7-29 12:59
引用: 引用 12 楼 chinatzar1 的回复:
引用 4 楼 aaassd_cn 的回复:

对,在OEMReadData里面,加一个分支,读出SD卡的数据,然后在buffer里面,再从buffer存到nand falsh

读卡的时候,加上FAT文件系统的解析,读出来纯数据,就可以直接存储到flash了

升级系统应该是直接放的NK.bin到SD卡上的吧,也是*.bin的格式放到flash的binfs区.怎么又读出纯数据?


在sd卡上,nk.bin就是一个普通的文件,和其他文件没有什么不一样,但是fat下有一些其他的数据结构,保存着文件信息,不能当做nk.bin的数据一起存到flash里面,所以我说纯数据
点赞  2009-7-30 09:11
还没搞定关注
点赞  2009-7-30 09:29
关注
点赞  2009-7-30 09:53
引用: 引用 14 楼 xqhrs232 的回复:
还没搞定关注

由于没有搞过SD卡,对bootloader也只能算是了解,所以速度是慢了些.不够有大家的指点应该会快一点.

现在把SD卡读写在裸机上实现了,开始进行bootloader修改.今天在看eboot downloadimage()下的
BOOL OEMReadData(DWORD dwData,PUCHAR pData)
{
BOOL ret;
if(g_bUSBDownload==FALSE)
{
  ret=EbootEtherReadData(dwData,pData);
}
else
{
  ret=UbootReadData(dwData,pData);
}
return(ret);
}
如果g_bUSBDownLoad==FALSE用的USB方式则执行
BOOL UbootReadData(DWORD cbData, LPBYTE pbData)
{        
           volatile S3C2450_INTR_REG *s2450INT = (S3C2450_INTR_REG *)OALPAtoVA(S3C2450_BASE_REG_PA_INTR, FALSE);       
           UINT8* pbuf = NULL;
        while(1)
        {

                if ((UINT32)g_pDownPt >= readPtIndex + cbData )
                {
                        pbuf = (PVOID)readPtIndex;
                        memcpy((PVOID)pbData, pbuf, cbData);
                        pbuf = (PVOID)OALPAtoUA(readPtIndex);
                        memset(pbuf, 0xff, cbData);
                        readPtIndex += cbData;
                        break;
                }
                else if((UINT32)g_pDownPt == DMABUFFER)
                {
                        /*
                        if (s2450INT->SRCPND & BIT_USBD) s2450INT->SRCPND  = BIT_USBD;
                        if (s2450INT->INTPND & BIT_USBD) s2450INT->INTPND = BIT_USBD;
                        s2450INT->INTMSK &= ~BIT_USBD;                // USB Interrupt enable.
                        */
                }
        }
       
        return TRUE;
}
在UbootReadData()进行只是内存的操作,并没有关系到USB的操作,让我有点不理解
点赞  2009-7-30 11:57
引用: 引用 16 楼 chinatzar1 的回复:
引用 14 楼 xqhrs232 的回复:
还没搞定关注

由于没有搞过SD卡,对bootloader也只能算是了解,所以速度是慢了些.不够有大家的指点应该会快一点.

现在把SD卡读写在裸机上实现了,开始进行bootloader修改.今天在看eboot downloadimage()下的
BOOL OEMReadData(DWORD dwData,PUCHAR pData)
{
BOOL ret;
if(g_bUSBDownload==FALSE)
{
? ret=EbootEtherReadData(dwData,pData);
}
else
{
? ret=UbootReadData(dwData,pData);
}
return(ret);
}
如果g_bUSBDownLoad==FALSE用的USB方式则执行
BOOL UbootReadData(DWORD cbData, LPBYTE pbData)
{
? volatile S3C2450_INTR_REG *s2450INT = (S3C2450_INTR_REG *)OALPAtoVA(S3C2450_BASE_REG_PA_INTR, FALSE);
? UINT8* pbuf = NULL;
while(1)
{

if ((UINT32)g_pDownPt >= readPtIndex + cbData )
{
pbuf = (PVOID)readPtIndex;
memcpy((PVOID)pbData, pbuf, cbData);
pbuf = (PVOID)OALPAtoUA(readPtIndex);
memset(pbuf, 0xff, cbData);
readPtIndex += cbData;
break;
}
else if((UINT32)g_pDownPt == DMABUFFER)
{
/*
if (s2450INT->SRCPND & BIT_USBD) s2450INT->SRCPND? = BIT_USBD;
if (s2450INT->INTPND & BIT_USBD) s2450INT->INTPND = BIT_USBD;
s2450INT->INTMSK &= ~BIT_USBD; // USB Interrupt enable.
*/
}
}

return TRUE;
}
在UbootReadData()进行只是内存的操作,并没有关系到USB的操作,让我有点不理解



这部分内容是的确只有内存的操作,原因是USB的操作在其它函数中通过中断方式,已经将USB获取的数据放到了内存中,所以UbootReadData()只需要到那个内存地址读数据就行了。
点赞  2009-7-30 12:03
谢谢veabol,那我找找USB具体的实现在哪,我想把那些部分改成SD,来完成SDBOOT.
点赞  2009-7-30 12:39
不知道楼主解决的怎么样了?
点赞  2009-9-6 16:47
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复