📄 tboot_1.cpp
字号:
meta_req.ext_clock = ext_clock;
memcpy(meta_req.baudrate, allow_baudrate, sizeof(meta_req.baudrate));
meta_req.flowctrl = META_SW_FLOWCTRL;
meta_req.ms_connect_timeout = 40000;
meta_req.ms_boot_timeout = 5000;
meta_req.boot_meta_arg.m_cb_in_brom_stage = cb_boot_meta_in_brom_stage;
meta_req.boot_meta_arg.m_cb_in_brom_stage_arg = this;
// reset fake progress
progress_hint = "Reset NVRAM to factory default setting ...";
progress_forecolor = clGreen;
Synchronize(ResetFakeProgress);
if( META_SUCCESS != (meta_ret=META_ConnectWithTarget(&meta_req, &g_stopflag, &meta_report)) ) {
// stop fake progress
Synchronize(StopFakeProgress);
asMsg = "META_ConnectWithTarget(): ERROR: " + AnsiString(META_GetErrorString(meta_ret));
Synchronize(ShowMsg);
return false;
}
if( META_SUCCESS != (meta_ret=META_NVRAM_ResetToFactoryDefault(40000)) ) {
META_DisconnectWithTarget();
// stop fake progress
Synchronize(StopFakeProgress);
asMsg = "META_NVRAM_ResetToFactoryDefault(): ERROR: " + AnsiString(META_GetErrorString(meta_ret));
Synchronize(ShowMsg);
return false;
}
META_DisconnectWithTarget();
// finish fake progress
Synchronize(FinishFakeProgress);
return true;
}
void __fastcall tboot_1::FlashTool()
{
AnsiString s1, s2;
int ret;
memset(&arg, 0, sizeof(arg));
memset(&dl_arg, 0, sizeof(dl_arg));
memset(&rb_arg, 0, sizeof(rb_arg));
memset(&fmt_arg, 0, sizeof(fmt_arg));
// fill COM_PORT_SETTING
com.com.number = COM_PORT;
com.baudrate = BAUD_RATE;
com.ms_read_timeout = g_COM_Read_Timeout;
com.ms_write_timeout = g_COM_Write_Timeout;
// fill FLASHTOOL_ARG
arg.bbchip = g_BBCHIP_TYPE;
arg.ext_clock = g_EXT_CLOCK;
arg.p_bank0_mem_cfg = g_EMI_Config[0].m_bAuto?NULL:&(g_EMI_Config[0].m_Config);
arg.p_bank1_mem_cfg = g_EMI_Config[1].m_bAuto?NULL:&(g_EMI_Config[1].m_Config);
if(g_bSkipBootRom)
arg.da_handle = NULL;
else
arg.da_handle = g_DA_HANDLE;
arg.cb_download_da_init = cb_download_da_init;
arg.cb_download_da_init_arg = this;
arg.cb_download_da = cb_download_da;
arg.cb_download_da_arg = this;
arg.cb_before_process = cb_before_process;
arg.cb_before_process_arg = this;
arg.cb_set_high_speed_baudrate = NULL;
arg.cb_set_high_speed_baudrate_arg = NULL;
arg.ms_boot_timeout = BOOT_INFINITE;
arg.max_start_cmd_retry_count = g_MaxBromStartCmdRetryCount;
arg.cb_in_brom_stage = cb_in_brom_stage;
arg.cb_in_brom_stage_arg = &(arg.bbchip);
arg.m_baudrate_full_sync_count = g_Baudrate_FullSync_Count;
arg.m_speedup_brom_baudrate = g_SpeedUpBootROMBaudrate?_TRUE:_FALSE;
if( NOR_OPERATION == g_OperationMethod ) {
arg.m_storage_type = HW_STORAGE_NOR;
arg.m_storage_chip_select[0] = CS0;
arg.m_storage_chip_select[1] = CS_WITH_DECODER;
}
else if( NFB_OPERATION==g_OperationMethod && FLASHTOOL_DOWNLOAD==g_flashtool_function ) {
// NFB_OPERATION
arg.m_storage_type = HW_STORAGE_NAND;
// NFB download, force to CS0, because NFB BootROM only check CS0
arg.m_storage_chip_select[0] = CS0;
arg.m_storage_chip_select[1] = CS_WITH_DECODER;
}
else {
arg.m_storage_type = HW_STORAGE_NAND;
arg.m_storage_chip_select[0] = g_bNFI_SelectCS1?CS1:CS0;
arg.m_storage_chip_select[1] = CS_WITH_DECODER;
}
// NFI setting
arg.m_nand_acccon = g_EMI_NFI_Setting.m_nand_acccon;
arg.m_enable_dram_setting = _FALSE;
// check BootLoader's DRAM setting
if( NFB_OPERATION == g_OperationMethod ) {
BL_INFO bl_info;
if( !g_EMI_NFI_Setting.m_enable_dram_setting &&
(FTHND_OK == DL_BL_GetInfo(g_DL_HANDLE, &bl_info)) &&
(_TRUE == bl_info.m_dram_cfg.m_valid)
) {
// apply DRAM Setting from BootLoader
arg.m_emi_gen_a = bl_info.m_dram_cfg.m_emi_gen_a;
arg.m_emi_gen_b = bl_info.m_dram_cfg.m_emi_gen_b;
arg.m_emi_gen_c = bl_info.m_dram_cfg.m_emi_gen_c;
arg.m_emi_dram_con_i_mode = bl_info.m_dram_cfg.m_emi_dram_con_i_mode;
arg.m_emi_dram_con_i_ext_mode = bl_info.m_dram_cfg.m_emi_dram_con_i_ext_mode;
arg.m_emi_dram_con_k = bl_info.m_dram_cfg.m_emi_dram_con_k;
arg.m_emi_dram_con_l = bl_info.m_dram_cfg.m_emi_dram_con_l;
}
else {
// user select argument
arg.m_emi_gen_a = g_EMI_NFI_Setting.m_emi_gen_a;
arg.m_emi_gen_b = g_EMI_NFI_Setting.m_emi_gen_b;
arg.m_emi_gen_c = g_EMI_NFI_Setting.m_emi_gen_c;
arg.m_emi_dram_con_i_mode = g_EMI_NFI_Setting.m_emi_dram_con_i_mode;
arg.m_emi_dram_con_i_ext_mode = g_EMI_NFI_Setting.m_emi_dram_con_i_ext_mode;
arg.m_emi_dram_con_k = g_EMI_NFI_Setting.m_emi_dram_con_k;
arg.m_emi_dram_con_l = g_EMI_NFI_Setting.m_emi_dram_con_l;
}
}
if( FLASHTOOL_DOWNLOAD == g_flashtool_function ) {
// fill FLASHTOOL_DOWNLOAD_ARG
if( MainForm->mi_MultiLoad->Checked){ //ray 2006.05.18 : Multi-Load
dl_arg.dl_handle_list = g_DL_HANDLE_LIST;
dl_arg.dl_handle = NULL;
}
else{
dl_arg.dl_handle = g_DL_HANDLE;
dl_arg.dl_handle_list = NULL;
}
dl_arg.download_accuracy = ACCURACY_AUTO;
dl_arg.cb_download_flash_init = cb_download_flash_init;
dl_arg.cb_download_flash_init_arg = this;
dl_arg.cb_download_flash = cb_download_flash;
dl_arg.cb_download_flash_arg = this;
if( NOR_OPERATION == g_OperationMethod ) {
dl_arg.fmt_fat.fat_begin_addr = g_ulFormatStartAddr;
dl_arg.fmt_fat.fat_length = g_ulFormatLength;
}
else {
dl_arg.fmt_fat.fat_begin_addr = g_ulNandFormatStartAddr;
dl_arg.fmt_fat.fat_length = g_ulNandFormatLength;
}
dl_arg.fmt_fat.m_validation = g_FormatValidation?_TRUE:_FALSE;
switch(g_FormatAfterDownloadOption) {
case RESET_TO_FACTORY:
// disable format
dl_arg.enable_fat_format = _FALSE;
dl_arg.fmt_fat.option = FORMAT_FAT_AUTO;
// enable watchdog
dl_arg.enable_wdt_timeout = _TRUE;
dl_arg.ms_wdt_timeout_interval = 1500;
break;
case AUTO_FORMAT:
// enable auto format
dl_arg.enable_fat_format = _TRUE;
dl_arg.fmt_fat.option = FORMAT_FAT_AUTO;
// disable watchdog
dl_arg.enable_wdt_timeout = _FALSE;
dl_arg.ms_wdt_timeout_interval = 0;
break;
case MANUAL_FORMAT:
// enable manual format
dl_arg.enable_fat_format = _TRUE;
dl_arg.fmt_fat.option = FORMAT_FAT_MANUAL;
// disable watchdog
dl_arg.enable_wdt_timeout = _FALSE;
dl_arg.ms_wdt_timeout_interval = 0;
break;
case DISABLE_FORMAT:
default:
// disable format
dl_arg.enable_fat_format = _FALSE;
dl_arg.fmt_fat.option = FORMAT_FAT_AUTO;
// disable watchdog
dl_arg.enable_wdt_timeout = _FALSE;
dl_arg.ms_wdt_timeout_interval = 0;
break;
}
dl_arg.cb_format_report_init = cb_format_report_init;
dl_arg.cb_format_report_init_arg = this;
dl_arg.cb_format_report = cb_format_report;
dl_arg.cb_format_report_arg = this;
dl_arg.enable_tgt_res_layout_check = g_bCheckTgtResourceLayout?_TRUE:_FALSE;
dl_arg.enable_bbchip_eco_check = g_bCheckECOVer?_TRUE:_FALSE;
dl_arg.m_cb_format_statistics = cb_format_statistics;
dl_arg.m_cb_format_statistics_arg = this;
if( NFB_OPERATION == g_OperationMethod ) {
// for NFB bloader
dl_arg.m_nfb_enable = _TRUE;
dl_arg.m_cb_download_bloader_init = cb_download_bloader_init;
dl_arg.m_cb_download_bloader_init_arg = this;
dl_arg.m_cb_download_bloader = cb_download_bloader;
dl_arg.m_cb_download_bloader_arg = this;
}
else {
dl_arg.m_nfb_enable = _FALSE;
dl_arg.m_cb_download_bloader_init = NULL;
dl_arg.m_cb_download_bloader_init_arg = NULL;
dl_arg.m_cb_download_bloader = NULL;
dl_arg.m_cb_download_bloader_arg = NULL;
}
if(g_AutoDetectBBCHIP) {
ret = AutoBoot_FlashDownload(&com, &arg, &dl_arg, &g_stopflag, &da_report);
}
else {
ret = FlashDownload(&com, &arg, &dl_arg, &g_stopflag, &da_report);
}
if( FT_OK != ret ) {
// stop timer
Synchronize(StopTimer);
}
}
else if( FLASHTOOL_READBACK == g_flashtool_function ) {
// fill FLASHTOOL_READBACK_ARG
rb_arg.rb_handle = g_RB_HANDLE;
rb_arg.readback_accuracy = ACCURACY_AUTO;
rb_arg.readback_accuracy = ACCURACY_AUTO;
rb_arg.cb_readback_flash_init = cb_readback_flash_init;
rb_arg.cb_readback_flash_init_arg = this;
rb_arg.cb_readback_flash = cb_readback_flash;
rb_arg.cb_readback_flash_arg = this;
if(g_AutoDetectBBCHIP) {
ret = AutoBoot_FlashReadback(&com, &arg, &rb_arg, &g_stopflag, &da_report);
}
else {
ret = FlashReadback(&com, &arg, &rb_arg, &g_stopflag, &da_report);
}
if( FT_OK != ret ) {
// stop timer
Synchronize(StopTimer);
}
}
else if( FLASHTOOL_FORMAT == g_flashtool_function ) {
if( RESET_TO_FACTORY == g_FormatOption ) {
// reset stop flag
g_stopflag = 0;
// go to META mode reset
ret = FT_OK;
}
else {
// fill FLASHTOOL_FORMAT_ARG
if( NOR_OPERATION == g_OperationMethod ) {
fmt_arg.format_addr = g_ulFormatStartAddr;
fmt_arg.format_length = g_ulFormatLength;
}
else {
fmt_arg.format_addr = g_ulNandFormatStartAddr;
fmt_arg.format_length = g_ulNandFormatLength;
}
fmt_arg.cb_format_report_init = cb_format_report_init;
fmt_arg.cb_format_report_init_arg = this;
fmt_arg.cb_format_report = cb_format_report;
fmt_arg.cb_format_report_arg = this;
fmt_arg.m_cb_format_statistics = cb_format_statistics;
fmt_arg.m_cb_format_statistics_arg = this;
fmt_arg.m_erase_flag = g_EraseFlag;
fmt_arg.m_validation = g_FormatValidation?_TRUE:_FALSE;
if(g_AutoDetectBBCHIP) {
ret = AutoBoot_FlashFormat(&com, &arg, &fmt_arg, &g_stopflag, &da_report);
}
else {
ret = FlashFormat(&com, &arg, &fmt_arg, &g_stopflag, &da_report);
}
}
if( FT_OK != ret ) {
// stop timer
Synchronize(StopTimer);
}
}
if( BOOT_STOP == g_stopflag ) {
return;
}
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);
case FT_OK:
if( (FLASHTOOL_DOWNLOAD==g_flashtool_function && RESET_TO_FACTORY==g_FormatAfterDownloadOption) ) {
if(!EnterMETA(arg.bbchip, arg.ext_clock)) {
// stop timer
Synchronize(StopTimer);
return;
}
}
else if( (FLASHTOOL_FORMAT==g_flashtool_function && RESET_TO_FACTORY==g_FormatOption) ) {
if(!EnterMETA(g_AutoDetectBBCHIP?UNKNOWN_BBCHIP_TYPE:g_BBCHIP_TYPE, g_EXT_CLOCK)) {
// stop timer
Synchronize(StopTimer);
return;
}
}
// show ok form and stop timer
Synchronize(ShowOK_Form);
break;
case FT_COM_PORT_OPEN_ERR:
asMsg.printf("[COM] Open COM%d error!", COM_PORT);
Synchronize(ShowMsg);
break;
case FT_COM_PORT_SET_TIMEOUT_ERR:
asMsg.printf("[COM] Fail to set COM%d timeout!", COM_PORT);
Synchronize(ShowMsg);
break;
case FT_DA_HANDLE_ERROR:
switch(FTHND_RET(ret)) {
case FTHND_FILE_IS_NOT_LOADED:
s1 = 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 = 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(dl_arg.rom_info.filepath, sizeof(path), path, &p_filename);
if( NULL!=p_filename && (strlen(dl_arg.rom_info.filepath)>(strlen(p_filename)+12)) ) {
filename.printf("%.12s...\\%s", path, p_filename);
}
else {
filename = dl_arg.rom_info.filepath;
}
asMsg.printf("[DL_HANDLE] %s (\"%s\") doesn't match any entry in jump table!", dl_arg.rom_info.name, filename.c_str());
Synchronize(ShowMsg);
}
break;
case FTHND_RES_BASE_ADDR_NOT_MATCH:
{
char *p_filename=NULL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -