帮同学宣传一下http://shop57644665.taobao.com/

该项目平台是MTK6225,ARM7处理器,nor boot,128+32
DM技术方案提供商为Red Bend公司。

在加入DM方案以后,系统的划分如下

ROM1 0×00000000 0×00040000
ROM2 0×00040000 0×00d00000
ROM3 0×00d40000 0×000C0000

ROM1用来放FOTA更新程序和Red Bend 提供的lib部分。
ROM2为原来MTK程序,也是版本需要更新部分。
ROM3用来存放差分包,最后两个block一个用来做临时备份使用,一个用来做标志(安全但是浪费啊)。
注意:ARM的中断向量当然要放到ROM1中,*.obj的LEADING_PART部分也是需要的,否则可能无法boot。

片外RAM部分
FOTA部分将会使用很小的一部分,原来的MTK程序依次向后就可以了。FOTA部分程序当然会使用到MTK程序部分的内存,这个是因为FOTA需要很大的heap,并且这样做是没有问题的,因为MTK程序部分后面会再次初始化一次。

片内RAM部分
在这个项目的实现中,我将FLASH驱动代码放在了片内RAM中去执行。MTK程序依次向后就可以了。

进入FOTA的bootloader后,依然是先切换到svc模式,设置系统堆栈,设置EMI和DPLL.配置需要的GPIO,UART,手动将INTSRAM_CODE部分由FLASH copy到对应的RAM中,将FOTA必须的FLASH驱动copy到片内RAM中,禁掉watchdog timer,完成必须的lcd的初始化,然后

int i=0;
char *a=(char *)BACK_BLOCK_ADDR1;char *b=(char *)BACK_BLOCK_ADDR2;
char *backbuferr[2];
backbuferr[0]=a;backbuferr[1]=b;
i = RB_ImageUpdate((unsigned long int)UPDATE_ADDRESS_BEGIN,(unsigned long int)UPDATE_ADDRESS_END,(unsigned char*)FOTA_MEMORY_BEGIN,(unsigned long int)FOTA_MEMORY_SIZE,(unsigned char*)0,(unsigned long int)0,
(unsigned long int *)backbuferr,(unsigned long int)2,(unsigned long int)0);
if(i==S_RB_SUCCESS)
{
PW_Set_FOTA_Flag();
set_successed_flag();
clear_need_update_flag();
return;
}

Done.
Redbend提供给我们的RB_flash.c和RB_ImageUpdate.c是我们必须要完成接口函数,当我们将对应的驱动实现后,这些函数还是很容易完成的。