#if BL_USE_PAGE_VERIFY == ENABLE
/***********************************************************
* 函数说明: 页面校验函数 *
* 输入: 源页面缓冲区,目标地址 *
* 输出: 校验是否成功 *
* 调用函数: 无 *
***********************************************************/
BOOL Bootloader_Flash_Page_Verify
(
BYTE *pchDataBuffer,
#if BL_USE_EXTEND_ADDRESS_SPACE == ENABLE
UINT32 dwAddress
#else
UINT16 wAddress
#endif
)
{
UINT16 wCounter = FLASH_PAGE_SIZE;
UINT8 chDataA;
UINT8 chDataB;
#if BL_USE_EXTEND_ADDRESS_SPACE == ENABLE
UINT8 TRAMPZ = RAMPZ;
#endif
if (pchDataBuffer == NULL)
{
//! have nothing to do with...
return FALSE;
}
#if BL_USE_EXTEND_ADDRESS_SPACE == ENABLE
RAMPZ = dwAddress >> 16;
#endif
//! load the address to z register
asm("movw r30,r18");
//! load the buffer address to x register
asm("movw r26,r16");
#if BL_USE_EXTEND_ADDRESS_SPACE == ENABLE
if (RAMPZ)
{
while(wCounter--)
{
//! load a byte from flash (addressed by z register)
asm("elpm r0,z+");
//! employ a temporary variable chDataA
asm("mov %chDataA,r0");
//! load a byte from sram (addressed by x register)
asm("ld r0,x+");
//! employ a temporary variable chDataB
asm("mov %chDataB,r0");
//! checking...
if (chDataA != chDataB)
{
RAMPZ = TRAMPZ;
return FALSE;
}
WDR();
}
}
else
{
while(wCounter--)
{
//! load a byte from flash (addressed by z register)
asm("lpm r0,z+");
//! employ a temporary variable chDataA
asm("mov %chDataA,r0");
//! load a byte from sram (addressed by x register)
asm("ld r0,x+");
//! employ a temporary variable chDataB
asm("mov %chDataB,r0");
//! checking...
if (chDataA != chDataB)
{
RAMPZ = TRAMPZ;
return FALSE;
}
WDR();
}
}
RAMPZ = TRAMPZ;
#else
while(wCounter--)
{
//! load a byte from flash (addressed by z register)
asm("lpm r0,z+");
//! employ a temporary variable chDataA
asm("mov %chDataA,r0");
//! load a byte from sram (addressed by x register)
asm("ld r0,x+");
//! employ a temporary variable chDataB
asm("mov %chDataB,r0");
//! checking...
if (chDataA != chDataB)
{
return FALSE;
}
}
#endif
return TRUE;
}
#endif