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

📄 drv_loadctrl.c

📁 motorola mpc系列 mpc852cpu bsp
💻 C
📖 第 1 页 / 共 2 页
字号:

#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 + -