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

📄 burn.cpp.svn-base

📁 vc环境下编译的一个对USB设备进行烧录的驱动程序
💻 SVN-BASE
📖 第 1 页 / 共 4 页
字号:
    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 + -