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

📄 tboot_1.cpp

📁 MTK bin下载工具全部源代码(c++)
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	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 + -