📄 flashdownload.cpp_bak
字号:
//---------------------------------------------------------------------------
//#include <clx.h>
#pragma hdrstop
#include "Multiport_Common.h"
#ifndef _MD_MSG_
#include "MD_msg.h"
#endif
#include "FlashDownLoad.h"
#include "MultiPortFlashDownloadTool.h"
#ifndef _FACTORY_COMMON_H_
#include "factory_common.h"
#endif
#pragma package(smart_init)
bool isShowNoFormatInfo = false;
bool isShowFileNotLoaded = false;
BBCHIP_TYPE gbb_chip_type;
int boot_stop = 0;
HANDLE Flash_Download_Event[MAX_SUPPORT_PORT_NUM];
int stopflag[MAX_SUPPORT_PORT_NUM];
DA_REPORT_T da_report;
extern bool isStopTrigger[MAX_SUPPORT_PORT_NUM];
// access
extern HANDLE hSemaphore;
//=============================================================================
//////////////////////// call back ////////////////////////////////////////
//=============================================================================
static int __stdcall cb_download_da_init(void *usr_arg)
{
TBOOT1 *t=(TBOOT1 *)usr_arg;
int i;
i = t->m_com_port.number - m_TheFirstComNo;
MainForm->DownLoadTimeSec[i]=0;
// access
if( MainForm->Get_EnableFactoryDatabaseLog() )
{
TDateTime datetime;
TDateTime date = datetime.CurrentDate();
TDateTime time = datetime.CurrentTime();
sTime stime;
time.DecodeTime( &stime.hour, &stime.min, &stime.sec, &stime.msec);
MainForm->SetDnDate( i, date );
MainForm->SetDnStartTime( i, time );
MainForm->SetDnStartsTime( i, stime );
}
//MainForm->TimerCOMArray[i]->Enabled = false;
//MainForm->TimerCOMArray[i]->Interval = 1000;
//MainForm->TimerCOMArray[i]->Enabled = true;
MainForm->pbCOMArray[i]->ForeColor = clRed;
t->progress_percentage = 0;
t->prefix = "DA ";
t->SyncInitProgress();
return 0;
}
//---------------------------------------------------------------------------
static int __stdcall cb_download_da(unsigned char percent, unsigned int sent_bytes, unsigned int total_bytes, void *usr_arg)
{
TBOOT1 *t=(TBOOT1 *)usr_arg;
t->progress_percentage = percent;
t->prefix = "DA ";
t->SyncUpdateProgress();
return 0;
}
//---------------------------------------------------------------------------
static int __stdcall cb_download_flash_init(void *usr_arg)
{
TBOOT1 *t=(TBOOT1 *)usr_arg;
int i;
t->progress_percentage = 0;
t->prefix = "DL ";
t->SyncInitProgress();
return 0;
}
//---------------------------------------------------------------------------
static int __stdcall cb_download_flash(unsigned char percent, unsigned int sent_bytes, unsigned int total_bytes, void *usr_arg)
{
TBOOT1 *t=(TBOOT1 *)usr_arg;
t->progress_percentage = percent;
t->prefix = "DL ";
t->SyncUpdateProgress();
// if (percent <= 5)
{
int i = t->m_com_port.number - m_TheFirstComNo;
MainForm->pbCOMArray[i]->ForeColor = clBlue; // VCL
}
return 0;
}
//==============================================================================
static int __stdcall cb_format_report_init(void *usr_arg)
{
TBOOT1 *t=(TBOOT1 *)usr_arg;
int i;
t->progress_percentage = 0;
t->prefix = "FR ";
t->SyncInitProgress();
return 0;
}
//------------------------------------------------------------------------------
static int __stdcall cb_format_report(unsigned char percent, void *usr_arg)
{
TBOOT1 *t=(TBOOT1 *)usr_arg;
t->progress_percentage = percent;
t->prefix = "FR ";
t->SyncUpdateProgress();
// if (percent <= 50)
{
int i = t->m_com_port.number - m_TheFirstComNo;
MainForm->pbCOMArray[i]->ForeColor = clGreen; // VCL
}
return 0;
}
//-----------------------------------------------------------------------------------
static int __stdcall cb_before_process(const DA_REPORT_T *p_da_report, void *usr_arg)
{
#if 0
TBOOT1 *t=(TBOOT1 *)usr_arg;
int i;
i = t->m_com_port.number - m_TheFirstComNo;
//-----------------------------------------------------------------------
// to do: set stopflag[i]=BOOT_STOP when flash type does not match
// check flash type here
if( p_da_report->/* flash type match */ )
{
....
}
else
{
/* not match */
stopflag[i] = BOOT_STOP;
}
#endif
return 0;
}
//------------------------------------------------------------------------------
static int __stdcall cb_in_brom_stage(unsigned int brom_handle, HANDLE hCOM, void *usr_arg) {
int ret;
unsigned short value16;
TBOOT1 *t=(TBOOT1 *)usr_arg;
if( MainForm->isPullDownGPIO17 && gbb_chip_type == MT6218B )
{
// configure GPIO17 mode to GPIO
value16 = 0x000C;
ret = Brom_Write16Cmd(brom_handle, hCOM, (0x80120000+0x0120+0x08)/*GPIO_MODE3_CLR*/, &value16, 1);
// configure GPIO17 direction as output
value16 = 0x0002;
ret = Brom_Write16Cmd(brom_handle, hCOM, (0x80120000+0x0010+0x04)/*GPIO_DIR2_SET*/, &value16, 1);
// pull down GPIO17 to disable vibrator
value16 = 0x0002;
ret = Brom_Write16Cmd(brom_handle, hCOM, (0x80120000+0x00a0+0x08)/*GPIO_DOUT2_CLR*/, &value16, 1);
}
return 0;
}
//---------------------------------------------------------------------------
// Important: Methods and properties of objects in CLX can only be
// used in a method called using Synchronize, for example:
//
// Synchronize(UpdateCaption);
//
// where UpdateCaption could look like:
//
// void __fastcall TBOOT1::UpdateCaption()
// {
// Form1->Caption = "Updated in a thread";
// }
//==============================================================================
__fastcall TBOOT1::TBOOT1(bool CreateSuspended, HANDLE hMsgHandle, COM_PORT_HANDLE ComPortIndex, BBCHIP_TYPE bb_chip,
EXT_CLOCK ext_clock, bool check_eco_ver, UART_BAUDRATE baud_rate, bool b_format_needed)
: TThread(CreateSuspended)
{
hPostMsgDestHandle = hMsgHandle;
m_com_port = ComPortIndex;
Baseband_chip_type = bb_chip;
gbb_chip_type = bb_chip;
External_clock_type = ext_clock;
bCheckECOVersion = check_eco_ver;
UART_baud_rate = baud_rate;
bFormatNeeded = b_format_needed;
}
//---------------------------------------------------------------------------
void _fastcall TBOOT1::ShowMsg()
{
//ShowMessage( asMsg );
MainForm->sbMPDT->Panels->Items[0]->Text = asMsg;
}
//---------------------------------------------------------------------------
void _fastcall TBOOT1::StartDownLoad()
{
int i;
i = m_com_port.number - m_TheFirstComNo;
//MainForm->COMPercentageArray[i]->Caption = "Start";
MainForm->Set_COMPercentageCaption(i, "START");
MainForm->Set_shpCOMColor(i, clBlue);
}
//---------------------------------------------------------------------------
void _fastcall TBOOT1::SyncStartDownLoad()
{
Synchronize(StartDownLoad);
}
//---------------------------------------------------------------------------
void _fastcall TBOOT1::InitProgress()
{
int i;
i = m_com_port.number - m_TheFirstComNo;
// MainForm->COMPercentageArray[i]->Caption = prefix + "0%";
//MainForm->COMPercentageArray[i]->Caption = prefix;
MainForm->Set_COMPercentageCaption( i, prefix );
}
//---------------------------------------------------------------------------
void _fastcall TBOOT1::SyncInitProgress()
{
Synchronize(InitProgress);
}
//---------------------------------------------------------------------------
void _fastcall TBOOT1::UpdateProgress()
{
AnsiString s;
int i;
// s = prefix + IntToStr(progress_percentage) + "%";
s = prefix;
i = m_com_port.number - m_TheFirstComNo;
// MainForm->COMPercentageArray[i]->Caption = s;
MainForm->Set_COMPercentageCaption( i, s );
MainForm->pbCOMArray[i]->Progress = progress_percentage;
}
//---------------------------------------------------------------------------
void _fastcall TBOOT1::SyncUpdateProgress()
{
Synchronize(UpdateProgress);
}
//---------------------------------------------------------------------------
void _fastcall TBOOT1::UpdateResultError()
{
AnsiString s1, s2;
AnsiString s_error;
int i;
s_error = prefix + "ERROR";
i = m_com_port.number - m_TheFirstComNo;
if( isStopTrigger[i] )
{ s_error = prefix + "STOP"; };
MainForm->COMPercentageArray[i]->Caption = s_error;
MainForm->Set_COMPercentageCaption( i, s_error );
MainForm->TimerCOMArray[i]->Enabled = false;
MainForm->btnCOMStartArray[i]->Enabled = true;
MainForm->cbCOMArray[i]->Enabled = true;
MainForm->cbAutoPollingArray[i]->Enabled = true;
MainForm->Set_shpCOMColor( i, clRed );
MainForm->DownloadStatus[i] = DOWNLOAD_STATUS_NOTRUNNING;
// access
if( MainForm->Get_EnableFactoryDatabaseLog() )
{
MainForm->SetPassFail( i, TEST_RESULT_FAIL);
MainForm->SetFailReason( i, ret );
WaitForSingleObject( hSemaphore, 5000 );
MainForm->AddDnResultToAccess( i );
}
switch( FT_RET(ret) )
{
case FT_SKIP_AUTO_FORMAT_FAT:
ROM_INFO rom_info;
DL_Rom_GetInfo(g_DL_HANDLE, 0, &rom_info);
asMsg.printf("[Warning] Skip FAT auto format because of one of the following reasons.\n\n"
" 1. \"%s\" might not contain FAT range information! \n"
" 2. Target's flash id doesn't correspond to \"%s\" 's flash id!", rom_info.name, rom_info.name);
Synchronize(ShowMsg);
break;
#if 0
case FT_OK:
if( (FLASHTOOL_DOWNLOAD==g_flashtool_function && RESET_TO_FACTORY==g_FormatOption) ||
(FLASHTOOL_FORMAT==g_flashtool_function && RESET_TO_FACTORY==g_TempFormatOption)
) {
if(!EnterMETA()) {
// stop timer
Synchronize(StopTimer);
return;
}
}
// show ok form and stop timer
Synchronize(ShowOK_Form);
break;
#endif
case FT_COM_PORT_OPEN_ERR:
// asMsg.printf("[COM] Open COM%d error!", m_com_port.number);
// Synchronize(ShowMsg);
break;
case FT_COM_PORT_SET_TIMEOUT_ERR:
// asMsg.printf("[COM] Fail to set COM%d timeout!", m_com_port.number);
// Synchronize(ShowMsg);
break;
case FT_DA_HANDLE_ERROR:
switch( FTHND_RET(ret) )
{
case FTHND_FILE_IS_NOT_LOADED:
s1 = ft_arg.da_info.filepath;
asMsg = "[DA_HANDLE] DA(\"" + s1 + "\") is not loaded yet!\n\nPlease load it before download.";
Synchronize(ShowMsg);
break;
default:
asMsg = "[DA_HANDLE] Error: ret=0x" + IntToHex(ret, 6);
Synchronize(ShowMsg);
break;
}
break;
case FT_DL_HANDLE_ERROR:
switch( FTHND_RET(ret) )
{
case FTHND_LIST_IS_EMPTY:
asMsg = "[DL_HANDLE] Download list is empty or all disabled!\n\nPlease select at least one entry.";
Synchronize(ShowMsg);
break;
case FTHND_FILE_IS_NOT_LOADED:
s1 = ft_dl_arg.rom_info.name;
asMsg = "[DL_HANDLE] " + s1 + " is not loaded yet!\n\nPlease load it before download.";
Synchronize(ShowMsg);
break;
case FTHND_RES_NO_MATCH_IN_JUMPTABLE:
{
char *p_filename=NULL;
char path[512];
AnsiString filename;
GetFullPathName(ft_dl_arg.rom_info.filepath, sizeof(path), path, &p_filename);
if( NULL!=p_filename && (strlen(ft_dl_arg.rom_info.filepath)>(strlen(p_filename)+12)) )
{
filename.printf("%.12s...\\%s", path, p_filename);
}
else
{
filename = ft_dl_arg.rom_info.filepath;
}
asMsg.printf("[DL_HANDLE] %s (\"%s\") doesn't match any entry in jump table!", ft_dl_arg.rom_info.name, filename.c_str());
Synchronize(ShowMsg);
}
break;
case FTHND_RES_BASE_ADDR_NOT_MATCH:
{
char *p_filename=NULL;
char path[512];
AnsiString filename;
MTK_Resource res_info;
GetFullPathName(ft_dl_arg.rom_info.filepath, sizeof(path), path, &p_filename);
if( NULL!=p_filename && (strlen(ft_dl_arg.rom_info.filepath)>(strlen(p_filename)+12)) )
{
filename.printf("%.12s...\\%s", path, p_filename);
}
else
{
filename = ft_dl_arg.rom_info.filepath;
}
DL_Rom_GetResInfo(g_DL_HANDLE, ft_dl_arg.rom_info.index, &res_info);
asMsg.printf("[DL_HANDLE] %s (\"%s\"): The begin_addr(0x%08X) doesn't match resource base_addr(0x%08X)!", ft_dl_arg.rom_info.name, filename.c_str(), ft_dl_arg.rom_info.begin_addr, res_info.m_base_addr);
Synchronize(ShowMsg);
}
break;
case FTHND_SCAT_REGION_IS_OVERLAP:
{
ROM_INFO rom_info;
DL_Rom_GetInfo(g_DL_HANDLE, ft_dl_arg.rom_info.index+1, &rom_info);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -