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
This commit is contained in:
@@ -0,0 +1,158 @@
|
||||
/* ---------------------------------------------------------------------------
|
||||
* 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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user