6880a47b46
git-svn-id: file:///srv/dev-disk-by-uuid-17e88007-4d0c-45e0-8757-cacfcc458630/repositories/svn/Diplomarbeit@111 9fe90eed-be63-e94b-8204-d34ff4c2ff93
159 lines
4.5 KiB
C
159 lines
4.5 KiB
C
/* ---------------------------------------------------------------------------
|
|
* appImage.c - v0.1 (c) 2008 Micro-key bv
|
|
* ---------------------------------------------------------------------------
|
|
* Micro-key bv
|
|
* Industrieweg 28, 9804 TG Noordhorn
|
|
* Postbus 92, 9800 AB Zuidhorn
|
|
* The Netherlands
|
|
* Tel: +31 594 503020
|
|
* Fax: +31 594 505825
|
|
* Email: support@microkey.nl
|
|
* Web: www.microkey.nl
|
|
* ---------------------------------------------------------------------------
|
|
* Description:
|
|
* ---------------------------------------------------------------------------
|
|
* Version(s): 0.1, Feb 12, 2008, FSc
|
|
* Creation.
|
|
* ---------------------------------------------------------------------------
|
|
*/
|
|
|
|
/* ---------------------------------------------------------------------------
|
|
* System include files
|
|
* ---------------------------------------------------------------------------
|
|
*/
|
|
|
|
/* ---------------------------------------------------------------------------
|
|
* Application include files
|
|
* ---------------------------------------------------------------------------
|
|
*/
|
|
#include "types.h"
|
|
#include "appImage.h"
|
|
#include "LPC23xx.h"
|
|
#include "crc.h"
|
|
#include "IspProtocol.h"
|
|
#include "bootloader.h"
|
|
|
|
/* ---------------------------------------------------------------------------
|
|
* Local constant and macro definitions
|
|
* ---------------------------------------------------------------------------
|
|
*/
|
|
typedef void (*t_application_startup)(void);
|
|
|
|
#define APPI_FLASH_START_ADDR 0x5000
|
|
#define APPI_FLASH_END_ADDR 0x7E000
|
|
#define APPI_C_ENTRY_OFFS 0x0020
|
|
#define APPI_IMAGE_LENGTH_OFFS 0x0008
|
|
#define APPI_IMAGE_CRC_OFFS 0x000C
|
|
|
|
/* ---------------------------------------------------------------------------
|
|
* Global variable definitions
|
|
* ---------------------------------------------------------------------------
|
|
*/
|
|
|
|
/* ---------------------------------------------------------------------------
|
|
* Local variable definitions
|
|
* ---------------------------------------------------------------------------
|
|
*/
|
|
|
|
/* ---------------------------------------------------------------------------
|
|
* Local function definitions
|
|
* ---------------------------------------------------------------------------
|
|
*/
|
|
void appiCalculateCrc( UINT32 imageLength, UINT16 *crc );
|
|
|
|
|
|
/** \brief Checks if the Application image requests a Image update
|
|
*
|
|
* When the application image wants to start an image update, it sets
|
|
* a pattern on a known RAM-location and resets the CPU. Now the bootloader
|
|
* can verify this pattern.
|
|
*
|
|
* \retval TRUE Application did request an update
|
|
* \retval FALSE Application did not request an update
|
|
*/
|
|
BOOLEAN appiApplicationRequestsUpdate()
|
|
{
|
|
if (blGetBootmode() == STAY_IN_BOOTLOADER)
|
|
{
|
|
return TRUE;
|
|
}
|
|
else
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
|
|
/** \brief Checks if a valid Application image.
|
|
*
|
|
* \retval TRUE Flash contains a valid Application image
|
|
* \retval FALSE Flash doesn't contain a valid Application image
|
|
*/
|
|
BOOLEAN appiValidAppImageAvail()
|
|
{
|
|
static UINT32 imageSize = 0;
|
|
static UINT16 recordedCrc = 0;
|
|
UINT8 index;
|
|
static UINT16 calculatedCrc;
|
|
|
|
index = APPI_IMAGE_LENGTH_OFFS;
|
|
imageSize = ispGet32bit((UINT8 *)APPI_FLASH_START_ADDR, &index);
|
|
recordedCrc = ispGet16bit((UINT8 *)APPI_FLASH_START_ADDR, &index);
|
|
|
|
if ( (imageSize >= 100)
|
|
&& (imageSize <= (APPI_FLASH_START_ADDR - APPI_FLASH_END_ADDR))
|
|
)
|
|
{
|
|
appiCalculateCrc(imageSize, &calculatedCrc);
|
|
|
|
if (recordedCrc != calculatedCrc)
|
|
{
|
|
return FALSE;
|
|
}
|
|
else
|
|
{
|
|
return TRUE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (imageSize == 0)
|
|
{
|
|
// escape for debugging
|
|
return TRUE;
|
|
}
|
|
else
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
/** \brief Jumps to the Application image. Function won't return.
|
|
*/
|
|
void appiJumpToAppImage()
|
|
{
|
|
unsigned int application_start_addr = APPI_FLASH_START_ADDR + APPI_C_ENTRY_OFFS;
|
|
|
|
blResetBootmode();
|
|
|
|
DISABLE_INTERRUPTS();
|
|
|
|
((t_application_startup)application_start_addr)();
|
|
}
|
|
|
|
void appiCalculateCrc( UINT32 imageLength, UINT16 *crc )
|
|
{
|
|
UINT8 *image = (UINT8 *)(APPI_FLASH_START_ADDR);
|
|
*crc = 0;
|
|
|
|
// Calculate Crc over part before Length & CRC
|
|
*crc = crcCalc(image, APPI_IMAGE_LENGTH_OFFS, *crc);
|
|
|
|
// Calculate Crc over part after Length & CRC
|
|
image = (UINT8 *)(APPI_FLASH_START_ADDR + APPI_IMAGE_CRC_OFFS + 4);
|
|
*crc = crcCalc(image, imageLength - (APPI_IMAGE_CRC_OFFS + 4), *crc);
|
|
}
|
|
|