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

📄 tftpupgrade.c

📁 wi-fi手机原代码
💻 C
📖 第 1 页 / 共 4 页
字号:
#include <time.h>
#include <vxworks.h>
#include <msgQLib.h>
#include <taskLib.h>
#include <inetLib.h>
#include <stdio.h>
#include<string.h>
#include <resolvLib.h>
#include <hostLib.h>
#include <tftplib.h>
#include <errnolib.h>

#include "define.h"
#include "democfg.h"
#include "tftpup.h"
#include "aes.h"

#include <rebootLib.h>
#include "config.h"
#include <drv/mem/flashDev.h>
#include "agrflash.h"
#include "flashup.h"
#include "biosapi.h"
#include "flashbase.h"
#include "local_log.h"
#include "syslog.h"
#include "aplocal.h"

#define TFTPLOG printf

#define FLASH_SECTOR_BYTES		65536
#define TFTP_CONFIGFILE_MAX		32*1024
#define TFTP_PACKET_BYTES		512

#define TFTP_DOWNLOADFILE_QUEUE_LEN		2
#define TFTP_DOWNLOADFILE_MSG_LEN		sizeof(int)
#define TFTP_BIN_IMAGE_ADDR				0x500000
#define TFTP_COMPRESS_IMAGE_ADDR		0x580000

#define TFTP_CONFIG_ITEMS_MAX	300

#define TFTP_RETRY_NONE	0
#define TFTP_RETRY_CONFIG	1
#define TFTP_RETRY_FIRMWARE 	2

#define TFTP_LOG_CONFIGFILE		1
#define TFTP_LOG_FIRMWAREFILE	2


//#define 
typedef struct
{
	int iPort;
	int iAvail;
}TFTP_PORT_S;

typedef struct
{
	char* pConfigSrvFQDN;
	char* pConfigFileName;
	char* pEncreptionKey;
	char* pFirmwareSrvFQDN;
	char* pFirmwareFilePath;
	char* pFirmwareFileName;
	int	  cProto;		/* 0-tftp  1-http */
	int 	  cHttpPort;
	int	  fProto;
	int	  fHttpPort;
}TFTP_LOCATION_S;

typedef struct
{
	char arKeyName[128+1];
	char arKeyValue[128+1];
}
LOCT_TXT_S;



static BOOLEAN isDisplayChar(char c);
static char *SkipEnterChars(char *pTxtSrc);
static char *getKeyName(char *pTxtSrc);
static char *getKeyValue(char *pTxtSrc);
static char * TGetCurLine(char *pTxtSrc,LOCT_TXT_S *pTxtDest);
static BOOLEAN isMMIInIdle();
static BOOLEAN isMMIInPowerOff();
static BOOLEAN TFirmwareIsChanged();
VOID TFTP_Main(VOID);
void TFTPDownloadFileTask(int iParam);
STATUS TFTPUpgradeProc();
VOID TFTPDownloadFile(int iFileType);
STATUS TFTPConfigUpgradeProc(BOOLEAN *pConfigChanged);
STATUS TFTPFirmwareUpgradeProc();

STATUS TftpCodeGet(char *host, char *ipAddr,char *filename,int fileType/*0-bin  1-compress*/);

int TFTPCreateTask(char *taskId, FUNCPTR taskProc,
                						int priority, int stackSize,int iParam);
UINT32 TftpGetCompressedFileSize();
UINT32 TftpGetMagicNumber();
STATUS TftpTxtParse(char *pTxtSrc, CFG_ITEM_S *pBinDest,int *pBinDestLen);
BOOLEAN TftpTxtIsValid(char *pTxtSrc,int iStrLen);
STATUS TftpDefaultValueReset();
STATUS TGetCurLoctParams();
char *TGetCfgFileName();
VOID setCurTFTPPort(int iPort);
int getCurTFTPPort();
int getNextTFTPPort(int iPort);

/* external protype*/
extern  void hwFeedWDT(void);
extern void TFTP_Send_MMIMsg(unsigned char ntype);

extern STATUS sysStartImage(UINT32 address);
extern STATUS WLOwnMACAddressGet( int unit, unsigned char *szMACAddress );


IMPORT STATUS	   flashEraseImage( int flashDev, int startSector, int endSector );
IMPORT void		   flashupReboot(int programMagic);
IMPORT FLASH_DEF*  flashSectorAddr( UINT32 dev, UINT32 sector );
IMPORT UINT32      flashSectorNum( FLASH_DEF * pFlash );
IMPORT UINT32      flashSectorSize( UINT32 dev, UINT32 sector );
IMPORT STATUS	   flashupProgramEx( int flashDev, int sector, FLASH_DEF * pData,
                                     int len, int offset  );

extern VOID TftpFlashupReboot(UINT32 totalFileBytes);
extern void Exit_Sleep(int nsleepstate);
extern void Enter_Sleep(int nsleepstate);
extern time_t TftpGetRetryTime();
extern STATUS TftpSetRetryTime(time_t tRetry );

int g_bTFTPRetry;
/*
TFTP_PORT_S g_TFTPPorts[3] = 
{
	{69,0},
	{21,0},
	{2400,0}
};
*/
int g_iTftpCurPort;

BOOLEAN g_bTFTPNeedCancel;
BOOLEAN g_bTFTPXferInProcess;

TFTP_LOCATION_S g_TFTPLocationParams;
MSG_Q_ID MsgQTFTP_DOWNLOADFILE;

int Task_TFTP_Main_ID;
int Task_TFTP_Upgrade_ID;
int Task_TFTP_DOWNLOADFILE_ID;

CFG_ITEM_S g_TFTPBinLoct[TFTP_CONFIG_ITEMS_MAX];
BOOLEAN g_TftpManualUp;
BOOLEAN g_TftpConfigUp;
BOOLEAN g_TftpFirmwareUp;
int g_TftpDhcpStatus;

time_t	g_TftpErrTime;

//unsigned char g_test_data1[65536];
//unsigned char g_test_data2[65536];

/* This function has not been used, just for compiler*/
VOID TftpMmiSetAnswer(BOOLEAN bAccept)
{
	return;
}
VOID TftpMmiSetCancel()
{
	if ((TRUE == g_TftpFirmwareUp) || (TRUE == g_TftpManualUp))
	{
		g_bTFTPNeedCancel = TRUE;
	}
}
static STATUS Init_TFTPMsgQue()
{
	MsgQTFTP_DOWNLOADFILE = msgQCreate(TFTP_DOWNLOADFILE_QUEUE_LEN,TFTP_DOWNLOADFILE_MSG_LEN,MSG_Q_FIFO);
	if(NULL == MsgQTFTP_DOWNLOADFILE)
	{
		TFTPLOG(" TFTP Init_TFTPMsgQue Failed\n");
		return ERROR;
	}
	return OK;
}

VOID TFTPDhcpSetStatus(int iStatus) /*0: DHCP_OK  -1: DHCP_ERR*/
{
	g_TftpDhcpStatus = iStatus;
}

int TFTPDhcpGetStatus()
{
	return g_TftpDhcpStatus;
}

int TFTPWriteLog(int iLogType)
{
	char temp[400];

	TFTPLOG("TFTP begain Writing TFTP log \n");
	if (TFTP_LOG_CONFIGFILE == iLogType)
	{
		strcpy(temp,"TFTP Start Configuration file upgrade: ");
		strcat(temp,g_TFTPLocationParams.pConfigSrvFQDN);
		strcat(temp,g_TFTPLocationParams.pConfigFileName);
	}
	else if (TFTP_LOG_FIRMWAREFILE == iLogType)
	{
		strcpy(temp,"TFTP Start Firmware file upgrade: ");
		strcat(temp,g_TFTPLocationParams.pFirmwareSrvFQDN);
		strcat(temp,g_TFTPLocationParams.pFirmwareFilePath);
		strcat(temp,g_TFTPLocationParams.pFirmwareFileName);
	}
	local_log(2,temp);
	syslog(6,temp);
	TFTPLOG("TFTP finish Writing TFTP log \n");

	return OK;
}

void TftpRetryRemainder()
{
	time_t tTime1,tTime2;

	tTime1 = time(NULL);
	tTime2 = TftpGetRetryTime();
	if (0xFFFFFFFF == tTime2)
	{
		printf("There's no retry time in flash\n");
		return;
	}
	printf("Current time:%ld\n",tTime1);
	printf("Retry time:%ld,size:%ld\n",tTime2,sizeof(time_t));
	if (tTime1 < tTime2)
	{
		printf("Current time less than retry time\n");
		return;
	}
	printf("Remainder time(.min):%d\n",(int)(tTime1-tTime2)/60);
}

STATUS TftpCleanRetryTimer()
{
	g_bTFTPRetry = TFTP_RETRY_NONE;
	g_TftpErrTime = 0;
	if (0xFFFFFFFF == TftpGetRetryTime())
	{
		return OK;
	}
	TFTPLOG("TFTP clean the retry timer\n");
	return TftpSetRetryTime((time_t)0xFFFFFFFF);
}

void TftpShowLoctParam()
{
	printf("TftpShowLoctParam: \n");
	printf("config server:%s\n",g_TFTPLocationParams.pConfigSrvFQDN);
	printf("config file name:%s\n",g_TFTPLocationParams.pConfigFileName);
	printf("config file key:%s\n",g_TFTPLocationParams.pEncreptionKey);
	printf("firmware server:%s\n",g_TFTPLocationParams.pFirmwareSrvFQDN);
	printf("firmware path:%s\n",g_TFTPLocationParams.pFirmwareFilePath);
	printf("firmware name:%s\n",g_TFTPLocationParams.pFirmwareFileName);
	printf("config update protocol:%s\n",g_TFTPLocationParams.cProto?"http":"tftp");
	printf("firmware update protocol:%s\n",g_TFTPLocationParams.fProto?"http":"tftp");
	printf("config server port:%d\n",g_TFTPLocationParams.cHttpPort);
	printf("firmware server port:%d\n",g_TFTPLocationParams.fHttpPort);
}

VOID TFTP_init()
{
	TFTPLOG(" TFTP TFTP_init \n");
	if (ERROR == Init_TFTPMsgQue())
		return;
	
	g_TftpDhcpStatus = -1;
	Task_TFTP_DOWNLOADFILE_ID = TFTPCreateTask("Tftp download file",(FUNCPTR)TFTPDownloadFileTask,192,0x5000,0);
	Task_TFTP_Main_ID = TFTPCreateTask("Tftp Main",(FUNCPTR)TFTP_Main,195,0x1000,0);
	
	return;
}
VOID TFTP_Main()
{
	time_t	tOldTime1,tNewTime1;
	time_t	tNewTime2;
	time_t	tOldTime3,tNewTime3;
	
	BOOLEAN bTftpFirstTime=TRUE;
	int iInterval;
	BOOLEAN bAfterTenMins=FALSE;
#if 1
	setCurTFTPPort(69);
	if (ERROR == TGetCurLoctParams())
	{
		TFTPLOG("TFTP TGetCurLoctParams error \n");
		return ;
	}

	tOldTime3 = tOldTime1 = time(NULL);
	g_TftpErrTime =  TftpGetRetryTime();
	if (0xFFFFFFFF != g_TftpErrTime)
	{
		TFTPLOG("TFTP found there's firmware downloading error time:%d\n",(unsigned int)g_TftpErrTime);
		g_bTFTPRetry = TFTP_RETRY_FIRMWARE;
	}
	while (1)
	{
		taskDelay(100);
		tNewTime1 = time(NULL);
		if (protocol_config_get(&iInterval,LOCT_Provisioning_ResyncPeriod))
			iInterval = 30;
		iInterval *= 60;
		if ((tNewTime1 >= tOldTime1) && ((tNewTime1-tOldTime1) >= iInterval))
		{
			if (0 == TFTPDhcpGetStatus())
			{
				TFTPLOG("TFTP resync timer arrival\n");
				bTftpFirstTime = FALSE;
				TFTPDownloadFile(TFTP_GET_CONFIGFILE);
				tOldTime1 = time(NULL);
			}
			continue;
		}
		else if (tNewTime1 <  tOldTime1)
		{
			TFTPLOG("TFTP_Main resync new time < old time \n");
			tOldTime1 = time(NULL);
			continue;
		}
		if (TRUE == bTftpFirstTime)
		{
			if (0 == TFTPDhcpGetStatus())
			{
				TFTPLOG("TFTP first timer arrival\n");
				bTftpFirstTime = FALSE;
				TFTPDownloadFile(TFTP_GET_CONFIGFILE);
			}
			continue;
		}

		if (g_bTFTPRetry != TFTP_RETRY_FIRMWARE)
			continue;

		tNewTime3 = time(NULL);
		if ((tNewTime3>=tOldTime3) && ((tNewTime3-tOldTime3)>600) && ((tNewTime3-tOldTime3)<=1200))
		{
			bAfterTenMins = TRUE;
		}
		else if((tNewTime3>=tOldTime3) && ((tNewTime3-tOldTime3)>1200))
		{
			TFTPLOG("TFTP_Main 10 minutes new time - old time > 20 minutes\n");
			tOldTime3 = time(NULL);
			continue;
		}
		else if (tNewTime3 < tOldTime3)
		{
			TFTPLOG("TFTP_Main 10 minutes new time < old time \n");
			tOldTime3 = time(NULL);
			continue;
		}
		if (bAfterTenMins != TRUE)
			continue;

		if (protocol_config_get(&iInterval,LOCT_Provisioning_RetryDelay))
			iInterval = 10;
		iInterval *= 60;
		tNewTime2 = time(NULL);
		if ((tNewTime2>=g_TftpErrTime) &&((tNewTime2-g_TftpErrTime)>iInterval))
		{
			if (0 == TFTPDhcpGetStatus())
			{
				TftpCleanRetryTimer();
				TFTPDownloadFile(TFTP_GET_FIRMWAREFILE);
			}
			continue;
		}
		
	}
#endif
}

void TFTPUpgradeTask()
{
	//int status;
	g_bTFTPNeedCancel = FALSE;
	g_TftpManualUp = TRUE;
	TFTPUpgradeProc();
	g_TftpManualUp = FALSE;
	TFTP_Send_MMIMsg(TFTP_MMI_OVER);
	TFTPLOG("TFTPUpgradeTask exit \n");
	Enter_Sleep(SLEEP_TFTP);
}

void TFTPDownloadFileTask(int iParam)
{
	int newMsg;
	BOOLEAN bReboot=FALSE;
	BOOLEAN bChanged;
	
	while (1)
	{
		if (ERROR == msgQReceive (MsgQTFTP_DOWNLOADFILE, (char *) &newMsg, sizeof(int), WAIT_FOREVER))
		{
			TFTPLOG("TFTPDownloadFileTask  msgQReceive error \n");
			continue;
		}

		if (TRUE == isMMIInPowerOff())
			continue;
		if (TRUE == g_TftpManualUp)
			continue;
		
		if (TFTP_GET_CONFIGFILE == newMsg)
		{
			//Exit_Sleep(SLEEP_TFTP);
			g_TftpConfigUp = TRUE;
			TFTPLOG("TFTPDownloadFileTask  start config upgrade \n");
			TFTPConfigUpgradeProc(&bChanged);
			g_TftpConfigUp = FALSE;
			TFTPLOG("TFTPDownloadFileTask  finish download the config file \n");
			if (TRUE == bChanged)
			{
				bReboot =TRUE;
			}
			if (FALSE == isMMIInIdle())
			{
				TFTPLOG("TFTPDownloadFileTask for download Firmware file,but MMI is not in IDLE state \n");
			}
			else
			{
				if ((TRUE == TFirmwareIsChanged()) && (TFTP_RETRY_FIRMWARE != g_bTFTPRetry))
				{
					TFTPLOG("TFTPDownloadFileTask  firmware should be upgraded, so send firmware signal\n");
					TFTPDownloadFile(TFTP_GET_FIRMWAREFILE);
				}
				else if (TRUE == bReboot)
				{
					TFTPLOG("TFTPDownloadFileTask  firmware need not be upgraded, so reboot \n");
					taskDelay(5);
					reboot(0);
					return;
				}
				
			}
			Enter_Sleep(SLEEP_TFTP);
			continue;
		}
		else if (TFTP_GET_FIRMWAREFILE == newMsg)
		{
			if (FALSE == isMMIInIdle())
			{
				TFTPLOG("TFTPDownloadFileTask for download firmware file,but MMI is not in IDLE state \n");
				continue;
			}
			if (FALSE == TFirmwareIsChanged())
			{
				TFTPLOG("TFTPDownloadFileTask for download firmware file,but firmware's version is same with the parameter \n");
				continue;
			}
			Exit_Sleep(SLEEP_TFTP);
			g_bTFTPNeedCancel = FALSE;
			g_TftpFirmwareUp = TRUE;
			TFTP_Send_MMIMsg(TFTP_MMI_RETRY);
			taskDelay(200);
			Enter_Sleep(SLEEP_TFTP);
			TFTPLOG("TFTPDownloadFileTask  start firmware upgrade \n");
			TFTPFirmwareUpgradeProc();
			TFTP_Send_MMIMsg(TFTP_MMI_OVER);
			g_TftpFirmwareUp = FALSE;
			TFTPLOG("TFTPDownloadFileTask  failed download the firmware file \n");
			g_TftpErrTime = time(NULL);
			TftpSetRetryTime(g_TftpErrTime);
			g_bTFTPRetry = TFTP_RETRY_FIRMWARE;
			if ((TRUE == bReboot) && (isMMIInPowerOff() == FALSE))
			{
				TFTPLOG("TFTPDownloadFileTask  phone's parameter changed, so reboot phone \n");
				taskDelay(5);
				reboot(0);
			}
			Enter_Sleep(SLEEP_TFTP);
		}
		else
		{
			TFTPLOG("TFTPDownloadFileTask  msgQReceive undefined message:%d \n",newMsg);
			continue;
		}
		
	}
	
}

STATUS TFTPUpgrade()
{
	if (TRUE == g_TftpConfigUp)
	{
		TFTPLOG("TFTP In auto config upgrade, so can't do manual upgrade\n");
		TFTP_Send_MMIMsg(TFTP_MMI_FAIL_OTHER);
		return ERROR;
	}
	Exit_Sleep(SLEEP_TFTP);
	TFTPLOG("TFTP upgrade start ...\n");

	Task_TFTP_Upgrade_ID = TFTPCreateTask("TFTP upgrade",(FUNCPTR)TFTPUpgradeTask,190,0x5000,0);
	return OK;
}

STATUS TFTPRetry()
{
	return OK;
}

VOID TFTPDownloadFile(int iFileType)
{
	int dMsgCount;

	TFTPLOG("TFTPDownloadFile send a signal to start a find file process, file type:%d\n",iFileType);
	if (ERROR == msgQSend( MsgQTFTP_DOWNLOADFILE, (char*)&iFileType, 
							sizeof(int), NO_WAIT,MSG_PRI_NORMAL ))
   	 {
		dMsgCount = msgQNumMsgs(MsgQTFTP_DOWNLOADFILE);
		if(TFTP_DOWNLOADFILE_QUEUE_LEN <= dMsgCount)
		{
			TFTPLOG("MsgQTFTP_DOWNLOADFILE message queue is full \n");
			if ((taskIdVerify(Task_TFTP_DOWNLOADFILE_ID)  == OK) && (taskIsSuspended(Task_TFTP_DOWNLOADFILE_ID)))
			{
				TFTPLOG("I think TFTP download file task was dead now,restart it\n");
				taskDelete(Task_TFTP_DOWNLOADFILE_ID);
				Task_TFTP_DOWNLOADFILE_ID = TFTPCreateTask("Tftp download file",(FUNCPTR)TFTPDownloadFileTask,192,0x5000,0);
			}
		}
   	 }
	
}

int TFTPCreateTask(char *taskId, FUNCPTR taskProc,
                						int priority, int stackSize,int iParam)
{
		return taskSpawn(taskId,priority,(int)NULL,stackSize,(FUNCPTR)taskProc,
			  		(int)iParam, (int)NULL, (int)NULL, (int)NULL, (int)NULL,
                  	  			(int)NULL, (int)NULL, (int)NULL, (int)NULL, (int)NULL);
}


VOID test_getaddr(char* pSrvName)
{
	struct addrinfo     serverHints;
    	struct addrinfo *   pServerResults = NULL;
	struct addrinfo *   pServerResult1;
	struct sockaddr_in	sockAddr;

	bzero ((char *) &serverHints, sizeof (struct addrinfo));
	bzero ((char *) &sockAddr, sizeof (struct sockaddr_in));
	serverHints.ai_family = AF_INET;
        	serverHints.ai_flags = AI_CANONNAME ;
	if (getaddrinfo (pSrvName, "tftp", &serverHints, &pServerResults))
        	{
       		TFTPLOG("tftpPeerSet %s: unknown host.", pSrvName);
	}
	pServerResult1 = pServerResults;
	do
          {
            	if (pServerResults->ai_family == AF_INET)
               	{
                 		bcopy ((char *) (struct sockaddr_in *)  (pServerResults->ai_addr),
                        			(char *) (struct sockaddr_in *) &(sockAddr),
                         			sizeof (struct sockaddr_in));
                		break;
                 	}
            	pServerResults = pServerResults->ai_next;
        	} while (pServerResults);
    	freeaddrinfo (pServerResult1);

	TFTPLOG("!!!!!!getaddrinfo %s\n",inet_ntoa(sockAddr.sin_addr));
}



STATUS TFTPResolv(char* pHostName,char* pIpAddr)
{
	unsigned long int addr;
	struct hostent *hp=NULL;
	char *pbuf=NULL;

	if ((NULL == pHostName) ||(NULL == pIpAddr))
		return ERROR;

	if (*pHostName == '\0')
	{
		TFTPLOG("TFTPResolv pHostName == ""\n");
		return ERROR;
	}
	if ((int) (addr = inet_addr (pHostName)) != -1)
	{
		strcpy(pIpAddr,pHostName);
		return OK;
	}
	pbuf = malloc(513);
	if (NULL == pbuf)
		return ERROR;
	memset(pbuf,0,513);
	
	hp = resolvGetHostByName (pHostName, pbuf, 512);
	if (NULL == hp)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -