Files
diplomarbeit/Tester/SW/Eclipse/BootLoader/appImage.c
T
Matthias 6880a47b46 Moved remotely
git-svn-id: file:///srv/dev-disk-by-uuid-17e88007-4d0c-45e0-8757-cacfcc458630/repositories/svn/Diplomarbeit@111 9fe90eed-be63-e94b-8204-d34ff4c2ff93
2009-01-12 08:38:04 +00:00

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);
}