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

📄 download.cpp

📁 AliEditor_Source code
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// DownLoad.cpp : implementation file
//

#include "stdafx.h"
#include "AliEditor.h"
#include "DownLoad.h"

#include "fastCRC.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define PACKAGESIZE 1024
#define PACKAGEBIT 10

/*message*/
#define WM_PAGE2_ACTIVE  WM_USER+0x30
#define WM_PAGE3_ACTIVE  WM_USER+0x31
#define WM_DL_CANCEL	 WM_USER+0x32

/*m_STB*/
#define STB_MTW3327 0
#define STB_MTW3326 1

#define FLASH_SIZE    0x100000
#define BLOCK_HEADER_SIZE 128
#define BLOCK_BASIC_HEADER_SIZE 16

#define BLOCK_ID_OFFSET		0
#define BLOCK_LEN_OFFSET	4
#define BLOCK_OFFSET_OFFSET	8
#define BLOCK_CRC_OFFSET	12
#define BLOCK_NAME_OFFSET	16
#define BLOCK_VER_OFFSET	32
#define BLOCK_TIME_OFFSET	48
#define BLOCK_RES_OFFSET	64

#define ID_TYPE(x) (x>>16)
#define BOOTLOADER_ID 0
#define USERDB_ID 0x04FB
#define TEMPDB_ID 0x05FA

#define MAINCODE_ID 0x01FE0100
#define DEFAULT_DATABASE_ID 0x03FC0100
#define USER_DATABASE_ID 0x04FB0100
/////////////////////////////////////////////////////////////////////////////
// CDownLoad dialog

//#define TRANSFER_FORMAT2_SUPPORT

#define PACKAGESIZE 1024
#define PACKAGEBIT 10

#define TRANSFER_RETRY_TIMES 2

CDownLoad::CDownLoad(CWnd* pParent /*=NULL*/)
	: CDialog(CDownLoad::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDownLoad)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT

	pThread = NULL;
	m_bootloader = 0;

	m_bDownLoadDdb = TRUE;
	m_bDownLoadUdb = FALSE;
}


void CDownLoad::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDownLoad)
	DDX_Control(pDX, IDC_STATIC_OK4, m_burn_ok);
	DDX_Control(pDX, IDC_STATIC_BURN_FLASH, m_start_burn);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CDownLoad, CDialog)
	//{{AFX_MSG_MAP(CDownLoad)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDownLoad message handlers

LRESULT CDownLoad::OnCancelDownload(WPARAM wParam, LPARAM lParam)
{
	if(pThread!=NULL)
		pThread->SuspendThread();
	/* make read buffer empty */
	char VerBuff[50];
	while(m_SerPort.ReadData(VerBuff,50) != 0);

	char Cmd[9] = "TIXE_DMC";//CMD_EXIT
	m_SerPort.SendData(Cmd,8);
	return 1;
}

BOOL CDownLoad::SlaveReorg()
{
	//unsigned int addr;
	int i,j,k;

	slave_reorg_size = 0;
	slave_burn_size = 0;

	slave_reorg_number = slave_blocks_number;
	
	for(i=1;i<block_number;i++)
	{
		if(blocks[i].upg_flag == 1)
		{
			if(!IsInSlave(blocks[i].id))   // add chunk
				slave_reorg_number++;
		}
	}

	slave_reorg_blocks = (BLOCK_LIST2 *)malloc(sizeof(BLOCK_LIST2)*slave_reorg_number);
	memset((void *)slave_reorg_blocks,0,sizeof(BLOCK_LIST2)*slave_reorg_number);

	/*init slave_reorg_blocks*/
	for(i=0; i<slave_blocks_number; i++)
	{
		slave_reorg_blocks[i].type = 1;  //move
		slave_reorg_blocks[i].index= i;
		slave_reorg_blocks[i].offset = slave_blocks[i].offset;
	}
	for(i=slave_blocks_number; i<slave_reorg_number; i++)
	{
		slave_reorg_blocks[i].type = 0;
		slave_reorg_blocks[i].index= 0;
		slave_reorg_blocks[i].offset = 0;
	}

	k = slave_blocks_number;
	for(i=1; i<block_number; i++)
	{
		if(blocks[i].upg_flag == 1)
		{
			for(j=0; j<slave_blocks_number; j++)
			{
				if(slave_reorg_blocks[j].type == 1 && slave_blocks[slave_reorg_blocks[j].index].id == blocks[i].id)
				{	
					if(ID_TYPE(blocks[i].id)!=TEMPDB_ID || slave_status!=0)
					{
						slave_reorg_blocks[j].type = 2;  //transfer
						slave_reorg_blocks[j].index= i;
						slave_reorg_blocks[j].offset = blocks[i].offset;	
					}
					break;
				}
			}

			/*add chunk*/
			if(j>=slave_blocks_number)
			{
				slave_reorg_blocks[k].type = 2;  //transfer
				slave_reorg_blocks[k].index= i;
				slave_reorg_blocks[k].offset = blocks[i].offset;
				k++;
			}
		}
	}

	if(m_bootloader)
	{
		slave_reorg_blocks[0].type = 2;  //transfer
		slave_reorg_blocks[0].index= 0;
		slave_reorg_blocks[0].offset = blocks[0].offset;
	}

	if(m_bootloader) i = 0;
	else i = 1;

	for(; i<slave_reorg_number; i++)
	{
		if(slave_reorg_blocks[i].type  == 1) //move
		{
			if(slave_reorg_blocks[i].offset == 0)
				slave_burn_size += slave_blocks[slave_reorg_blocks[i].index].len+BLOCK_BASIC_HEADER_SIZE;
			else
				slave_burn_size += slave_reorg_blocks[i].offset;

			slave_reorg_size += slave_blocks[slave_reorg_blocks[i].index].len+BLOCK_BASIC_HEADER_SIZE;
		}
		else //transfer
		{		
			if(slave_reorg_blocks[i].offset == 0)
				slave_burn_size += blocks[slave_reorg_blocks[i].index].len+BLOCK_BASIC_HEADER_SIZE;
			else
				slave_burn_size += slave_reorg_blocks[i].offset;

//			if(i == slave_reorg_number-1)
//				blocks[slave_reorg_blocks[i].index].len = BLOCK_HEADER_SIZE-BLOCK_BASIC_HEADER_SIZE;
			slave_reorg_size += blocks[slave_reorg_blocks[i].index].len+BLOCK_BASIC_HEADER_SIZE;
		}
	}

	if(m_bootloader)
	{
		if(slave_burn_size > slave_Flash_type)
		return FALSE;
	}
	else
	{
		if(slave_burn_size+slave_reorg_blocks[0].offset > slave_Flash_type)
		return FALSE;
	}

	return TRUE;
}

BOOL CDownLoad::IsInSlave(unsigned int id)
{
	int i;

	for(i=0; i<slave_blocks_number; i++)
	{
		if(slave_blocks[i].id == id)
			return TRUE;
	}

	return FALSE;
}

BOOL CDownLoad::CheckVersion(char* sVer, char* hVer)
{
	char sVersion[16], hVersion[16];

	strcpy(sVersion, sVer);
	strcpy(hVersion, hVer);
	sVersion[8] = '\0';
	hVersion[8] = '\0';
	
	if(strcmp(sVersion, hVersion) != 0)
		return FALSE;

	return TRUE;
}

BOOL CDownLoad::Command_comtest()
{
	char *TestCommd = "comtest 10\r";
	int TestLen  = 10;
	char *TestStr = "ali  DVB-S";

	if(m_SerPort.IsOpened == FALSE)
		return FALSE;

	char TmpBuff[50];
	/* make read buffer empty */
	while(m_SerPort.ReadData(TmpBuff,50) != 0);

	/* send test info*/
	EnterCriticalSection(&m_cs);
	int len = strlen(TestCommd);
	if(!m_SerPort.Send2Back_tm(TestCommd,len,1000*100))
	//if(!m_SerPort.Send2Back(TestCommd,len))
	{
		LeaveCriticalSection(&m_cs);
		return FALSE;
	}
	m_bNodifyReset = true;
	len = strlen(TestStr);
	if(!m_SerPort.Send2Back_tm(TestStr,len,1000*50))
	{
		LeaveCriticalSection(&m_cs);
		return FALSE;
	}
	LeaveCriticalSection(&m_cs);

	return TRUE;
}

BOOL CDownLoad::Command_version()
{
	unsigned char VerBuff[BLOCK_HEADER_SIZE*50],crc_txt[4];
	char * VerCmmd = "version\r";
	int len = strlen(VerCmmd);
	int i;
	unsigned int crc,verify_crc;
	unsigned int buffer_len;
	unsigned char *p, *pblock;
	char sVer[16], hVer[16];

	/* make read buffer empty */
	while(m_SerPort.ReadData(VerBuff,BLOCK_HEADER_SIZE) != 0);

	Sleep(100);

	/* send version command */
	if(!m_SerPort.Send2Back_tm(VerCmmd,len,1000*50))
	{
		AfxMessageBox("failed 1");
		
		return FALSE;
	}
	Sleep(1500);

	memset((void *)VerBuff,0,BLOCK_HEADER_SIZE*50);
	if(!m_SerPort.ReadData_tm(VerBuff,2,1000*500))
	{
		AfxMessageBox("failed 2");

		return FALSE;
	}
	buffer_len = 0;
	buffer_len = (VerBuff[0]<<8)+VerBuff[1];

	Sleep(1500);
	
	if(!m_SerPort.ReadData_tm(VerBuff,buffer_len,1000*500))
	{
		AfxMessageBox("failed 3");

		return FALSE;
	}

	Sleep(300);

	if(!m_SerPort.ReadData_tm(crc_txt,4,1000*500))
	{
		AfxMessageBox("failed 4");

		return FALSE;
	}

	crc = 0;
	crc = (crc_txt[0]<<24)+(crc_txt[1]<<16)+(crc_txt[2]<<8)+(crc_txt[3]<<0);

	verify_crc = MG_Table_Driven_CRC(0xFFFFFFFF,VerBuff,buffer_len);
	//verify_crc = gen_CRC32(0xFFFFFFFF,VerBuff,buffer_len);

	if(verify_crc != crc)
	{
		MessageBox("STB information transfer error","Error",MB_OK);
		return FALSE;
	}

	switch((unsigned int)VerBuff[0])
	{
		case 1:
		case 2:
		case 7:
		case 10:
			slave_Flash_type = 0x80000;
			break;
		case 3:
		case 4:
		case 8:
		case 9:
		case 11:
		case 13:
			slave_Flash_type = 0x100000;
			break;
		case 5:
		case 6:
		case 12:
		case 14:
		case 15:
		case 16:
			slave_Flash_type = 0x200000;
			break;
		case 17:
		case 18:
		case 19:
			slave_Flash_type = 0x400000;
			break;
		default:
		{
			MessageBox("STB flash type unknown","Error",MB_OK);
			return FALSE;
		}
	}

	slave_status = (unsigned int)VerBuff[1];

	slave_blocks_number = (buffer_len-2)/BLOCK_HEADER_SIZE;
	slave_blocks = (BLOCK_HEADER *)malloc(sizeof(BLOCK_HEADER)*slave_blocks_number);
	memset((void *)slave_blocks,0,sizeof(BLOCK_HEADER)*slave_blocks_number);

	pblock = &VerBuff[2];
	for(i=0; i<slave_blocks_number; i++)
	{
		p = pblock + BLOCK_ID_OFFSET;
		slave_blocks[i].id = (*p<<24)+(*(p+1)<<16)+(*(p+2)<<8)+(*(p+3)<<0);

		if( slave_blocks[i].id == USER_DATABASE_ID )
		{
			memcpy(m_usr_block_header, pblock, BLOCK_HEADER_SIZE);
		}

		p = pblock + BLOCK_LEN_OFFSET;
		slave_blocks[i].len = (*p<<24)+(*(p+1)<<16)+(*(p+2)<<8)+(*(p+3)<<0);

		p = pblock + BLOCK_OFFSET_OFFSET;
		slave_blocks[i].offset = (*p<<24)+(*(p+1)<<16)+(*(p+2)<<8)+(*(p+3)<<0);

		p = pblock + BLOCK_CRC_OFFSET;
		slave_blocks[i].crc = (*p<<24)+(*(p+1)<<16)+(*(p+2)<<8)+(*(p+3)<<0);

		p = pblock + BLOCK_NAME_OFFSET;
		strcpy((char *)slave_blocks[i].name, (char *)p);
		
		p = pblock + BLOCK_VER_OFFSET;
		strcpy((char *)slave_blocks[i].version, (char *)p);

		p = pblock + BLOCK_TIME_OFFSET;
		strcpy((char *)slave_blocks[i].time, (char *)p);

		pblock += BLOCK_HEADER_SIZE;
	}

	if(m_bootloader) return TRUE;

	/* open file */
	if(!m_File.Open(m_Path,CFile::shareDenyRead,NULL))
	{
		return FALSE;
	}
	m_File.Seek(BLOCK_VER_OFFSET, CFile::begin);
	if(16 != m_File.Read(hVer,16))
	{
		m_File.Close();
		return FALSE;
	}
	m_File.Close();

	strcpy(sVer, (char*)slave_blocks[0].version);

	if(CheckVersion(sVer, hVer) != TRUE)
	{
		MessageBox("STB version is not compatible","Error",MB_OK);
		return FALSE;
	}

	return TRUE;
}

BOOL CDownLoad::Command_address()
{
	char bufsz[128];
//	char *AddrCommd = "address";
//	char Address[10];
	char TmpBuff[50];
	unsigned int addr;
	unsigned char Answer;

	/*address 0x10000\r*/

	if(m_bootloader)
		addr = 0;
	else
		addr = 0x10000; //getAddress();

//	sprintf(Address, "%u",addr);

	addr = 0x10000; //getAddress();

	sprintf(bufsz, "address %u\r", addr);

	/* make read buffer empty */
	while(m_SerPort.ReadData(TmpBuff,50) != 0);

	if(m_SerPort.Send2Back_tm(bufsz, strlen(bufsz), 1000*50) != TRUE)
	{
		MessageBox("Send flash address failed","Error",MB_OK);
		return FALSE;
	}
/*

	if(m_SerPort.Send2Back_tm(AddrCommd, strlen(AddrCommd), 1000*50) != TRUE)
	{
//		MessageBox("Send flash address failed","Error",MB_OK);
		return FALSE;
	}
	if(m_SerPort.Send2Back_tm(" ",1,1000*50)!=TRUE)
	{
//		MessageBox("Send flash address failed","Error",MB_OK);
		return FALSE;
	}
	if(m_SerPort.Send2Back_tm(Address,strlen(Address),1000*50)!=TRUE)
	{
//		MessageBox("Send flash address failed","Error",MB_OK);
		return FALSE;
	}
	if(m_SerPort.Send2Back_tm("\r",1,1000*50)!=TRUE)
	{
//		MessageBox("Send flash address failed","Error",MB_OK);
		return FALSE;
	}
*/
	Answer = 0;
	if(m_SerPort.ReadData_tm(&Answer,1,1000*500)!=TRUE)
	{
//		MessageBox("Send flash address failed","Error",MB_OK);
		return FALSE;
	}	

	if(Answer != 'O')
	{
//		MessageBox("Send flash address failed","Error",MB_OK);
		return FALSE;
	}

	return TRUE;
}

BOOL CDownLoad::Command_move(int index,unsigned int offset)
{
	char *MoveCommd = "move";
	unsigned int id;
	char Id[10], Offset[10];
	char TmpBuff[50];
	unsigned char Answer;
	int progress;
	CString per;

	CProgressCtrl *pPrgrss = (CProgressCtrl *)GetDlgItem(IDC_PROGRESS_SDRAM);
	CWnd *pWnd = GetDlgItem(IDC_STATIC_SDRAM_PERCENT);

	id = slave_blocks[index].id;
	
	sprintf(Id, "%u", id);
	sprintf(Offset, "%u", offset);

	/* make read buffer empty */
	while(m_SerPort.ReadData(TmpBuff,50) != 0);

	if(m_SerPort.Send2Back_tm(MoveCommd,strlen(MoveCommd),1000*50)!=TRUE)
	{
//		MessageBox("Move block failed1","Error",MB_OK);
		return FALSE;
	}
	if(m_SerPort.Send2Back_tm(" ",1,1000*50)!=TRUE)
	{
//		MessageBox("Move block failed2","Error",MB_OK);
		return FALSE;
	}
	if(m_SerPort.Send2Back_tm(Id,strlen(Id),1000*50)!=TRUE)
	{
//		MessageBox("Move block failed3","Error",MB_OK);
		return FALSE;
	}
	if(m_SerPort.Send2Back_tm(" ",1,1000*50)!=TRUE)
	{
//		MessageBox("Move block failed4","Error",MB_OK);
		return FALSE;
	}
	if(m_SerPort.Send2Back_tm(Offset,strlen(Offset),1000*50)!=TRUE)
	{
//		MessageBox("Move block failed5","Error",MB_OK);
		return FALSE;

⌨️ 快捷键说明

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