/*************************************************8***********************
** File name: iap.c
** Last modified Date: 2010-06-25
** Last Version: V1.00
** Descriptions:
**
**-----------------------------------------------------------------------
** Created by: qhl
** Created date: 2010-06-25
** Version: V1.00
** Descriptions: flash写程序
**
**
*************************************************************************/
#include "iap.h"
#include "..\..\lib\list.h"
static INT32U GulParamin[8]={0,0,0,0,0,0,0,0}; //IAP入口参数缓冲区
static INT32U GulParamout[8]; //IAP出口参数缓冲区
static const iap_scope_t IapScope[]={{4*1024,12*1024},{128*1024,512*1024},{0,0},};
/*****************************************************************************************
** Function name: sectorGet
** Descriptions: IAP操作扇区获取
** input parameters: addr: 操作起始地址
** output parameters:
** Returned value: 执行成功返回>0 否则0
******************************************************************************************/
INT8U sectorGet (uint32 addr)
{
uint8 page;
if (addr<IAP_BPAGE_ADDR){
page=addr/(1024*4);
}else{
addr-=IAP_BPAGE_ADDR;
page=addr/(1024*32);
page+=16;
}
return page;
}
/*****************************************************************************************
** Function name: sectorPermission
** Descriptions: IAP操作扇区权限检查
** input parameters: addr: 操作起始地址
** output parameters:
** Returned value: 执行成功返回0 否则-1
******************************************************************************************/
int sectorPermission (uint32 addr)
{
iap_scope_t *Scope=(iap_scope_t *)IapScope;
//地址边界检查
if((addr&0x00ff)) return -1;
//可操作范围权限检查
while (Scope->start!=0){
if ((addr>=Scope->start)&&(addr<Scope->end)) return 0;
Scope++;
}
return -1;
}
/*****************************************************************************************
** Function name: sectorPrepare
** Descriptions: IAP操作扇区选择,命令代码50
** input parameters: ucSec1: 起始扇区
** ucSec2: 终止扇区
** output parameters: GulParamout[0]: IAP操作状态码,IAP返回值
** Returned value: GulParamout[0]: IAP操作状态码,IAP返回值
******************************************************************************************/
INT32U sectorPrepare (INT8U ucSec1, INT8U ucSec2)
{
GulParamin[0] = IAP_Prepare; //设置命令字
GulParamin[1] = ucSec1; //设置参数
GulParamin[2] = ucSec2;
(*(void(*)())IAP_ENTER_ADR)(GulParamin, GulParamout);//调用IAP服务程序
memset(GulParamin, 0, 8);
return (GulParamout[0]); //返回状态码
}
/******************************************************************************************
** Function name: ramCopy
** Descriptions: 复制RAM的数据到FLASH,命令代码51
** input parameters: ulDst: 目标地址,即FLASH起始地址。以512字节为分界
** ulSrc: 源地址,即RAM地址。地址必须字对齐
** ulNo: 复制字节个数,为512/1024/4096/8192
** lock: 操作锁
** output parameters: GulParamout[0]: IAP操作状态码,IAP返回值
** Returned value: GulParamout[0]: IAP操作状态码,IAP返回值
******************************************************************************************/
INT32U ramCopy (INT32U ulDst, INT32U ulSrc, INT32U ulNo, plock_t * lock)
{
if (openkey(lock, 12)<0) goto exit;
GulParamin[0] = IAP_RAMTOFLASH; //设置命令字
GulParamin[1] = ulDst; //设置参数
GulParamin[2] = ulSrc;
GulParamin[3] = ulNo;
GulParamin[4] = IAP_FCCLK;
if (openkey(lock, 13)<0) goto exit;
(*(void(*)())IAP_ENTER_ADR)(GulParamin, GulParamout); //调用IAP服务程序
closekey(lock, 13);
closekey(lock, 12);
exit:
memset(GulParamin, 0, 8);
return (GulParamout[0]); //返回状态码
}
/******************************************************************************************
** Function name: sectorErase
** Descriptions: 扇区擦除,命令代码52
** input parameters: ucSec1 起始扇区
** ucSec2 终止扇区92
** output parameters: GulParamout[0]: IAP操作状态码,IAP返回值
** Returned value: GulParamout[0]: IAP操作状态码,IAP返回值
****************************************************************(**************************/
INT32U sectorErase (INT8U ucSec1, INT8U ucSec2, plock_t *lock)
{
if (openkey(lock, 10)<0) goto exit;
GulParamin[0] = IAP_ERASESECTOR; //设置命令字
GulParamin[1] = ucSec1; //设置参数
GulParamin[2] = ucSec2;
GulParamin[3] = IAP_FCCLK;
if (openkey(lock, 11)<0) goto exit;
(*(void(*)())IAP_ENTER_ADR)(GulParamin, GulParamout); //调用IAP服务程序
closekey(lock, 11);
closekey(lock, 10);
exit:
memset(GulParamin, 0, 8);
return (GulParamout[0]); //返回状态码
}
/******************************************************************************************
** Function name: blankChk
** Descriptions: 扇区查空,命令代码53
** input parameters: ucSec1: 起始扇区
** ucSec2: 终止扇区92
** output parameters: GulParamout[0]: IAP操作状态码,IAP返回值
** Returned value: GulParamout[0]: IAP操作状态码,IAP返回值
*******************************************************************************************/
INT32U blankChk (INT8U ucSec1, INT8U ucSec2)
{
GulParamin[0] = IAP_BLANKCHK; //设置命令字
GulParamin[1] = ucSec1; //设置参数
GulParamin[2] = ucSec2;
(*(void(*)())IAP_ENTER_ADR)(GulParamin, GulParamout); //调用IAP服务程序
memset(GulParamin, 0, 8);
return (GulParamout[0]); //返回状态码
}
/******************************************************************************************
** Function name: parIdRead
** Descriptions: 扇区查空,命令代码54
** input parameters: 无
** output parameters: GulParamout[0]: IAP操作状态码,IAP返回值
** Returned value: GulParamout[0]: IAP操作状态码,IAP返回值
******************************************************************************************/
INT32U parIdRead (void)
{
GulParamin[0] = IAP_READPARTID; //设置命令字
(*(void(*)())IAP_ENTER_ADR)(GulParamin, GulParamout); //调用IAP服务程序
memset(GulParamin, 0, 8);
return (GulParamout[0]); //返回状态码
}
/*****************************************************************************************
** Function name: codeIdBoot
** Descriptions: 扇区查空,命令代码55
** input parameters: 无
** output parameters: GulParamout[0]: IAP操作状态码,IAP返回值
** Returned value: GulParamout[0]: IAP操作状态码,IAP返回值
*****************************************************************************************/
INT32U codeIdBoot (void)
{
GulParamin[0] = IAP_BOOTCODEID; //设置命令字
(*(void(*)())IAP_ENTER_ADR)(GulParamin, GulParamout); //调用IAP服务程序
memset(GulParamin, 0, 8);
return (GulParamout[0]);