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

📄 tftpupgrade.c

📁 wi-fi手机原代码
💻 C
📖 第 1 页 / 共 4 页
字号:
	{
		FLASH_DBG_PRINT("flashup: ERROR erasing sector %d, base addr: %08X\n", sec, (UINT32)pAddr);
		return ERROR;
	}
	return OK;
}

/*****************************************************************************
 * Function          : tftpCodeGet
 *
 * Prototype         : STATUS tftpCodeGet(int  flashDev,
 *										  char *host,
 *                                        char *filename)
 *                                                                     
 * Description       : - Connect to TFTP server.
 *                     - Get code from binary file.
 *                     - Save code in Flash.
 *
 *
 * Input parameters  : int  flashDev : Flash device to write to. (0 or 1 is supported for Hornet)
 *					   char *host    : TFTP server name or address
 *                     char *filename: file name, including path
 *                    
 * Output parameters : none
 *
 * Return value      : OK or ERROR
 *                     
 * Comments          :
 *
 ******************************************************************************/

STATUS TftpCodeGet(char *host, char *ipAddr,char *filename,int fileType/*0-bin  1-compress*/)
{
#define BUFFERSIZE	512	/* TFTP packet size */
#undef	MAX_PROGRAM_LENGTH
#define MAX_PROGRAM_LENGTH 65536

    int		DataFd;
    int		num;
	unsigned char	buf[BUFFERSIZE+2];
	FLASH_DEF		*flashBasePtr;
	int				sec=0;
	int				sectorSize;
	int				buf_offset;
	unsigned int	sectorOffset, temp;
  	unsigned char	*buf64K;
	STATUS			status = OK;

	int		TotalBytes = 0;
	char 	secCount=0;
	int 		flashDev=0;
	int		iErrNo;
	int tftpPort = getCurTFTPPort();
#if 0
	/* If we are running from flash 1 or from RAM, we'll flash the image to flash 2 */
	/* If we are running from flash 2, we'll flash the image to flash 1 */
	unsigned int funcAddr = (unsigned int)tftpCodeGet;
	temp = (unsigned int)flashInfo[1].flashBase;
	if((funcAddr >= temp) && (funcAddr < (temp + flashInfo[1].flashSize))
		flashDev = 0;
	else
		flashDev = 1;
#endif

    /* get the flash base */
    flashBasePtr = flashSectorAddr( 0, 0 );
    if( (FLASH_DEF *) ~0 == flashBasePtr )
    {
        DBG_PRINT( "flashUp: PROGRAM Addr ERROR: Abs Address %08X\n", (unsigned int)flashBasePtr );
        return ERROR;
    }
	if(fileType == 0) 
	{
		/* add in the text offset */
		flashBasePtr += (TFTP_BIN_IMAGE_ADDR / FLASH_WIDTH);
		secCount = 8;/* Base+0x50000 , Base+0x580000*/
	}
	else if (fileType == 1)
	{
		/* add in the text offset */
		flashBasePtr += (TFTP_COMPRESS_IMAGE_ADDR / FLASH_WIDTH);
		secCount = 36;/* Base+0x580000 , Base+0x7c0000*/
	}
	else
	{
		DBG_PRINT( "ERROR file type\n");
		return ERROR;
	}
	/* get the base sector number of text */
	sec = flashSectorNum( flashBasePtr );
	if( ~0 == sec )
	{
		DBG_PRINT( "flashUp: PROGRAM Sector ERROR: Sector #%3u, Abs Address %08X\n",
			sec, (unsigned int)flashBasePtr );
		return ERROR;
	}
#if 0
	TFTP_Send_MMIMsg(TFTP_MMI_ERASING_FIRMWARE);
	/* erase the image */
	if(flashEraseImage(0, sec, (sec + secCount-1)) == ERROR)
	{
		DBG_PRINT("ERROR erasing flash\n");
		return ERROR;
	}
	if (TRUE == g_bTFTPNeedCancel)
	{
		g_bTFTPNeedCancel = FALSE;
		TFTPLOG("TFTP process exit by user \n");
		return OK;
	}
#endif
	TFTP_Send_MMIMsg(TFTP_MMI_CONNECTING_FIRMWARE);
	buf64K = (unsigned char *)malloc(65536);	/* allocate 64KB for one sector of data */
	if(buf64K == NULL) 
		return ERROR;
	
	while (1)
	{
	g_bTFTPXferInProcess = TRUE;
	TFTPWriteLog(TFTP_LOG_FIRMWAREFILE);
	if (g_TFTPLocationParams.fProto == 1)
	{
		tftpPort = g_TFTPLocationParams.fHttpPort;
	}
    	if (dxXfer(host, ipAddr,
				 tftpPort,
				 filename, 
				 "GET",
                 			"binary", 
				 &DataFd,
				 g_TFTPLocationParams.fProto) == ERROR)
    	{
        		DBG_PRINT("DX transfer initiation failed.\n");
        		return (ERROR);
    	}
	TFTPLOG("After dxXfer ipAddr:%s Server port:%d Firmware file:%s\n",host,tftpPort,filename);
	g_bTFTPXferInProcess = FALSE;
	


    /*-------------------------------------------------------*
     * Get binary code by blocks of 1024 bytes.
     * Save in Flash at 'Code2' area.
     *-------------------------------------------------------*/

	sectorOffset  = 0;		/* offset in the sector */
    	sectorSize = flashSectorSize( 0, sec );
	buf_offset = 0;			/* offset in the buffer (buf64K) */

    	while ((num = read(DataFd, buf, BUFFERSIZE)) > 0)
    	{
        /*
         * The Flash will be programmed word by word.
         * If the number of read bytes is odd then 0
         * is added to the buffer buf[] so that the number of
         * words is a half the number of bytes.
         *
         */
	/*	DBG_PRINT("Got %d of bytes, total bytes: %d, 0ffset=%d\n", num, TotalBytes, offset); */
		hwFeedWDT();
		Exit_Sleep(SLEEP_TFTP);
		if (TRUE == g_bTFTPNeedCancel)
		{
			g_bTFTPNeedCancel = FALSE;
			TFTPLOG("provisioning process exit by user \n");
			free(buf64K);
			close(DataFd);
			return OK;
		}
		if ((0 == TotalBytes) && (0 == buf_offset))
		{
			TFTP_Send_MMIMsg(TFTP_MMI_DOWNLOADING_FIRMWARE);
		}
		if( (buf_offset + num) >= MAX_PROGRAM_LENGTH)
		{
			temp = MAX_PROGRAM_LENGTH - buf_offset;
			memcpy((buf64K + buf_offset), buf, temp);	/* fill up the buffer */

			if (ERROR ==TftFlashEraseSector(sec))
			{
				TFTPLOG("TftFlashEraseSector error\n");
				free(buf64K);
				close(DataFd);
				return ERROR;
			}
			TFTPLOG("Programming Flash %d, sector=%d, sectorOffset=%08X\n", flashDev, sec, sectorOffset);
			if(flashupProgramEx(0, sec, FLASH_CAST buf64K, MAX_PROGRAM_LENGTH, sectorOffset) == ERROR)
			{
				TFTPLOG("flashupProgramEx error\n");
				free(buf64K);
				close(DataFd);
				return ERROR;
			}
		
			TotalBytes += MAX_PROGRAM_LENGTH;

			sectorOffset += MAX_PROGRAM_LENGTH;

			/* adjust the unwritten image length */
			buf_offset = num - temp;
			memcpy(buf64K, &buf[temp], buf_offset);

			/* Advance to next sector */
			if(sectorOffset >= sectorSize)
			{
				sectorOffset = 0;	/* we assume that sectorSize is multiple of MAX_PROGRAM_LENGTH */
				sec++;
				sectorSize = flashSectorSize( 0, sec );
			}
		}
		else
		{
			memcpy((buf64K + buf_offset), buf, num);		/* copy all the data to the temp buffer */
			buf_offset += num;
		}
    	}

	if(buf_offset > 0)
	{
		TotalBytes += buf_offset;
		if (buf_offset % 2 != 0)
		{
			buf64K[buf_offset] = 0xff;
			buf_offset ++;
		}
		if (ERROR ==TftFlashEraseSector(sec))
		{
			TFTPLOG("TftFlashEraseSector error\n");
			free(buf64K);
			close(DataFd);
			return ERROR;
		}
		TFTPLOG("Flashing last sector %d, length = %d\n", sec, buf_offset);
		if(flashupProgramEx(0, sec, FLASH_CAST buf64K, buf_offset, sectorOffset) == ERROR)
		{
			TFTPLOG("flashupProgramEx error\n");
			free(buf64K);
			close(DataFd);
			return ERROR;
		}
	}

	TFTPLOG("Got total bytes: %d\n", TotalBytes);

   	/*----------------------------------------------------*
    	 * Close file and sockets.
     	*----------------------------------------------------*/    
    	close(DataFd);
	iErrNo = dxGetErrNo();
	if (iErrNo != DX_ERR_NONE)
	{
		if (TFTP_ERR_PORT_BLOCK == iErrNo)
		{
			tftpPort = getNextTFTPPort(tftpPort);
			if (0 == tftpPort)
			{
				TFTPLOG("DX all port(69,21,2400) are be block at the current gateway\n");
				free(buf64K);
				return ERROR;
			}
			TFTPLOG("DX Current port maybe was blocked, I will try the next port \n");
			continue;
		}
		 else if (TFTP_ERR_TRANSFER == iErrNo)
		{
			TFTPLOG("DX firmware file error\n");
			g_bTFTPRetry = TFTP_RETRY_FIRMWARE;
		}
		 else if (TFTP_ERR_NOT_FOUND == iErrNo)
		{
			setCurTFTPPort(tftpPort);
			TFTPLOG("TFTP File not found\n");
		}
		/* timeout because phone can't get the seconad or next packet, error because other error */
		else if (HTTP_ERR_PORT_BLOCK == iErrNo)
		{
			TFTPLOG("HTTP port block\n");
		}
		else if (HTTP_ERR_NOT_FOUND == iErrNo)
		{
			TFTPLOG("HTTP file not found\n");
		}
		else if (HTTP_ERR_TRANSFER == iErrNo)
		{
			TFTPLOG("HTTP Transfer file error\n");
		}
		else
		{
			TFTPLOG("Fail unknow reason\n");
		}
		free(buf64K);
		return (ERROR);
    	}
    	free(buf64K);
	break;
	}
	//if(flashDev == 1)
	{
		if(status == OK)
		{
			
			if (fileType == 0)
			{
				//flashupReboot(0);
				//flashBasePtr = flashSectorAddr(0, 0);	/* get the base address of flash 1 */
				//sysStartImage((UINT32)(flashBasePtr) + TFTP_BIN_IMAGE_ADDR);
				TFTPLOG("Decompress Bin image download sucessfully\n");
			}
			else if (fileType == 1)
			{
				TFTPLOG("Firmware image download sucessfully\n");
				//TftpflashupCompressSize(TotalBytes);
				/*
				TFTPConfigSet(LOCT_TFTP_FirmwareUpgradeServerFQDN,(void *)g_TFTPLocationParams.pFirmwareSrvFQDN);
				TFTPConfigSet(LOCT_TFTP_FirmwareUpgradePath,(void *)g_TFTPLocationParams.pFirmwareFilePath);
				TFTPConfigSet(LOCT_TFTP_FirmwareFileName,(void *)g_TFTPLocationParams.pFirmwareFileName);
				TFTPConfigSave();
				*/
				taskLock();
				TftpFlashupReboot(TotalBytes);

				flashBasePtr = flashSectorAddr(0, 0);	/* get the base address of flash 1 */
				sysStartImage((UINT32)(flashBasePtr) + TFTP_BIN_IMAGE_ADDR);
			}
		}
		else
		{
			TFTPLOG("ERROR: The flash update failed\n");
			return ERROR;
		}
	}

    return (OK);
}

STATUS TftpDefaultValueReset()
{
	return OK;
}
STATUS TftpSetDefaultValue(char *pPsw, char *pKey, char * pHashDir)
{
	return ERROR;
}
STATUS TftpGetDefaultValue(char *pPsw,char *pKey, char *pHashDir)
{
	return ERROR;
}

UINT32 TftpGetCompressedFileSize()
{
	UINT32			*pUint32;
	FLASH_DEF		*flashBasePtr;

	flashBasePtr = flashSectorAddr( FLASH1_DEV, 0 );
	pUint32 = (UINT32 *)flashBasePtr + FLASHUP_COMPRESSED_IMAGE_SIZE_OFFSET / sizeof(UINT32);
	return *pUint32;
}

UINT32 TftpGetMagicNumber()
{
	UINT32			*pUint32;
	FLASH_DEF		*flashBasePtr;

	flashBasePtr = flashSectorAddr( FLASH1_DEV, 0 );
	pUint32 = (UINT32 *)flashBasePtr + FLASHUP_MAGIC_OFFSET / sizeof(UINT32);
	return *pUint32;
}
#if 0
STATUS TftpAesTest()
{
	unsigned char arAesData[32] = {0xb8,0x33,0x2a,0xb8,0xf8,0x12,0xcf,0x8a,
									0xe3,0xdf,0x51,0x51,0xd9,0xd9,0x85,0x50,
									0x84,0x77,0x77,0x35,0x0d,0xbd,0x64,0xb3,
									0xc7,0x57,0x4a,0x8c,0x84,0x64,0x49,0x20};

	AES_KEY 		dkey;
	unsigned char 	iv[MAX_BLOCK_SIZE/8];

	//printf("<TFTP> encryption key: %s\n",g_TFTPLocationParams.pEncreptionKey);
	if (AES_set_decrypt_key( (unsigned char *)"vonage", 256, &dkey ))
	{
		TFTPLOG("TFTP Create AES dekey error\n");
		return ERROR;
	}
	memcpy(g_test_data2,dkey.rd_key,244);
	memset(iv,0,sizeof(iv));

	AES_cbc_encrypt(arAesData,g_test_data1,32,&dkey,iv,AES_DECRYPT);
	return OK;
}
#endif
BOOLEAN TftpTxtIsValid(char *pTxtSrc,int iStrLen)
{
	int i;

	if ( iStrLen <= 0)
		return FALSE;
	
	for (i=0;i<iStrLen;i++)
	{
		if (isDisplayChar(pTxtSrc[i]) != TRUE)
			return FALSE;
	}
	return TRUE;
}
static int TDemoMenuSize(DemoMenu *p)
{
	int i;
	const char *stg;

	// Sanity check the pointer
	if (p == NULL)
		return 0;
	// A blank prompt string indicates the end of the menu
	for (i = 0; ; i++)
	{
		// End of structure is denoted by empty string
		stg = (&p[i])->string;
		if (*stg == '\0')
			break;
	}
	return (i);
}
STATUS TftpTxtParse(char *pTxtSrc, CFG_ITEM_S *pBinDest, int *pBinDestLen)
{
	char * pTempSrc;
	char * pTxtRet;
	LOCT_TXT_S loctTxt;
	int i,k,j;
	int iDemoMenuSize;

	if (NULL == pTxtSrc || NULL == pBinDest || NULL == pBinDestLen)
		return ERROR;

	iDemoMenuSize = TDemoMenuSize((DemoMenu *) &main_config[0])-2;
	if (iDemoMenuSize <= 0)
	{
		TFTPLOG("TftpTxtParse  TDemoMenuSize <= 0\n");
		return ERROR;
	}
	TFTPLOG("TftpTxtParse  TDemoMenuSize: %d\n",iDemoMenuSize);
	i = 0;
	*pBinDestLen = 0;
	pTempSrc = SkipEnterChars(pTxtSrc);
	while ((pTempSrc != NULL) && (*pTempSrc != '\0'))
	{
		pTxtRet = TGetCurLine(pTempSrc,&loctTxt);
		if (NULL == pTxtRet)
			break;
		
		if (strcmp(loctTxt.arKeyName,"Reserved Parameter") == 0)
		{
			TFTPLOG("TftpTxtParse  meet a Reserved Parameter \n");
			pTempSrc = SkipEnterChars(pTxtRet);
			continue;
		}
		for(k=0;k<iDemoMenuSize;k++)
		{
			int menuSize;
			DemoMenu* pSubMen;
			int choice;
			
			menuSize = TDemoMenuSize((DemoMenu*)main_config[k].deflt)-1;
			pSubMen= (DemoMenu*)main_config[k].deflt;
			for(j=0;j<menuSize;j++)
			{
				if(strcmp(loctTxt.arKeyName,pSubMen[j].string)==0)
				{
					choice = k<<4;
					choice += j;
					pBinDest[i].uiLoctIdx = choice;
					strcpy((char *)pBinDest[i].arData,loctTxt.arKeyValue);
					i ++;
					if (TFTP_CONFIG_ITEMS_MAX == i)
					{
						*pBinDestLen = i;
						TFTPLOG("TFTP In configuration file there are more than 300 items, the following will be discarded\n");
						return OK;
					}
					break;
				}
			}
			if (j != menuSize)
				break;
		}
		pTempSrc = SkipEnterChars(pTxtRet);
	}

	*pBinDestLen = i;
	return OK;
}


static char * TGetCurLine(char *pTxtSrc,LOCT_TXT_S *pTxtDest)
{
	char *pTxtRet,*pTxtTemp;

	pTxtTemp = pTxtSrc;
	pTxtRet = getKeyName(pTxtTemp);
	if (NULL == pTxtRet)
		return NULL;
	
	strncpy(pTxtDest->arKeyName,pTxtTemp,pTxtRet-pTxtTemp);
	pTxtDest->arKeyName[pTxtRet-pTxtTemp] = '\0';
	pTxtTemp = pTxtRet+1;
	pTxtRet = getKeyValue(pTxtTemp);
	if (NULL == pTxtRet)
		return NULL;

	strncpy(pTxtDest->arKeyValue,pTxtTemp,pTxtRet-pTxtTemp);
	pTxtDest->arKeyValue[pTxtRet-pTxtTemp] = '\0';

	return pTxtRet+1;
}

static char *getKeyName(char *pTxtSrc)
{
	int i=0;
	
	while ((*pTxtSrc != '=') && (*pTxtSrc != '\0') && (i<128))
	{
		pTxtSrc ++;
		i ++;
	}

	if ((128 == i) || (*pTxtSrc == '\0'))
	{
		return NULL;
	}
	
	return pTxtSrc;
}

static char *getKeyValue(char *pTxtSrc)
{
	int i=0;

#ifdef _ONDOS_
	while ((!((*pTxtSrc == 0x0d) && (*(pTxtSrc+1) == 0x0a))) && (*pTxtSrc != '\0') && (i<128))
	{
		pTxtSrc ++;
		i ++;
	}
#else
	while ((!(*pTxtSrc == 0x0a) ) &&(!(*pTxtSrc == 0x0d))&& (*pTxtSrc != '\0') && (i<128))
	{
		pTxtSrc ++;
		i ++;
	}
#endif
	return pTxtSrc;
}
static char *SkipEnterChars(char *pTxtSrc)
{
#ifdef _ONDOS_
	while (((*pTxtSrc == 0x0d) && (*(pTxtSrc+1) == 0x0a)))
	{
		pTxtSrc += 2;
	}
#else
	while( (*pTxtSrc == 0x0a) || (*pTxtSrc == 0x0d))
	{
		pTxtSrc ++;
	}
#endif
	if ('\0' == *pTxtSrc)
		return NULL;
	
	return pTxtSrc;
}
static BOOLEAN isDisplayChar(char c)
{
	if ((c>=0x20 && c<0x7f) || (0x0d == c) || (0x0a == c))
		return TRUE;

	return FALSE;
}

static BOOLEAN isMMIInIdle()
{
	if (((_IDLE_STANDBY == NormalEntity->pStateTbl->srcState) ||
		(_IDLE_SCREENSAVER == NormalEntity->pStateTbl->srcState)) && 
	      (_SYS_STANDBY == SysEntity->pStateTbl->srcState))
	{
		return TRUE;
	}

	return FALSE;
}

static BOOLEAN isMMIInPowerOff()
{
	if (_SYS_POWEROFF == SysEntity->pStateTbl->srcState)
	{
		return TRUE;
	}
	return FALSE;
}



⌨️ 快捷键说明

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