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

📄 main.cpp

📁 MTK平台的下载程序源代码,极具参考价值,可修改支持其它芯片的FLASH
💻 CPP
📖 第 1 页 / 共 5 页
字号:

//------------------------------------------------------------------------------
bool TMainForm::FileOpenLinkMapExecute()
{
    int iLastDel=0;

    if (ScatBaseDir.Length()>0)
    {
       OpenLdMapDialog->InitialDir = ScatBaseDir;
       OpenLdMapDialog->FileName = "";
    }
    else if( 0 < ed_LinkMapFile->Text.Length() ) {
        iLastDel = ed_LinkMapFile->Text.LastDelimiter("\\:");
        if ( iLastDel > 0)
        {
	        OpenLdMapDialog->InitialDir = ed_LinkMapFile->Text.SubString(1, iLastDel-1 );
			OpenLdMapDialog->FileName = "";
        }
    }

    if ( OpenLdMapDialog->Execute() )
    {
    	if(Parse(g_DL_HANDLE,OpenLdMapDialog->FileName, true)) {
            iLastDel = asMap.LastDelimiter("\\:");
            if ( iLastDel > 0)
            {
               ScatBaseDir = asMap.SubString(1, iLastDel-1 );
               ROMBaseDir = ScatBaseDir;
            }
    	    return true;
    	}
    	else {
        	return false;
    	}
    }
	// do not add "else" !
    return false;
}
//------------------------------------------------------------------------------

void __fastcall TMainForm::FileOpenLinkMapExecute(TObject *Sender)
{
        if( mi_MultiLoad->Checked ){
                ShowMessage("Please un-checked Multi-Load !");
                return;
        }
        FileOpenLinkMapExecute();
}

//---------------------------------------------------------------------------
void __fastcall TMainForm::FormCreate(TObject *Sender)
{
	unsigned int i;
        int ret;

   	m_pUpdateListLock = new TCriticalSection();

	// init META_DLL
	META_Init(NULL);

	DL_Create(&g_DL_HANDLE);
	DA_Create(&g_DA_HANDLE);
	RB_Create(&g_RB_HANDLE);
        DL_CreateList(&g_DL_HANDLE_LIST);

        lb_DA_File->Height =27;
        ed_DA_File->Height = lb_DA_File->Height-2;

        lb_LinkMapFile->Height =27;
        ed_LinkMapFile->Height = lb_LinkMapFile->Height-2;

        ed_DA_File->Top = lb_DA_File->Top;
        ed_LinkMapFile->Top = lb_LinkMapFile->Top;

        Timer_Download->Enabled = false;
        UART_Com = NULL;

        br_115200Execute(Sender); // new 2002.3.12

        g_rootLoad = TreeView1->Items->AddChild(NULL,"Multi-Load");   //ray: 20060517

        TIniFile *ini;
        ini = new TIniFile( ChangeFileExt( Application->ExeName, ".INI" ) );


	// load download history
	for(i=0; i<MAX_DOWNLOAD_HISTORY; i++) {
		DownloadSet		dl_set;
		int	file_count=0;
		dl_set.m_Scatter	= ini->ReadString("DL_HISTORY_"+IntToStr(i), "scatter_file", "");
		if(dl_set.m_Scatter.IsEmpty()) {
			break;
		}
		dl_set.m_BootLoader	= ini->ReadString("DL_HISTORY_"+IntToStr(i), "bootloader", "");
		dl_set.m_BootLoader_Enable = ini->ReadBool("DL_HISTORY_"+IntToStr(i), "bootloader_enable", true);
		file_count			= ini->ReadInteger("DL_HISTORY_"+IntToStr(i), "file_count", 1);
		for(int j=0; j<file_count; j++) {
			DownloadBinFile		dl_bin;
			dl_bin.m_Filepath = ini->ReadString("DL_HISTORY_"+IntToStr(i), "file"+IntToStr(j), "");
			dl_bin.m_Enable = ini->ReadBool("DL_HISTORY_"+IntToStr(i), "file"+IntToStr(j)+"_enable", true);
			dl_set.m_BinFiles.push_back(dl_bin);
		}
		g_DownloadHistory.push_back(dl_set);
	}

        g_CompareResProjectId = ini->ReadBool("DOWNLOAD", "compare_resource_project_id", true);
        DL_ResourceProjectIdComparisonSetting(g_DL_HANDLE, g_CompareResProjectId?_TRUE:_FALSE);

        g_BBCHIP_TYPE = ini->ReadInteger("FORM", "bb_chip", MT6218B);
        g_EXT_CLOCK = ini->ReadInteger("FORM", "ext_clock", EXT_26M);
        g_bPullDownGPIO17 = ini->ReadBool("FORM", "pull_down_gpio17", true);

	for(i=0; i<2; i++) {
		g_EMI_Config[i].m_bAuto = ini->ReadBool( "EMI", "bank"+IntToStr(i)+"_auto", true);
		g_EMI_Config[i].m_Config = strtoul(ini->ReadString( "EMI", "bank"+IntToStr(i)+"_cfg", "0x00004102" ).c_str(), NULL, 16);
	}

        COM_PORT     =  ini->ReadInteger( "FORM", "com", 1 );

        int iBaudRate    =  ini->ReadInteger( "FORM", "baudrate", 921600 );

        g_MaxBromStartCmdRetryCount = ini->ReadInteger( "FORM", "brom_start_cmd_retry_count", DEFAULT_BROM_START_CMD_RETRY_COUNT );
        m_BRomStartCmdRetryCount->Caption.printf("BootROM start cmd retry (%d) ...", g_MaxBromStartCmdRetryCount);

        switch ( iBaudRate )
        {
                case 921600:
                        BAUD_RATE = UART_BAUD_921600;
                        break;
                case 460800:  // 2002.3.28 High Speed
                        BAUD_RATE = UART_BAUD_460800;
                        break;
                case 230400:  // 2002.3.28 High Speed
                        BAUD_RATE = UART_BAUD_230400;
                        break;

                case 115200:
                        BAUD_RATE = UART_BAUD_115200;
                        break;
                case 57600:
                        BAUD_RATE = UART_BAUD_57600;
                        break;
                case 38400:
                        BAUD_RATE = UART_BAUD_38400;
                        break;
                case 19200:
                        BAUD_RATE = UART_BAUD_19200;
                        break;
                case 9600:
                        BAUD_RATE = UART_BAUD_9600;
                        break;
                default:
                        BAUD_RATE = UART_BAUD_19200;
                        break;
        }

        AnsiString asNull;
        g_asNormalModeDAPath = asBin = ini->ReadString("FORM", "bin", asNull );
        g_asTestModeDAPath = ini->ReadString("FORM", "testmode_da_path", g_asNormalModeDAPath);

        if ( access( asBin.c_str(), 0 ) != 0 ) {
                asBin.SetLength(0);
        }
        else {
                // load DA
                OpenReadDA_File(asBin);
        }

        asMap = ini->ReadString("FORM", "map", asNull );

        if ( access( asMap.c_str(), 0 ) != 0 ) {
                asMap.SetLength(0);
        }
        else {
                // load scatter
                Parse(g_DL_HANDLE,asMap, true); //ray 2006.05.18 : AutoBoot for make IsNFB true
        }

        g_OperationMethod = ini->ReadInteger("FORM", "OperationMethod", NOR_OPERATION);
        g_FormatValidation = ini->ReadInteger("FORM", "erase_validation", false);

        RedrawDownloadList(g_DL_HANDLE);

//   OpenSingleRomFile->HistoryList->CommaText = ini->ReadString("FORM", "rom_history", asNull);

/////////////////////////////

	AnsiString	as_bloader_file;
        as_bloader_file = ini->ReadString("NFB", "bloader", asNull );
	if( 0 < as_bloader_file.Length() ) {
		if( FTHND_OK != (ret=DL_BL_LoadByFilepath(g_DL_HANDLE, as_bloader_file.c_str())) ) {
			if( FTHND_HANDLE_BUSY_NOW == ret ) {
				ShowMessage("Program is busy! Can not update setting right now.");
			}
			else {
				ShowMessage(" Load boot-loader \"" + as_bloader_file + "\" fail!");
			}
		}
	}

        DL_BL_SetEnableAttr(g_DL_HANDLE, ini->ReadBool("NFB", "bloader_enable", true)?_TRUE:_FALSE);

	g_bCheckTgtResourceLayout = ini->ReadBool("DOWNLOAD", "chk_tgt_resource_layout", true);
	g_bCheckECOVer = ini->ReadBool( "DOWNLOAD", "check_bbchip_eco_ver", true );
	g_bAutoSelectBBChipType = ini->ReadBool("DOWNLOAD", "auto_sel_bbchip", true);
        g_bAutoLoadResByScat = ini->ReadBool("DOWNLOAD", "auto_load_resource_by_scat", true);
	g_FormatAfterDownloadOption = ini->ReadInteger("DOWNLOAD", "FormatAfterDownloadOption", DISABLE_FORMAT);

	int item_count;
	if( NFB_OPERATION == g_OperationMethod ) {
		item_count = ListView1->Items->Count-1;
	}
	else {
		item_count = ListView1->Items->Count;
	}

        
    if( 0 < item_count )
    {
        for(int i=0; i<item_count; i++)
        {
                AnsiString  s;
       	        AnsiString  name;
                int enable;
                ROM_INFO	rom;
                // ROM file name
                s = ini->ReadString("DOWNLOAD", "file"+IntToStr(i), asNull );
                if( NFB_OPERATION == g_OperationMethod ) {
                        name = ListView1->Items->Item[i+1]->Caption;
                }
                else {
                        name = ListView1->Items->Item[i]->Caption;
                }

                if( 0<s.Length() && (ret=DL_Rom_LoadByFilepath(g_DL_HANDLE, i, s.c_str()))) {
                        if( FTHND_SCAT_REGION_IS_OVERLAP == ret ) {
                                ShowMessage("Failed to load \"" + name + "\" from file \"" + s + "\"!\n\nBecause it is too large and causes region overlap!");
                        }
                        else {
                                ShowMessage("Failed to load \"" + name + "\" from file \"" + s + "\"!");
                        }
                }

                BBCHIP_TYPE	bbchip_type;
                if( g_bAutoSelectBBChipType && !DL_GetBBChipType(g_DL_HANDLE, &bbchip_type) && UNKNOWN_BBCHIP_TYPE!=bbchip_type ) {
                        g_BBCHIP_TYPE = bbchip_type;
                        updateMenuItem();
                }

                enable = ini->ReadInteger("DOWNLOAD", "file"+IntToStr(i)+"_enable", 1);
                DL_Rom_SetEnableAttr(g_DL_HANDLE, i, 0!=enable?_TRUE:_FALSE);
        }

        // check if NFB enabled
        _BOOL	bIsNFB;
        if( FTHND_OK == DL_IsNFB(g_DL_HANDLE, &bIsNFB) ) {
                if( _TRUE == bIsNFB ) {
            	        g_OperationMethod = NFB_OPERATION;
                }
                else {
            	        g_OperationMethod = NOR_OPERATION;
        	}
        }

        RedrawDownloadList(g_DL_HANDLE);
    }

////////////////////////////// begin read back

    int iReadBackCount = ini->ReadInteger("READBACK", "readback_count", 0 );

    if ( iReadBackCount > 0)
    {
        for ( int i=0; i< iReadBackCount; i++)
        {
                AnsiString  as_rb_file;
                AnsiString  as_readback_addr;
                AnsiString  as_readback_len;
                unsigned long  readback_addr;
                unsigned long  readback_len;
                bool	enable;
                NUTL_ReadFlag_E	read_flag;

                as_rb_file = ini->ReadString("READBACK", "file"+IntToStr(i), "ROM_"+ IntToStr( i ));
                enable = ini->ReadBool("READBACK", "file"+IntToStr(i)+"_enable", true);
                read_flag = ini->ReadInteger("READBACK", "file"+IntToStr(i)+"_read_flag", NUTL_READ_PAGE_SPARE);
                as_readback_addr = ini->ReadString("READBACK", "startaddr"+IntToStr(i), "0x00000000" );
                as_readback_len = ini->ReadString("READBACK", "length"+IntToStr(i), "0x00000100" );

                readback_addr = strtoul(as_readback_addr.c_str(), NULL, 16);
                readback_len  = strtoul(as_readback_len.c_str(), NULL, 16);

       	        if(!RB_Append(g_RB_HANDLE, as_rb_file.c_str(), readback_addr, readback_len)) {
                        RB_SetEnableAttr(g_RB_HANDLE, i, enable?_TRUE:_FALSE);
                        RB_SetReadbackFlag(g_RB_HANDLE, i, read_flag);
                }
        } // for

        RedrawReadbackList();

    } // if



////////////////////////////// end read back

        iFlashItemIndex = ini->ReadInteger( "FORM", "flashitemindex", 2);

        g_ulFormatStartAddr = strtoul(ini->ReadString("FORM", "FormatStartAddr", "0x00E00000").c_str(), NULL, 16);
        g_ulFormatLength = strtoul(ini->ReadString("FORM", "FormatLength", "0x00200000").c_str(), NULL, 16);
        g_ulNandFormatStartAddr = strtoul(ini->ReadString("FORM", "NandFormatStartAddr", "0x00000000").c_str(), NULL, 16);
        g_ulNandFormatLength = strtoul(ini->ReadString("FORM", "NandFormatLength", "0x08000000").c_str(), NULL, 16);
        g_FormatOption = ini->ReadInteger("FORM", "FormatOption", RESET_TO_FACTORY);

        g_PacketLength = ini->ReadInteger( "TRANS_OPTION", "packet_length", 1024 );
        g_Baudrate_FullSync_Count = ini->ReadInteger( "TRANS_OPTION", "baudrate_full_sync_count", 1 );
        g_SpeedUpBootROMBaudrate = ini->ReadBool( "TRANS_OPTION", "speedup_brom_baudrate", true);

	// NFI Setting
	g_EMI_NFI_Setting.m_nand_acccon = strtoul(ini->ReadString( "EMI", "nand_acccon", "0x000007FF" ).c_str(), NULL, 16);
	// manual DRAM setting
	g_EMI_NFI_Setting.m_emi_gen_a = strtoul(ini->ReadString( "EMI", "emi_gen_a", "0x568996a2" ).c_str(), NULL, 16);
	g_EMI_NFI_Setting.m_emi_gen_b = strtoul(ini->ReadString( "EMI", "emi_gen_b", "0x5b8a69da" ).c_str(), NULL, 16);
	g_EMI_NFI_Setting.m_emi_gen_c = strtoul(ini->ReadString( "EMI", "emi_gen_c", "0x0" ).c_str(), NULL, 16);
        g_EMI_NFI_Setting.m_emi_dram_con_i_mode = strtoul(ini->ReadString( "EMI", "emi_dram_con_i_mode", "0x03a90223" ).c_str(), NULL, 16);
	g_EMI_NFI_Setting.m_emi_dram_con_i_ext_mode = strtoul(ini->ReadString( "EMI", "emi_dram_con_i_ext_mode", "0x03a94000" ).c_str(), NULL, 16);
	g_EMI_NFI_Setting.m_emi_dram_con_k = strtoul(ini->ReadString( "EMI", "emi_dram_con_k", "0x50004564" ).c_str(), NULL, 16);
	g_EMI_NFI_Setting.m_emi_dram_con_l = strtoul(ini->ReadString( "EMI", "emi_dram_con_l", "0x04107777" ).c_str(), NULL, 16);

	// update packet length
	UpdatePacketLength(g_PacketLength);

        delete ini;

        updateMenuItem();
        updateStatusBar();

        // show ts_Download tabsheet in first page
        ts_Download->Show();
}
//---------------------------------------------------------------------------


void __fastcall TMainForm::View_toolbarExecute(TObject *Sender)
{
/*
   if ( tb_Main->Visible )
   {
     tb_Main->Visible = false;
     mi_ToolBar->Checked = false;
   }
   else
   {
     tb_Main->Visible = true;
     mi_ToolBar->Checked = true;
   }
*/
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::View_StatusBarExecute(TObject *Sender)
{
/*
   if ( sb_Main->Visible )
   {
      sb_Main->Visible = false;
      mi_StatusBar->Checked = false;
   }
   else
   {
      sb_Main->Visible = true;
      mi_StatusBar->Checked = true;
   }
*/

⌨️ 快捷键说明

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