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

📄 xmodem.c

📁 DVB软件,基于CT216软件的开发源程序.
💻 C
📖 第 1 页 / 共 2 页
字号:

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

⌨️ 快捷键说明

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