📄 drv_loadctrl.c
字号:
#include "Typedef.h"
#include "Bsp.h"
#include "syslib.h"
#include "config.h"
#include "Drv_Crc.h"
/* time delay count for 2s */
extern int taskDelay (int ticks);
extern void LoadCtrl_Receive(char *pString, _U32 MaxLength);
extern _U32 Drv_ReadFlash(_U32 ulFlashAddr, _U32 ulLength, _U32 ulRamAddr);
extern _U32 Drv_WriteFlash(_U32 ulFlashAddr, _U32 ulLength, _U32 ulRamAddr);
extern _U32 Drv_WriteFlashDelay( _U32 FlashAddr, _U32 ByteCount, _U32 RamAddr );
extern void InChar ( unsigned char *szString, unsigned long *ret );
/* the global DEC timer, defined in BSP */
extern volatile _U32 g_DecTimer ;
extern _U32 gSMCBautRate[];
extern _U32 TickCount;
_U16 g_BootDecCount = 0;
extern _U32 sysStrToIp(_U8 *ipstr);
extern _U32 sysIpToStr(_U32 ip,char *strip);
extern _U32 sysStrToMac(char *strmac, char *pmac);
extern void sysMacToStr(char *pData,char *pStr);
extern _U32 sysVerifyMASKAddress(_S8 *szMaskAdd);
extern _U32 sysVerifyMACAddress(_S8 *szMACAdd);
extern _U32 sysVerifyHostIPAddress(_S8 *szIPAdd);
#define MAX_TFTP_FAILCOUNT 15
/* function pre-defined */
void LoadCtrl_ReadFlush(void);
_U32 gSerialSpeed ;
_U8 gBootProgState = BOOT_FROM_FLASH;
_U8 isModifyParam = 0;
BootInfoString ParamInfo;
BootInfoString ReadParamInfo = {"","","","","","","","",""};
BootInfo gBootInfo;
BootInfo FlashBootInfo;
char BootLine[BOOT_LINE_SIZE] = "";
extern void BSP_PrintMemSimple(char *pData,_U32 Count);
_U32 LoadCtrl_BootDataRecover()
{
_U8 BlockData[BOOT_DATA_BACK_SIZE];
(void)Drv_ReadFlash(FLASH_START_ADDR + BACK_BLOCK_OFFSET, BOOT_DATA_BACK_SIZE, (_U32)BlockData);
if (FAILURE == Drv_WriteFlashDelay(FLASH_START_ADDR, BOOT_DATA_BACK_SIZE, (_U32)BlockData))
{
Drv_Print("\r\nData recover failed!");
return FAILURE;
}
return SUCCESS;
}
_U32 LoadCtrl_BootDataBackup()
{
_U8 BlockData[BOOT_DATA_BACK_SIZE];
(void)Drv_ReadFlash(FLASH_START_ADDR, BOOT_DATA_BACK_SIZE, (_U32)BlockData);
if (FAILURE == Drv_WriteFlashDelay(FLASH_START_ADDR + BACK_BLOCK_OFFSET, BOOT_DATA_BACK_SIZE, (_U32)BlockData))
{
Drv_Print("\r\nData recover failed!");
return FAILURE;
}
return SUCCESS;
}
_U32 LoadCtrl_BootInfoIOCtrl(_U16 u16Cmd, _U32 pData)
{
_U16 usCrc;
if ((Drv_ReadFlash(BOOT_INFO_IN_FLASH, sizeof(BootInfo),
(_U32)&gBootInfo)) != SUCCESS)
{
Drv_Print("\r\nLoadCtrl ReadFlash failed!");
return FAILURE;
}
usCrc = CalcCrc((_U8 *)&gBootInfo, sizeof(BootInfo) - 4);
/* 如果读取flash中的参数失败,应该使用缺省值 */
if (gBootInfo.InfoCrc != usCrc)
{
if ((Drv_ReadFlash(BOOT_INFO_IN_FLASH_BACK, sizeof(BootInfo), (_U32)&gBootInfo)) != SUCCESS)
{
Drv_Print("\r\nLoadCtrl ReadFlash failed!");
return FAILURE;
}
usCrc = CalcCrc((_U8 *)&gBootInfo, sizeof(BootInfo) - 4);
if (gBootInfo.InfoCrc != usCrc)
{
return FAILURE;
}
if (FAILURE == LoadCtrl_BootDataRecover())
{
Drv_Print("\r\nBoot data recover failed!");
return FAILURE;
}
Drv_Print("\r\nBoot data recover seccessed!");
}
switch(u16Cmd)
{
case DRV_BOOT_SET_OUTER_IP:
memcpy((void *)&(gBootInfo.OuterIp), (char *)pData, 4);
break;
case DRV_BOOT_SET_OUTER_IP_STATE:
memcpy((void *)&(gBootInfo.OuterIpState), (char *)pData, 4);
break;
case DRV_BOOT_SET_OUTER_MASK:
memcpy((void *)&(gBootInfo.OuterIpMask), (char *)pData, 4);
break;
case DRV_BOOT_SET_OUTER_MASK_STATE:
memcpy((void *)&(gBootInfo.OuterIpMaskState), (char *)pData, 4);
break;
case DRV_BOOT_SET_OUTER_GATE:
memcpy((void *)&(gBootInfo.OuterGateAddr), (char *)pData, 4);
break;
case DRV_BOOT_SET_OUTER_GATE_STATE:
memcpy((void *)&(gBootInfo.OuterGateAddrState), (char *)pData, 4);
break;
case DRV_BOOT_SET_OUTER_MAC:
memcpy(gBootInfo.OuterMac, (char *)pData, MAC_ADDR_SIZE);
break;
case DRV_BOOT_SET_OUTER_MAC_STATE:
memcpy((void *)&(gBootInfo.OuterMacState), (char *)pData, 4);
break;
case DRV_BOOT_SET_INNER_IP:
memcpy((void *)&(gBootInfo.InnerIp), (char *)pData, 4);
break;
case DRV_BOOT_SET_INNER_IP_STATE:
memcpy((void *)&(gBootInfo.InnerIpState), (char *)pData, 4);
break;
case DRV_BOOT_SET_INNER_MAC:
memcpy(gBootInfo.InnerMac, (char *)pData, MAC_ADDR_SIZE);
break;
case DRV_BOOT_SET_INNER_MAC_STATE:
memcpy((void *)&(gBootInfo.InnerMacState), (char *)pData, 4);
break;
case DRV_BOOT_SET_HOSTIP:
memcpy((void *)&(gBootInfo.HostIp), (char *)pData, 4);
break;
case DRV_BOOT_SET_HOSTIP_STATE:
memcpy((void *)&(gBootInfo.HostIpState), (char *)pData, 4);
break;
case DRV_BOOT_SET_BOOTDIRC:
if (strlen((char *)pData)>=BOOT_DIRC_SIZE)
{
return FAILURE;
}
memcpy(gBootInfo.BootDirc, (char *)pData, strlen((char *)pData));
break;
case DRV_BOOT_SET_BOOTDIRC_STATE:
memcpy((void *)&(gBootInfo.BootDircState), (char *)pData, 4);
break;
case DRV_BOOT_SET_BOOTFILE:
if (strlen((char *)pData)>=TFTP_LOADNAME_SIZE)
{
return FAILURE;
}
memcpy(gBootInfo.LoadFileName, (char *)pData, strlen((char *)pData));
break;
case DRV_BOOT_SET_BOOTFILE_STATE:
memcpy((void *)&(gBootInfo.LoadFileNameState), (char *)pData, 4);
break;
case DRV_BOOT_SET_WORKMODE:
memcpy((void *)&(gBootInfo.DeviceWorkMode), (char *)pData, 4);
break;
case DRV_BOOT_SET_WORKMODE_STATE:
memcpy((void *)&(gBootInfo.DeviceWorkModeState), (char *)pData, 4);
break;
case DRV_BOOT_GET_OUTER_IP:
memcpy((char *)pData, (void *)&(gBootInfo.OuterIp), 4);
return SUCCESS;
case DRV_BOOT_GET_OUTER_IP_STATE:
memcpy((char *)pData, (void *)&(gBootInfo.OuterIpState), 4);
return SUCCESS;
case DRV_BOOT_GET_OUTER_MASK:
memcpy((char *)pData, (void *)&(gBootInfo.OuterIpMask), 4);
return SUCCESS;
case DRV_BOOT_GET_OUTER_MASK_STATE:
memcpy((char *)pData, (void *)&(gBootInfo.OuterIpMaskState), 4);
return SUCCESS;
case DRV_BOOT_GET_OUTER_GATE:
memcpy((char *)pData, (void *)&(gBootInfo.OuterGateAddr), 4);
return SUCCESS;
case DRV_BOOT_GET_OUTER_GATE_STATE:
memcpy((char *)pData, (void *)&(gBootInfo.OuterGateAddrState), 4);
return SUCCESS;
case DRV_BOOT_GET_OUTER_MAC:
memcpy((char *)pData, gBootInfo.OuterMac, MAC_ADDR_SIZE);
return SUCCESS;
case DRV_BOOT_GET_OUTER_MAC_STATE:
memcpy((char *)pData, (void *)&(gBootInfo.OuterMacState), 4);
return SUCCESS;
case DRV_BOOT_GET_INNER_IP:
memcpy((char *)pData, (void *)&(gBootInfo.InnerIp), 4);
return SUCCESS;
case DRV_BOOT_GET_INNER_IP_STATE:
memcpy((char *)pData, (void *)&(gBootInfo.InnerIpState), 4);
return SUCCESS;
case DRV_BOOT_GET_INNER_MAC:
memcpy((char *)pData, gBootInfo.InnerMac, MAC_ADDR_SIZE);
return SUCCESS;
case DRV_BOOT_GET_INNER_MAC_STATE:
memcpy((char *)pData, (void *)&(gBootInfo.InnerMacState), 4);
return SUCCESS;
case DRV_BOOT_GET_HOSTIP:
memcpy((char *)pData, (void *)&(gBootInfo.HostIp), 4);
return SUCCESS;
case DRV_BOOT_GET_HOSTIP_STATE:
memcpy((char *)pData, (void *)&(gBootInfo.HostIpState), 4);
return SUCCESS;
case DRV_BOOT_GET_BOOTDIRC:
memcpy((char *)pData, gBootInfo.BootDirc, strlen(gBootInfo.BootDirc));
return SUCCESS;
case DRV_BOOT_GET_BOOTDIRC_STATE:
memcpy((char *)pData, (void *)&(gBootInfo.BootDircState), 4);
return SUCCESS;
case DRV_BOOT_GET_BOOTFILE:
memcpy((char *)pData, gBootInfo.LoadFileName, strlen(gBootInfo.LoadFileName));
return SUCCESS;
case DRV_BOOT_GET_BOOTFILE_STATE:
memcpy((char *)pData, (void *)&(gBootInfo.LoadFileNameState), 4);
return SUCCESS;
case DRV_BOOT_GET_WORKMODE:
memcpy((char *)pData, (void *)&(gBootInfo.DeviceWorkMode), 4);
return SUCCESS;
case DRV_BOOT_GET_WORKMODE_STATE:
memcpy((char *)pData, (void *)&(gBootInfo.DeviceWorkModeState), 4);
return SUCCESS;
/*
case DRV_BOOT_SET_LOADPROGSTATE:
return LoadCtrl_SetProgLoadState((_U8 *)pData);
case DRV_BOOT_GET_LOADPROGSTATE:
return LoadCtrl_GetProgLoadState((_U8 *)pData);
case DRV_BOOT_SET_LOADDATASTATE:
return LoadCtrl_SetDataLoadState((_U8 *)pData);
case DRV_BOOT_GET_LOADDATASTATE:
return LoadCtrl_GetDataLoadState((_U8 *)pData);
case DRV_BOOT_SET_BOOT_TIMES:
return LoadCtrl_SetStateTimes((_U8 *)pData);
case DRV_BOOT_GET_BOOT_TIMES:
return LoadCtrl_GetStateTimes((_U8 *)pData);
case DRV_BOOT_SET_BOOT_STAB_TIME:
return LoadCtrl_SetStateStabTime((_U16 *)pData);
case DRV_BOOT_GET_BOOT_STAB_TIME:
return LoadCtrl_GetStateStabTime((_U16 *)pData);
case DRV_BOOT_SET_BOOT_COUNT:
return LoadCtrl_SetStateCount((_U8 *)pData);
case DRV_BOOT_GET_BOOT_COUNT:
return LoadCtrl_GetStateCount((_U8 *)pData);
*/
default:
return FAILURE;
}
gBootInfo.InfoCrc = CalcCrc((_U8 *)&gBootInfo, sizeof(BootInfo) - 4);
if (SUCCESS != Drv_WriteFlashDelay(BOOT_INFO_IN_FLASH, sizeof(BootInfo), (_U32)&gBootInfo))
{
Drv_Print("Save boot parameter failed.!%d",__LINE__);
return FAILURE;
}
if (SUCCESS != Drv_WriteFlashDelay(BOOT_INFO_IN_FLASH_BACK, sizeof(BootInfo), (_U32)&gBootInfo))
{
Drv_Print("Save boot parameter failed.!%d",__LINE__);
return FAILURE;
}
return SUCCESS;
}
void LoadCtrl_ClearBootInfo(BootInfoString *pBootInfo)
{
strcpy(pBootInfo->BootDirection,"");
strcpy(pBootInfo->HostIpAddr,"");
strcpy(pBootInfo->InnerIpAddr,"");
strcpy(pBootInfo->InnerMacAddr,"");
strcpy(pBootInfo->LoadFileName,"");
strcpy(pBootInfo->OuterGateAddr,"");
strcpy(pBootInfo->OuterIpAddr,"");
strcpy(pBootInfo->OuterIpMask,"");
strcpy(pBootInfo->OuterMacAddr,"");
}
_U32 LoadCtrl_SetDefaultParam()
{
memset((void *)&gBootInfo,0x0,sizeof(BootInfo));
BootLine[0] = 0;
strcat(BootLine,"motfec(0,0)");
strcat(BootLine,":vxworks");
strcpy(ParamInfo.BootDirection, "vxworks");
strcpy(gBootInfo.BootDirc, "vxworks");
gBootInfo.BootDircState = DRV_BOOTINFO_MODEFIED;
/* strcat(BootLine," h=192.168.1.2");
strcpy(ParamInfo.HostIpAddr, "192.168.1.2");
*/
strcat(BootLine," h=10.3.16.20");
strcpy(ParamInfo.HostIpAddr, "10.3.16.20");
gBootInfo.HostIp = sysStrToIp(ParamInfo.HostIpAddr);
gBootInfo.HostIpState = DRV_BOOTINFO_MODEFIED;
/* strcat(BootLine," e=192.168.1.3");
strcpy(ParamInfo.OuterIpAddr, "192.168.1.3");
*/
strcat(BootLine," e=10.3.16.48");
strcpy(ParamInfo.OuterIpAddr, "10.3.16.48");
gBootInfo.OuterIp = sysStrToIp(ParamInfo.OuterIpAddr);
gBootInfo.OuterIpState = DRV_BOOTINFO_MODEFIED;
strcat(BootLine," u=ap pw=ap o=motfec");
strcpy(ParamInfo.OuterGateAddr, "10.3.1.254");
gBootInfo.OuterGateAddr = sysStrToIp(ParamInfo.OuterGateAddr);
gBootInfo.OuterGateAddrState = DRV_BOOTINFO_MODEFIED;
strcpy(ParamInfo.OuterIpMask, "255.255.0.0");
gBootInfo.OuterIpMask = sysStrToIp(ParamInfo.OuterIpMask);
gBootInfo.OuterIpMaskState = DRV_BOOTINFO_MODEFIED;
strcpy(ParamInfo.OuterMacAddr, "00-00-33-03-02-02");
(void)sysStrToMac(ParamInfo.OuterMacAddr,gBootInfo.OuterMac);
gBootInfo.OuterMacState = DRV_BOOTINFO_MODEFIED;
#if 0
strcpy(ParamInfo.InnerMacAddr, "00-96-69-01-01-02");
(void)sysStrToMac(ParamInfo.InnerMacAddr,gBootInfo.InnerMac);
gBootInfo.InnerMacState = DRV_BOOTINFO_MODEFIED;
#if ( DEV_TYPE == DEV_AG )
strcpy(ParamInfo.InnerIpAddr, "69.01.01.01");
gBootInfo.InnerIp = sysStrToIp(ParamInfo.InnerIpAddr);
gBootInfo.InnerIpState = DRV_BOOTINFO_MODEFIED;
#endif
#endif
strcpy(ParamInfo.LoadFileName, "vxworks");
strcpy(gBootInfo.LoadFileName, ParamInfo.LoadFileName);
gBootInfo.LoadFileNameState = DRV_BOOTINFO_MODEFIED;
strcpy(ParamInfo.DeviceWorkMode, "0");
gBootInfo.DeviceWorkMode = 0;
gBootInfo.DeviceWorkModeState = DRV_BOOTINFO_MODEFIED;
gBootInfo.InfoCrc = CalcCrc((_U8 *)&gBootInfo, sizeof(BootInfo) - 4);
strcpy(BOOT_LINE_ADRS,BootLine);
if (SUCCESS == Drv_WriteFlash(BOOT_INFO_IN_FLASH, sizeof(BootInfo), (_U32)&gBootInfo))
{
return Drv_WriteFlash(BOOT_INFO_IN_FLASH_BACK, sizeof(BootInfo), (_U32)&gBootInfo);
}
else
{
return FAILURE;
}
}
_U32 LoadCtrl_GetBootParam(void)
{
_U16 usCrc;
if ((Drv_ReadFlash(BOOT_INFO_IN_FLASH, sizeof(BootInfo),(_U32)&gBootInfo)) != SUCCESS)
{
return FAILURE;
}
usCrc = CalcCrc((_U8 *)&gBootInfo, sizeof(BootInfo) - 4);
/* 如果读取flash中的参数失败,应该使用缺省值 */
if ((gBootInfo.InfoCrc != usCrc)||(0 == usCrc))
{
if ((Drv_ReadFlash(BOOT_INFO_IN_FLASH_BACK, sizeof(BootInfo),(_U32)&gBootInfo)) != SUCCESS)
{
return FAILURE;
}
usCrc = CalcCrc((_U8 *)&gBootInfo, sizeof(BootInfo) - 4);
if ((gBootInfo.InfoCrc != usCrc)||(0 == usCrc))
{
return (LoadCtrl_SetDefaultParam());
}
if (FAILURE == LoadCtrl_BootDataRecover())
{
Drv_Print("\r\nBoot data recover failed!");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -