⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 init.cpp

📁 coldfire5206芯片的boot程序
💻 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 + -