📄 burn.cpp.svn-base
字号:
for(int i = 0; i < config.format_count; i++)
{
if(config.formats[i].Start_Address > total_size)
{
config.formats[i].Start_Address = total_size;
}
Temp_End_Add = config.formats[i].End_Address;
if(config.formats[i].End_Address > total_size)
{
Temp_End_Add = total_size;
}
if(config.formats[i].ZoneType == ZT_FAKE)
{
fake = true;
fake_index = i;
int Start_Block = config.formats[i].Start_Address /
(chip_para.nandflash_parameter.page_per_blk * chip_para.nandflash_parameter.page_size);
information.Zone_Group[i].StartAddr = Start_Block - information.BootBlock;
information.Zone_Group[i].AddrCnt = (/*config.formats[i].End_Address*/Temp_End_Add - config.formats[i].Start_Address) /
(chip_para.nandflash_parameter.page_per_blk * chip_para.nandflash_parameter.page_size);
information.Zone_Group[i].Subarea_Flag = AK_TRUE;
information.Zone_Group[i].Nand_NO = nand_num++;
information.Zone_Group[i].Partition_NO = partition_num++;
}
else
{
if(fake && config.formats[i].Start_Address >= config.formats[fake_index].Start_Address
&& config.formats[i].Start_Address < config.formats[fake_index].End_Address
&& /*config.formats[i].End_Address*/Temp_End_Add > config.formats[fake_index].Start_Address
&& /*config.formats[i].End_Address*/Temp_End_Add <= config.formats[fake_index].End_Address)
{
information.Zone_Group[i].StartAddr = (config.formats[i].Start_Address - config.formats[fake_index].Start_Address) / sectorsize;
information.Zone_Group[i].AddrCnt = (/*config.formats[i].End_Address*/Temp_End_Add - config.formats[i].Start_Address) / sectorsize;
information.Zone_Group[i].Subarea_Flag = AK_TRUE;
information.Zone_Group[i].Nand_NO = nand_num - 1;
information.Zone_Group[i].Partition_NO = partition_num++;
}
else
{
fake = false;
int Start_Block = config.formats[i].Start_Address /
(chip_para.nandflash_parameter.page_per_blk * chip_para.nandflash_parameter.page_size);
information.Zone_Group[i].StartAddr = Start_Block - information.BootBlock;
information.Zone_Group[i].AddrCnt = (/*config.formats[i].End_Address*/Temp_End_Add - config.formats[i].Start_Address) /
(chip_para.nandflash_parameter.page_per_blk * chip_para.nandflash_parameter.page_size);
information.Zone_Group[i].Subarea_Flag = AK_FALSE;
information.Zone_Group[i].Nand_NO = nand_num++;
information.Zone_Group[i].Partition_NO = partition_num++;
}
}
information.Zone_Group[i].Open_Flag = (T_BOOL)config.formats[i].bOpenZone;
information.Zone_Group[i].Type = config.formats[i].ZoneType;
information.Zone_Group[i].Symbol = config.formats[i].Disk_Name - 'A';
information.Zone_Group[i].Nand_Char = config.formats[i].ProtectType;
information.Zone_Group[i].Medium_Char = information.Zone_Group[i].Nand_Char;
}
return true;
}
TP_INFOMATION BurnFlash::get_information()
{
return &information;
}
DWORD WINAPI BurnFlash::burn_thread(LPVOID para)
{
BurnFlash *pburn = (BurnFlash *)para;
//TCHAR text[255];
CString text;
char c = 0x0d;
bool usbini = false, transc_ret = false;
HWND hWnd;
int port;
hWnd = pburn->get_wnd();
port = pburn->get_id();
//step1 设置寄存器
PostMessage(hWnd, ON_BURNFLASH_MESSAGE, WPARAM(port+100), LPARAM(MESSAGE_START_SET_REGISTER));
transc_ret = pburn->set_registers();
if(!transc_ret)
{
PostMessage(hWnd, ON_BURNFLASH_MESSAGE, WPARAM(port+100), LPARAM(MESSAGE_SET_REGISTER_FAIL));
return -1;
}
PostMessage(hWnd, ON_BURNFLASH_MESSAGE, WPARAM(port+100), LPARAM(MESSAGE_SET_REGISTER_SUCCESS));
Sleep(1000);
PostMessage(hWnd, ON_BURNFLASH_MESSAGE, WPARAM(port+100), LPARAM(MESSAGE_START_DOWNLOAD_LOADFILE));
//step 2 download Load程序
if(config.bUBoot)
{
transc_ret = pburn->download_file_use_usb(config.loadfile_path, config.loadfile_destination_address);
}
else
{
transc_ret = pburn->download_file_use_com(config.loadfile_path, config.loadfile_destination_address);
}
if( !transc_ret )
{
PostMessage(hWnd, ON_BURNFLASH_MESSAGE, WPARAM(port+100), LPARAM(MESSAGE_DOWNLOAD_LOADFILE_FAIL));
return -1;
}
PostMessage(hWnd, ON_BURNFLASH_MESSAGE, WPARAM(port+100), LPARAM(MESSAGE_DOWNLOAD_LOADFILE_SUCCESS));
Sleep(1000);
PostMessage(hWnd, ON_BURNFLASH_MESSAGE, WPARAM(port+100), LPARAM(MESSAGE_START_INIT_USB));
//////////////////////////////////////////////////////////////////////////
if(config.bUBoot)
{
transc_ret = command_go_usb(config.loadfile_destination_address, pburn->m_usb);
if(!transc_ret)
{
return -1;
}
}
else
{
//只允许一个线程初始化USB
if(WaitForSingleObject(mutex_usb, 150000) != WAIT_OBJECT_0)
{
ReleaseMutex(mutex_usb);
PostMessage(hWnd, ON_BURNFLASH_MESSAGE, WPARAM(port+100), LPARAM(MESSAGE_INIT_USB_FAIL));
return -1;
}
//step 3 run load
command_go_com(config.loadfile_destination_address, pburn->com);
//init USB
if(config.init_usb == INIT_USB_GPIIO)
{
char chr = '0';
pburn->com.write(&chr, 1);//set gpio
text.Format("0x%x", config.init_usb_gpio_number);//gpio number
pburn->com.write(text);
pburn->com.write(&c, 1);
}
else
{
char chr = '1';
pburn->com.write(&chr, 1);//set register
text.Format("0x%x", config.init_usb_register);
pburn->com.write(text);
pburn->com.write(&c, 1);
text.Format("0x%x", config.init_usb_register_bit);
pburn->com.write(text);
pburn->com.write(&c, 1);
}
//等待USB初始化成功
// WaitForSingleObject(usb_init_event, 10000);
if(WaitForSingleObject(usb_init_event, 10000) != WAIT_OBJECT_0)
{
if(g_bInit)
{
g_bInit = FALSE;
if(WaitForSingleObject(usb_init_event, 30000) != WAIT_OBJECT_0)
{
ReleaseMutex(mutex_usb);
PostMessage(hWnd, ON_BURNFLASH_MESSAGE, WPARAM(port+100), LPARAM(MESSAGE_INIT_USB_FAIL));
// return -1;
}
}
else
{
ReleaseMutex(mutex_usb);
PostMessage(hWnd, ON_BURNFLASH_MESSAGE, WPARAM(port+100), LPARAM(MESSAGE_INIT_USB_FAIL));
return -1;
}
}
ResetEvent(usb_init_event);
//取得USB号
usb_name_index = usb_name[port];
Sleep(3000);
usbini = pburn->m_usb.M3USBOPEN();
for(int i = 0; i < 10; i++)
{
if(strlen(usb_name_index) != 0)
break;
Sleep(1000);
usbini = pburn->m_usb.M3USBOPEN();
}
ReleaseMutex(mutex_usb);
/* extern CString m_arrive_name[16];
int i;
usbini = false;
for(i = 15; i >= 0; i--)
{
if(!m_arrive_name[i].IsEmpty())
{
usbini = pburn->m_usb.M3USBOPEN(m_arrive_name[i]);
if(!usbini)
{
Sleep(1000);
usbini = pburn->m_usb.M3USBOPEN(m_arrive_name[i]);
}
m_arrive_name[i].Empty();
break;
}
}
for(i = 0; i < 16; i++)
{
m_arrive_name[i].Empty();
}
ReleaseMutex(mutex_usb);
*/
if(!usbini)
{
PostMessage(hWnd, ON_BURNFLASH_MESSAGE, WPARAM(port+100), LPARAM(MESSAGE_SET_CHIP_PARA_FAIL));
return -1;
}
}
//step5 download file
PostMessage(hWnd, ON_BURNFLASH_MESSAGE, WPARAM(port+100), LPARAM(MESSAGE_START_TEST_TRANSC));
transc_ret = pburn->test_transc();
if(!transc_ret)
{
PostMessage(hWnd, ON_BURNFLASH_MESSAGE, WPARAM(port+100), LPARAM(MESSAGE_TEST_TRANSC_FAIL));
return -1;
}
if(config.bHaveNandflash)
{
PostMessage(hWnd, ON_BURNFLASH_MESSAGE, WPARAM(port+100), LPARAM(MESSAGE_GET_CHIP_PARA));
transc_ret = pburn->get_para_transc();
if(!transc_ret)
{
PostMessage(hWnd, ON_BURNFLASH_MESSAGE, WPARAM(port+100), LPARAM(MESSAGE_GET_CHIP_PARA_FAIL));
return -1;
}
if(!pburn->if_find_chipid())
{
PostMessage(hWnd, ON_BURNFLASH_MESSAGE, WPARAM(port+100), LPARAM(MESSAGE_SET_CHIP_PARA));
transc_ret = pburn->set_para_transc();
if(!transc_ret)
{
PostMessage(hWnd, ON_BURNFLASH_MESSAGE, WPARAM(port+100), LPARAM(MESSAGE_SET_CHIP_PARA_FAIL));
return -1;
}
}
else
{
PostMessage(hWnd, ON_BURNFLASH_MESSAGE, WPARAM(port+100), LPARAM(MESSAGE_GET_CHIP_PARA_FAIL));
return -1;
}
double tempSize;
UINT total_size;
T_CHIPPARA_DATA chip_para = pburn->chip_para;
T_NAND_PHY_INFO nandpara = chip_para.nandflash_parameter;
tempSize = ((double)chip_para.count) * nandpara.page_size * nandpara.page_per_blk * nandpara.blk_num;
if(tempSize > 0xFFFFFFFF)
{
total_size = TOTAL_SIZE_UINT;
}
else
{
/* Aug.06,07 - re-calculate to avoid mistake(the converting from double to UINT). */
total_size = chip_para.count * nandpara.page_size * nandpara.page_per_blk * nandpara.blk_num;
}
if(CheckFormatData(total_size) != 0)
{
PostMessage(hWnd, ON_BURNFLASH_MESSAGE, WPARAM(port+100), LPARAM(MESSAGE_CHECK_FORMAT_DATA_FAIL));
return -1;
}
}
PostMessage(hWnd, ON_BURNFLASH_MESSAGE, WPARAM(port+100), LPARAM(MESSAGE_START_TEST_TRANSC));
transc_ret = set_infor_trans(pburn->get_id(), pburn->bDownEncryptFile,
pburn->encrypt_file, pburn->m_usb);
if(!transc_ret)
{
PostMessage(hWnd, ON_BURNFLASH_MESSAGE, WPARAM(port+100), LPARAM(MESSAGE_TEST_TRANSC_FAIL));
return -1;
}
PostMessage(hWnd, ON_BURNFLASH_MESSAGE, WPARAM(port+100), LPARAM(MESSAGE_START_ERASE_TRANSC));
transc_ret = pburn->erase_transc();
if(!transc_ret)
{
PostMessage(hWnd, ON_BURNFLASH_MESSAGE, WPARAM(port+100), LPARAM(MESSAGE_ERASE_TRANSC_FAIL));
return -1;
}
PostMessage(hWnd, ON_BURNFLASH_MESSAGE, WPARAM(port+100), LPARAM(MESSAGE_START_FORMAT_TRANSC));
transc_ret = pburn->format_transc();
if(!transc_ret)
{
PostMessage(hWnd, ON_BURNFLASH_MESSAGE, WPARAM(port+100), LPARAM(MESSAGE_FORMAT_TRANSC_FAIAL));
return -1;
}
info_record_int(port);
char data[512];
memcpy(data, (void *)pburn->get_information(), sizeof(T_INFOMATION));
memcpy(data + sizeof(T_INFOMATION), (pburn->get_information())->Zone_Group,
sizeof(T_ZONE_DATAIL) * (pburn->get_information())->Zone_Cnt);
info_record_write(data, 512, port);
CString str;
info_record_write("\n", 1, port);
for(int i = 0; i < (pburn->get_information())->Zone_Cnt; i++)
{
str.Format("information.Zone_Group[%d].StartAddr = 0x%x\n", i, (pburn->get_information())->Zone_Group[i].StartAddr);
info_record_write(str, str.GetLength(), port);
str.Format("information.Zone_Group[%d].AddrCnt = 0x%x\n", i, (pburn->get_information())->Zone_Group[i].AddrCnt);
info_record_write(str, str.GetLength(), port);
str.Format("information.Zone_Group[%d].Subarea_Flag = 0x%x\n", i, (pburn->get_information())->Zone_Group[i].Subarea_Flag);
info_record_write(str, str.GetLength(), port);
str.Format("information.Zone_Group[%d].Open_Flag = 0x%x\n", i, (pburn->get_information())->Zone_Group[i].Open_Flag);
info_record_write(str, str.GetLength(), port);
str.Format("information.Zone_Group[%d].Type = 0x%x\n", i, (pburn->get_information())->Zone_Group[i].Type);
info_record_write(str, str.GetLength(), port);
str.Format("information.Zone_Group[%d].Symbol = 0x%x\n", i, (pburn->get_information())->Zone_Group[i].Symbol);
info_record_write(str, str.GetLength(), port);
str.Format("information.Zone_Group[%d].Nand_NO = 0x%x\n", i, (pburn->get_information())->Zone_Group[i].Nand_NO);
info_record_write(str, str.GetLength(), port);
str.Format("information.Zone_Group[%d].Partition_NO = 0x%x\n", i, (pburn->get_information())->Zone_Group[i].Partition_NO);
info_record_write(str, str.GetLength(), port);
str.Format("information.Zone_Group[%d].Nand_Char = 0x%x\n", i, (pburn->get_information())->Zone_Group[i].Nand_Char);
info_record_write(str, str.GetLength(), port);
str.Format("information.Zone_Group[%d].Medium_Char = 0x%x\n", i, (pburn->get_information())->Zone_Group[i].Medium_Char);
info_record_write(str, str.GetLength(), port);
}
info_record_free(port);
PostMessage(hWnd, ON_BURNFLASH_MESSAGE, WPARAM(port+100), LPARAM(MESSAGE_START_DOWNLOAD_FILE));
if(config.bNandBoot)
{
transc_ret = pburn->download_nandboot_data_transc();
if(!transc_ret)
{
PostMessage(hWnd, ON_BURNFLASH_MESSAGE, WPARAM(port+100), LPARAM(MESSAGE_DOWNLOAD_FILE_FAIL));
return -1;
}
transc_ret = pburn->download_bios_data_transc();
if(!transc_ret)
{
PostMessage(hWnd, ON_BURNFLASH_MESSAGE, WPARAM(port+100), LPARAM(MESSAGE_DOWNLOAD_FILE_FAIL));
return -1;
}
}
extern download_file download_data_files[MAX_DOWNLOAD_FILES];
extern int download_data_files_count;
// transc_ret = pburn->download_data_transc(config.download_files, config.download_file_count);
transc_ret = pburn->download_data_transc(download_data_files, download_data_files_count);
if(!transc_ret)
{
PostMessage(hWnd, ON_BURNFLASH_MESSAGE, WPARAM(port+100), LPARAM(MESSAGE_DOWNLOAD_FILE_FAIL));
return -1;
}
if(pburn->get_mapindex() > 1)
{
if(!pburn->write_config())
{
PostMessage(hWnd, ON_BURNFLASH_MESSAGE, WPARAM(port+100), LPARAM(MESSAGE_COMPARE_FILE_FAIL));
return -1;
}
}
extern download_file download_u_files[MAX_DOWNLOAD_FILES];
extern int download_u_files_count;
if(pburn->bDownEncryptFile || (download_u_files_count != 0))
{
PostMessage(hWnd, ON_BURNFLASH_MESSAGE, WPARAM(port+100), LPARAM(MESSAGE_START_DOWNLOAD_RESOURCE));
transc_ret = pburn->download_u_transc(download_u_files, download_u_files_count);
if(!transc_ret)
{
PostMessage(hWnd, ON_BURNFLASH_MESSAGE, WPARAM(port+100), LPARAM(MESSAGE_DOWNLOAD_RESOURCE_FAIL));
return -1;
}
}
extern download_file download_resource[MAX_DOWNLOAD_FILES];
extern int download_resource_count;
if(download_resource_count != 0)
{
PostMessage(hWnd, ON_BURNFLASH_MESSAGE, WPARAM(port+100), LPARAM(MESSAGE_START_DOWNLOAD_RESOURCE));
transc_ret = pburn->download_u_transc(download_resource, download_resource_count);
if(!transc_ret)
{
PostMessage(hWnd, ON_BURNFLASH_MESSAGE, WPARAM(port+100), LPARAM(MESSAGE_DOWNLOAD_RESOURCE_FAIL));
return -1;
}
}
#ifdef DOWNLOAD_FAT_IMAGE
PostMessage(hWnd, ON_BURNFLASH_MESSAGE, WPARAM(port+100), LPARAM(MESSAGE_START_DOWNLOAD_FAT_IMAGE));
transc_ret = pburn->fat_transc();
if(!transc_ret)
{
PostMessage(hWnd, ON_BURNFLASH_MESSAGE, WPARAM(port+100), LPARAM(MESSAGE_DOWNLOAD_FAT_IMAGE_FAIL));
return -1;
}
#endif
PostMessage(hWnd, ON_BURNFLASH_MESSAGE, WPARAM(port+100), LPARAM(MESSAGE_TASK_COMPLETE));
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -