📄 init.cpp
字号:
/****************************************************************************************************
* 文 件 名: init.cpp
* 说 明: 原本该文件的内容是放在main.cpp中,是为了和writer.cpp共用,所以独立出来
*
* 作 者: 史梁材
* 创建时间: 2002.07.09
* 修改记录:
* (1) 2003.07.09 创建该文件
***************************************************************************************************/
#include "bastype.h"
#include "flash.h"
#include "mcf5206.h"
#include "mbusman.h"
#include "uartdrv.h"
#include "main.h"
#include "init.h"
SYSCONFIGFLAG g_stSysFlag;
/**
*/
VOID HardwareInit( VOID )
{
UINT32 i, j;
CHAR result;
*(unsigned char *)PARRAPORT_PADAT = 0xff;
MCF5206Init();
MBusInit( );
// 在使用定时器喂狗之前,复位一下看门狗
// 以免硬件初始化时间加上1S的喂狗时间叠加导致复位
ResetWatchdog();
return;
}
/**
* global variables, objects. all initialization about software
* coding here
*/
VOID SoftwareInit( VOID )
{
int vector;
VOID **vector_table; /* Pointer to vector table */
// 定义在int_sbc.s中,装载中断向量表
extern void* exception_handler1;
extern void* irq_handler1;
extern void* exception_handler;
extern void* irq_handler;
extern VOID *INT_FpgaExtInt2ISR;
extern VOID *INT_FpgaExtInt3ISR;
extern void* INT_Timer1_Interrupt;
extern void* INT_Timer2_Interrupt;
extern void* INT_UART2_Interrupt;
extern void* INT_UART1_Interrupt;
extern void* INT_Net_Interrupt;
/* Calculate the starting address of the actual vector table. */
vector_table = (VOID **) 0x0;
for (vector = 2; vector <= 24; vector ++)
{
vector_table[vector] = &exception_handler1;
}
for (vector = 25; vector <= 31; vector ++)
{
vector_table[vector] = &irq_handler1;
}
for (vector = 32; vector <= 63; vector ++)
{
vector_table[vector] = &exception_handler;
}
for (vector = 64; vector <= 255; vector ++)
{
vector_table[vector] = &irq_handler;
}
vector = MCF5206::IV_TIMER1;
vector_table[vector] = &INT_Timer1_Interrupt;
vector = MCF5206::IV_TIMER2;
vector_table[vector] = &INT_Timer2_Interrupt;
vector = MCF5206::IV_UART1;
vector_table[vector] = &INT_UART1_Interrupt;
vector = MCF5206::IV_UART2;
vector_table[vector] = &INT_UART2_Interrupt;
vector = MCF5206::IV_EINT2;
vector_table[vector] = &INT_FpgaExtInt2ISR;
vector = MCF5206::IV_EINT3;
vector_table[vector] = &INT_FpgaExtInt3ISR;
vector = MCF5206::IV_EINT4;
vector_table[vector] = &INT_Net_Interrupt;
// enable timer for resetting watchdog
EnableSysInterrupt(MCF5206::IM_TIMER1);
// read system flag from eeprom
CAT24C021ReadSeqByte(EEPROM_SYSTEM_FLAG_POS, sizeof(EEPROMSYSFLAG), (UINT8*)(&g_stSysFlag.stESysFlag));
// read system flag from flash
memcpy((UINT8*)(&g_stSysFlag.stFSysFlag), (UINT8*)FLASH_SYSTEM_FLAG_POS, sizeof(FLASHSYSFLAG));
// if (g_stSysFlag.stESysFlag.ucMainSysIsValid != 1) // 第一次会是0xff,所以不能用非0来判断
// {
// g_stSysFlag.stESysFlag.ucUpdateMachineID = g_stSysFlag.stFSysFlag.ucSelfMachineID;
// g_stSysFlag.stESysFlag.ucUpdatePortID = g_stSysFlag.stFSysFlag.ucSelfPortID;
// }
return;
}
//(1) 在配置数据(参见概要设计说明的附录)区,通过检查校验和来判断系统软件信息是否有效。如果无效,即表示没有有效的系统软件软件信息,提示升级系统软件。
//(2) 如果有效,根据系统软件信息,通过检查校验和来判断系统软件是否有效,如果无效,提示系统软件。
//(3) 如果有效,检查FPGA的正确性:如果不正确,提示下载FPGA数据;如果正确,运行系统软件。
BOOL CheckSystemValid(BOOL* pMainIsValid, BOOL* pFpgaIsValid)
{
UINT32 lChecksum = 0;
int i;
SOFTCOMINFO stSoftInfo;
// 先检查系统程序
*pMainIsValid = FALSE;
for (i = 0; i < (sizeof(FLASHSYSFLAG) - 4) / 2; i ++)
{
lChecksum += *((UINT16*)(&g_stSysFlag.stFSysFlag) + i);
}
if (g_stSysFlag.stFSysFlag.lChecksum != lChecksum)
{
*pMainIsValid = FALSE;
}
else
{
// read system flag from flash
memcpy((UINT8*)(&stSoftInfo), (UINT8*)(g_stSysFlag.stFSysFlag.lConfigPos + CONFIG_SYS_SOFT_INFO_POS), sizeof(SOFTCOMINFO));
lChecksum = 0;
for (i = 0; i < (sizeof(SOFTCOMINFO) - 4) / 2; i ++)
{
lChecksum += *((UINT16*)(&stSoftInfo) + i);
}
if (stSoftInfo.lChecksum == lChecksum
&& stSoftInfo.lComLen != 0)
{
lChecksum = 0;
for (i = 0; i < stSoftInfo.lComLen / 2; i ++)
{
lChecksum += *((UINT16*)(0x820000 + i * 2));
}
if (stSoftInfo.lComChecksum == lChecksum)
{
*pMainIsValid = TRUE;
// return TRUE;
}
}
}
// 检查FPGA数据
*pFpgaIsValid = FALSE;
memcpy((UINT8*)(&stSoftInfo), (UINT8*)(g_stSysFlag.stFSysFlag.lFpgaPos), sizeof(SOFTCOMINFO));
lChecksum = 0;
for (i = 0; i < (sizeof(SOFTCOMINFO) - 4) / 2; i ++)
{
lChecksum += *((UINT16*)(&stSoftInfo) + i);
}
if (stSoftInfo.lChecksum == lChecksum
&& stSoftInfo.lComLen != 0)
{
lChecksum = 0;
for (i = 0; i < stSoftInfo.lComLen / 2; i ++)
{
lChecksum += *((UINT16*)(g_stSysFlag.stFSysFlag.lFpgaPos + sizeof(SOFTCOMINFO) + i * 2));
}
if (stSoftInfo.lComChecksum == lChecksum)
{
*pFpgaIsValid = TRUE;
}
}
if ( *pMainIsValid == TRUE && *pFpgaIsValid == TRUE)
{
return TRUE;
}
else
{
return FALSE;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -