?? xmodem.c
字號:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "ct_uart.h" //Marlin 20060523 Add
#include "ct_drammap.h"
//#include "types.h"
#include "xmodem.h"
#include "db_defs.h"
#include "dvb_sys.h"
#include "dvb_flash.h"
#include "dvb_fp.h" //Marlin 20060523 Add
#include "db_api.h"
#include "mpegcrc32.h"
#include "ap_model.h"
/*****************************xmodem****************************************************/
#if 1 // SLSLSL
#define CT216_AFTA_DRAM_START 0x40050000
#else
#define CT216_AFTA_DRAM_START 0x40400000
#endif
#if 0
#define xmrecv_debug(p) printf p
#else
#define xmrecv_debug(p)
#endif
#if 1
#define xmrecv_message(p) printf p
#else
#define xmrecv_message(p)
#endif
#if 1
#define xmsend_message(p) printf p
#else
#define xmsend_message(p)
#endif
//Marlin 20060523 Add
typedef enum
{
EN_BURN_UNKNOWN, /* Unknown image */
EN_BURN_OVERALL, /* Burn image from bank 1 (includes database banks). */
EN_BURN_DATABASE_ONLY, /* Burn image to database banks only. */
EN_BURN_DEFAULTDB_ONLY, /* Burn image to default data bank only. */
EN_BURN_CWDATABASE_ONLY, /* Burn image to CW database bank only */
EN_BURN_LOGO_ONLY, /* Burn image to logo banks only */
EN_BURN_WICE_OVERALL, /* Burn image from bank 0 */
EN_BURN_CODE_ONLY, /* Burn image from bank 1 (depends on image length) */
EN_BURN_CODE_CWDB, /* Burn image from bank 1 (not includes database banks) and to CW database bank. */
EN_BURN_DATABASE2_ONLY /* Burn image to database banks only, but not includes dummy EEPROM data. */
} EN_BURN_TYPE;
/*****************/
/* XMODEM parameters */
#define XMODEM_MAX_ERRORS 10
/*****************************xmodem***************************************/
static bool8 user_abort(void)
{
u8 u8Key;
if(DVB_DetectKey() == FALSE) return FALSE;
u8Key = DVB_GetKey();
return TRUE;
}
u16 readbyte(u32 msec)
{
for(msec *= 250; msec > 0; msec--)
{
if(CT_UART_Data_Ready() == DRV_OK)
return CT_UART_ReadChar_NoCheck();
if(user_abort() == TRUE) return ABORT;
}
return TIMEOUT;
}
#ifdef DBTOOL_ENABLE //edited for DB TOOL by Carson 2008/01
u16 readbyte_no_abort(u32 msec)
#else
static u16 readbyte_no_abort(u32 msec)
#endif
{
for(msec *= 6000; msec > 0; msec--)
{
if(CT_UART_Data_Ready() == DRV_OK)
return CT_UART_ReadChar_NoCheck();
}
return TIMEOUT;
}
#ifdef DBTOOL_ENABLE //edited for DB TOOL by Carson 2008/01
u16 readbuf(u8 *buffer, u16 length, u32 msec)
#else
static u16 readbuf(u8 *buffer, u16 length, u32 msec)
#endif
{
u16 i, data;
for(i = 0; i < length; i++)
{
data = readbyte_no_abort(msec);
/* the correct data is 8-bits, over 8-bits means error code. */
if(data & 0xFF00) return data;
buffer[i] = (u8)data;
}
return 0;
}
#ifdef DBTOOL_ENABLE //edited for DB TOOL by Carson 2008/01
u16 sendbyte(u8 data)
#else
static u16 sendbyte(u8 data)
#endif
{
CT_UART_PutChar(data);
return 0;
}
#ifdef DBTOOL_ENABLE //edited for DB TOOL by Carson 2008/01
u16 sendbuf(u8 *buffer, u16 length)
#else
static u16 sendbuf(u8 *buffer, u16 length)
#endif
{
u16 i;
bool8 b_abort = FALSE;
/* even user abort the transfer, send one package completely. */
for(i = 0; i < length; i++)
{
sendbyte(buffer[i]);
if(user_abort() == TRUE) b_abort = TRUE;
}
if(b_abort == TRUE)
{
return ABORT;
}
else
{
return 0;
}
}
#ifdef DBTOOL_ENABLE
u16 xmodem_cal_chksum(bool8 b8XModem1K, u8 *pu8Data, u16 u16Len)
#else
static u16 xmodem_cal_chksum(bool8 b8XModem1K, u8 *pu8Data, u16 u16Len)
#endif
{
u16 i, chksum;
u8 j;
for(i = chksum = 0; i < u16Len; i++)
{
chksum = chksum ^ pu8Data[i] << 8;
for(j = 0; j < 8; j++)
{
//re-write chksum = (chksum & 0x8000) ? (chksum << 1 ^ 0x1021) : (chksum << 1);
if(chksum&0x8000)
{
chksum = (chksum << 1 ^ 0x1021);
}
else
{
chksum = (chksum << 1);
}
}
}
if(!b8XModem1K)
{
chksum >>= 8;
}
return chksum;
}
#ifdef DBTOOL_ENABLE
bool8 xmodem_crc_check(bool8 b8xmodem1k, u8 *pu8data, u16 u16length)
#else
static bool8 xmodem_crc_check(bool8 b8xmodem1k, u8 *pu8data, u16 u16length)
#endif
{
u16 u16crcchk, u16crcsum;
// re-write >> u16crcchk = b8xmodem1k ? (pu8data[u16length] << 8) + pu8data[u16length + 1] : pu8data[u16length];
if(b8xmodem1k == TRUE)
{
u16crcchk = (pu8data[u16length] << 8) + pu8data[u16length + 1];
}
else
{
u16crcchk = pu8data[u16length];
}
u16crcsum = xmodem_cal_chksum(b8xmodem1k, pu8data, u16length);
return(u16crcchk == u16crcsum);
}
static bool8 xmodem_flash_write(u8 u8startbank, u8 *pu8data, u32 u32length, u8 u8MaxBanks)
{
u8 u8banknum, i;
u8banknum = u32length / FLASHSRV_BYTE_MODE_BANK_SIZE;
if(u32length % FLASHSRV_BYTE_MODE_BANK_SIZE) u8banknum++;
if(u8banknum > u8MaxBanks)
{
xmrecv_debug(("\nThe image length is overflow!!\n"));
return FALSE;
}
xmrecv_debug(("\nTotal flash banks occupied by image: %d\n", u8banknum));
for(i = 0; i < u8banknum; i++)
{
xmrecv_debug(("\nBurning to bank %d ... ", u8startbank + i));
if(DVB_FlashWriteBank(u8startbank + i, (u32)pu8data) == FALSE)
{
xmrecv_debug(("failed\n"));
return FALSE;
}
xmrecv_debug(("done\n"));
pu8data += FLASHSRV_BYTE_MODE_BANK_SIZE;
// send the progress command to master STB.
sendbyte(0x20 + i);
sendbyte(0x20 + i);
sendbyte(0x20 + i);
}
xmrecv_debug(("\n\nImage file burnning succeed!!\n\n"));
return TRUE;
}
static EN_BURN_TYPE xmodem_burn_type(u8 *pu8data)
{
u32 u32temp;
if(memcmp(pu8data, "CTMODE", 6) == 0)
{
if( ((pu8data[6] + pu8data[7]) == 0x6A) &&
(pu8data[6] == (0x30 + 1)))
return EN_BURN_OVERALL;
}
else if(memcmp(pu8data, "d__B", 4) == 0)
{
u32temp = (pu8data[4] << 24) | (pu8data[5] << 16) | (pu8data[6] << 8) | pu8data[7];
if(u32temp == DVB_DBGetDigest())
return EN_BURN_DATABASE_ONLY;
}
else if(memcmp(pu8data, "default", 7) == 0)
return EN_BURN_DEFAULTDB_ONLY;
else if(memcmp(pu8data, "CTcWd__B", 8) == 0)
return EN_BURN_CWDATABASE_ONLY;
else if(memcmp(pu8data, "CT__LOgo", 8) == 0)
return EN_BURN_LOGO_ONLY;
else if(memcmp(pu8data, "CTK_WICE", 8) == 0)
return EN_BURN_WICE_OVERALL;
else if(memcmp(pu8data, DVB_GetImageHeader(), HEADER_LEN) == 0)
return EN_BURN_CODE_ONLY;
else if(memcmp(pu8data, "CTCdCwDb", 8) == 0)
return EN_BURN_CODE_CWDB;
else if(memcmp(pu8data, "d_B2", 4) == 0)
{
u32temp = (pu8data[4] << 24) | (pu8data[5] << 16) | (pu8data[6] << 8) | pu8data[7];
if(u32temp == DVB_DBGetDigest())
return EN_BURN_DATABASE2_ONLY;
}
return EN_BURN_UNKNOWN;
}
static u8 xmodem_burn_data(EN_BURN_TYPE enBurnType, u8 *pu8data)
{
u32 u32length, u32crcchk, u32crcsum;
u32 u32length2;
u32length = (u32)((pu8data[HEADER_LEN ] << 24) |
(pu8data[HEADER_LEN + 1] << 16) |
(pu8data[HEADER_LEN + 2] << 8) |
(pu8data[HEADER_LEN + 3] ));
u32crcchk = (u32)((pu8data[HEADER_LEN + u32length ] << 24) |
(pu8data[HEADER_LEN + u32length + 1] << 16) |
(pu8data[HEADER_LEN + u32length + 2] << 8) |
(pu8data[HEADER_LEN + u32length + 3] ));
u32crcsum = CRC_MPEG32(pu8data, HEADER_LEN + u32length);
if(u32crcchk != u32crcsum)
{
xmrecv_debug(("\n\nImage length=0x%08lX, CRC32[%08lX:%08lX] check failed!!\n\n", u32length, u32crcsum, u32crcchk));
return 6;
}
pu8data += (HEADER_LEN + 4);
u32length -= 4;
switch(enBurnType)
{
case EN_BURN_DATABASE2_ONLY:
#ifdef FLASH_EEPROM
{
u8 u8E2pBankID;
u32 u32E2pAddress, u32E2pLength;
u8 *pu8E2pDramAddress;
if(FLASH_EEPROM_Info(&u8E2pBankID, &u32E2pAddress, &u32E2pLength) == TRUE)
{
u32E2pAddress += ((u8E2pBankID - DB_START_BANK_ID) << 16);
pu8E2pDramAddress = (u8*)(pu8data + u32E2pAddress);
FLASH_EEPROM_ReadAll(pu8E2pDramAddress);
}
}
#endif
case EN_BURN_DATABASE_ONLY:
if(xmodem_flash_write(DVB_DBGetStartBank(), pu8data, u32length, DVB_DBGetBankNum()) != TRUE)
return 7;
break;
case EN_BURN_DEFAULTDB_ONLY:
if(xmodem_flash_write(DVB_DBGetStartBank()-1, pu8data, u32length, 1) != TRUE)
return 7;
break;
case EN_BURN_CODE_ONLY:
if(xmodem_flash_write(1, pu8data, u32length, DVB_DBGetStartBank()-1) != TRUE)
return 7;
break;
case EN_BURN_CWDATABASE_ONLY:
if(xmodem_flash_write(31, pu8data, u32length, 1) != TRUE)
return 7;
break;
case EN_BURN_LOGO_ONLY:
if(xmodem_flash_write(DVB_DBGetStartBank()-2, pu8data, u32length, 1) != TRUE)
return 7;
break;
case EN_BURN_WICE_OVERALL:
if(xmodem_flash_write(0, pu8data, u32length, 32) != TRUE)
return 7;
break;
case EN_BURN_OVERALL:
if(xmodem_flash_write(1, pu8data, u32length, 31) != TRUE)
return 7;
break;
case EN_BURN_CODE_CWDB: //Update code + database
u32length2 = (DVB_DBGetStartBank() - 1) << 16;
if(xmodem_flash_write(1, pu8data, u32length2, DVB_DBGetStartBank() - 1) != TRUE)
return 7;
if(u32length > u32length2)
{
if(xmodem_flash_write(31, pu8data, u32length-u32length2, 1) != TRUE)
return 7;
}
break;
default:
return 7;
}
return 0;
}
void XModemGetBoxInfo(u8 *pu8Info)
{
u8 au8DateTime[15];
u16 u8Month, u8Day, u16Year, u8Hour, u8Min;
u8 u8tmp =0;
u8 u8tmp_1 =0;
sprintf(au8DateTime, "%s", __DATE__);
if(memcmp(au8DateTime, "Jan", 3) == 0)
{
u8Month = 1;
}
else if(memcmp(au8DateTime, "Feb", 3) == 0)
{
u8Month = 2;
}
else if(memcmp(au8DateTime, "Mar", 3) == 0)
{
u8Month = 3;
}
else if(memcmp(au8DateTime, "Apr", 3) == 0)
{
u8Month = 4;
}
else if(memcmp(au8DateTime, "May", 3) == 0)
{
u8Month = 5;
}
else if(memcmp(au8DateTime, "Jun", 3) == 0)
{
u8Month = 6;
}
else if(memcmp(au8DateTime, "Jul", 3) == 0)
{
u8Month = 7;
}
else if(memcmp(au8DateTime, "Aug", 3) == 0)
{
u8Month = 8;
}
else if(memcmp(au8DateTime, "Sep", 3) == 0)
{
u8Month = 9;
}
else if(memcmp(au8DateTime, "Oct", 3) == 0)
{
u8Month = 10;
}
else if(memcmp(au8DateTime, "Nov", 3) == 0)
{
u8Month = 11;
}
else if(memcmp(au8DateTime, "Dec", 3) == 0)
{
u8Month = 12;
}
else
{
u8Month = 1;
}
//----------------------------------------------------------------------------------------------------------//
//re-write >> u8Day = (((au8DateTime[4] < 0x30) || (au8DateTime[4] > 0x39)) ? 0 : au8DateTime[4] - 0x30) * 10
// + (((au8DateTime[5] < 0x30) || (au8DateTime[5] > 0x39)) ? 0 : au8DateTime[5] - 0x30);
//u8tmp = (((au8DateTime[5] < 0x30) || (au8DateTime[5] > 0x39)) ? 0 : au8DateTime[5] - 0x30);
if((au8DateTime[5] < 0x30) || (au8DateTime[5] > 0x39))
{
u8tmp = 0;
}
else
{
u8tmp = au8DateTime[5] - 0x30;
}
//u8Day = (((au8DateTime[4] < 0x30) || (au8DateTime[4] > 0x39)) ? 0 : au8DateTime[4] - 0x30) * 10+ u8tmp
if((au8DateTime[4] < 0x30) || (au8DateTime[4] > 0x39))
{
u8Day = u8tmp;
}
else
{
u8Day = (au8DateTime[4] - 0x30) * 10+ u8tmp;
}
//----------------------------------------------------------------------------------------------------------//
// re-write >> u16Year = (((au8DateTime[ 7] < 0x30) || (au8DateTime[ 7] > 0x39)) ? 0 : au8DateTime[ 7] - 0x30) * 1000
// + (((au8DateTime[ 8] < 0x30) || (au8DateTime[ 8] > 0x39)) ? 0 : au8DateTime[ 8] - 0x30) * 100
// + (((au8DateTime[ 9] < 0x30) || (au8DateTime[ 9] > 0x39)) ? 0 : au8DateTime[ 9] - 0x30) * 10
// + (((au8DateTime[10] < 0x30) || (au8DateTime[10] > 0x39)) ? 0 : au8DateTime[10] - 0x30);
//u8tmp=(((au8DateTime[10] < 0x30) || (au8DateTime[10] > 0x39)) ? 0 : au8DateTime[10] - 0x30);
if((au8DateTime[10] < 0x30) || (au8DateTime[10] > 0x39))
{
u8tmp = 0;
}
else
{
u8tmp = au8DateTime[10] - 0x30;
}
//u8tmp_1 = (((au8DateTime[ 9] < 0x30) || (au8DateTime[ 9] > 0x39)) ? 0 : au8DateTime[ 9] - 0x30) * 10 + u8tmp;
//(((au8DateTime[ 9] < 0x30) || (au8DateTime[ 9] > 0x39)) ? 0 : au8DateTime[ 9] - 0x30)
if((au8DateTime[ 9] < 0x30) || (au8DateTime[ 9] > 0x39))
{
u8tmp_1 = u8tmp;
}
else
{
u8tmp_1 = ( au8DateTime[ 9] - 0x30)*10 + u8tmp;
}
//u8tmp = (((au8DateTime[ 8] < 0x30) || (au8DateTime[ 8] > 0x39)) ? 0 : au8DateTime[ 8] - 0x30) * 100 + u8tmp_1
//(((au8DateTime[ 8] < 0x30) || (au8DateTime[ 8] > 0x39)) ? 0 : au8DateTime[ 8] - 0x30)
if((au8DateTime[ 8] < 0x30) || (au8DateTime[ 8] > 0x39))
{
u8tmp = u8tmp_1;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -