- toolkit V2.8.0.1@14806 - BSL V1.8.0.0@14590 - tcpserver: V1.4.3.0@14676 (marshaller V2.4.0.1@14551)
90 lines
3.1 KiB
C
90 lines
3.1 KiB
C
/**************************************************************************************
|
|
|
|
Copyright (c) Hilscher Gesellschaft fuer Systemautomation mbH. All Rights Reserved.
|
|
|
|
***************************************************************************************
|
|
|
|
$Id: $:
|
|
|
|
Description:
|
|
cifX Toolkit implementation of the netX100/500 boot functions
|
|
|
|
Changes:
|
|
Date Description
|
|
-----------------------------------------------------------------------------------
|
|
2018-09-24 moved hboot functions to separate module
|
|
|
|
|
|
**************************************************************************************/
|
|
|
|
#include "cifXToolkit.h"
|
|
#include "NetX_ROMLoader.h"
|
|
#include "cifXErrors.h"
|
|
#include "cifXEndianess.h"
|
|
|
|
/*****************************************************************************/
|
|
/*! Downloads and starts the bootloader on netX100
|
|
* \param ptDevInstance Instance to download the bootloader to (needs a reset
|
|
* before downloading)
|
|
* \param pbFileData Pointer to bootloader file data
|
|
* \param ulFileDataLen Length of bootloader file
|
|
* \return CIFX_NO_ERROR on success */
|
|
/*****************************************************************************/
|
|
int32_t cifXStartBootloader_netX100( PDEVICEINSTANCE ptDevInstance,
|
|
uint8_t* pbFileData,
|
|
uint32_t ulFileDataLen)
|
|
{
|
|
int32_t lRet = CIFX_DRV_INIT_STATE_ERROR;
|
|
uint8_t* pbTmp = (uint8_t*)OS_Memalloc(ulFileDataLen);
|
|
|
|
if(NULL == pbTmp)
|
|
{
|
|
if(g_ulTraceLevel & TRACE_LEVEL_ERROR)
|
|
{
|
|
USER_Trace(ptDevInstance,
|
|
TRACE_LEVEL_ERROR,
|
|
"Error allocating memory for bootloader verification!");
|
|
}
|
|
lRet = CIFX_FILE_LOAD_INSUFF_MEM;
|
|
} else
|
|
{
|
|
/* Startup 2nd stage Loader */
|
|
HWIF_WRITEN(ptDevInstance, ptDevInstance->pbDPM, pbFileData, ulFileDataLen);
|
|
|
|
HWIF_READN(ptDevInstance, pbTmp, ptDevInstance->pbDPM, ulFileDataLen);
|
|
|
|
if(OS_Memcmp(pbTmp, pbFileData, ulFileDataLen) != 0)
|
|
{
|
|
lRet = CIFX_DRV_DOWNLOAD_FAILED;
|
|
|
|
if(g_ulTraceLevel & TRACE_LEVEL_ERROR)
|
|
{
|
|
USER_Trace(ptDevInstance,
|
|
TRACE_LEVEL_ERROR,
|
|
"Downloading of bootloader to DPM failed!");
|
|
}
|
|
|
|
} else
|
|
{
|
|
/* Toggle Start bit to let the second stage loader get started by netX ROMloader
|
|
Set bit 7 (Host) equal to Bit 3 (netX) */
|
|
uint32_t ulState = LE32_TO_HOST(HWIF_READ32(ptDevInstance, ptDevInstance->ptGlobalRegisters->ulSystemState));
|
|
|
|
if( ulState & MSK_SYSSTA_BOOT_ACTIVE)
|
|
/* Bit 3 is set, set Bit 7 */
|
|
ulState |= (uint32_t)MSK_SYSSTA_BOOT_START;
|
|
else
|
|
/* Bit 3 is 0, clear Bit 7 */
|
|
ulState &= (uint32_t)~MSK_SYSSTA_BOOT_START;
|
|
|
|
HWIF_WRITE32(ptDevInstance, ptDevInstance->ptGlobalRegisters->ulSystemState, HOST_TO_LE32(ulState));
|
|
|
|
/* We are done with starting the netX */
|
|
lRet = CIFX_NO_ERROR;
|
|
}
|
|
|
|
OS_Memfree(pbTmp);
|
|
}
|
|
|
|
return lRet;
|
|
} |