📄 tftpupgrade.c
字号:
{
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 + -