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

📄 burn.cpp.svn-base

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

		PostMessage(hWnd, ON_BURNFLASH_MESSAGE, WPARAM(ID+100), LPARAM(MESSAGE_DOWNLOAD_FILE_LEN) );
		
		if(read_len < MAX_PACKET_LENGTH)//last packet
		{
			CloseHandle(hFile);
			break;
		}
    }

    return true;
}

bool BurnFlash::download_file_use_com(char *pc_path, int loadfile_destination_address)
{
	#define MAX_BLOCK_SIZE (4096)
	#define TX_SIZE 2048
	
	HANDLE hFile;
    DWORD fileSize;
    unsigned short cs=0;
    DWORD i;
    unsigned long threadResult=1;

	char *txBuf = NULL;
	DWORD iTxBuf;
	DWORD txBufSize;

	void *txBlk = NULL;
    DWORD txBlkSize;

//	TCHAR text[255];
	CString text;
	char c =0x0d;

	if(NULL == pc_path)
	{
		return false;
	}

	command_download_com(pc_path, loadfile_destination_address, com);
	
//	Sleep(100); //to save cpu time.
	if(WaitForSingleObject(download_init_event, 3000) != WAIT_OBJECT_0)
	{
		ReleaseMutex(download_init_event);
		PostMessage(get_wnd(), ON_BURNFLASH_MESSAGE, WPARAM(get_id()+100), LPARAM(MESSAGE_DOWNLOAD_LOADFILE_FAIL));
		return false;
	}
	
	ResetEvent(download_init_event);
	
    hFile = CreateFile(ConverPathToAbsolute(pc_path), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
	
    if(hFile == INVALID_HANDLE_VALUE)
    {
		return false;
    }
    
    fileSize = GetFileSize(hFile, NULL);
	
    txBuf = (char *)malloc(fileSize+6);
    if(txBuf == NULL)
    {
		return false;
    }
	
    ReadFile(hFile, (void *)(txBuf+4), fileSize, &txBufSize, NULL);
    if(txBufSize != fileSize)
    {
		free(txBuf);
		return false;
    }
	
    *((DWORD *)txBuf) = fileSize+6;   //attach filesize(n+6) 
	
    for(i=4; i<(fileSize+4); i++)
		cs += (BYTE)(txBuf[i]);
    *((WORD *)(txBuf+4+fileSize)) = cs;   //attach checksum 
    
    txBufSize += 6;
    iTxBuf = 0;
	
    CloseHandle(hFile);

	while(1) 
	{
		if((txBufSize - iTxBuf) > TX_SIZE)
			txBlkSize = TX_SIZE;
		else
			txBlkSize = txBufSize-iTxBuf;
		
		txBlk = (void *)(txBuf+iTxBuf);
		
		com.write((char *)txBlk, txBlkSize);

		//if(write_len != txBlkSize)
		//{
		//	free(txBuf);
		//	return false;
		//}

		iTxBuf += txBlkSize;

		download_file_len += txBlkSize;

		PostMessage(get_wnd(), ON_BURNFLASH_MESSAGE, WPARAM(get_id()+100), LPARAM(MESSAGE_DOWNLOAD_FILE_LEN) );
		
		if(iTxBuf >= txBufSize)
			break;
    }

    free((void *)txBuf);

	return true;
	
}

bool BurnFlash::download_u_file(download_file *dFile)
{
	T_WRITE_FILE_DATA write_file;
	char buf[256];

	DWORD  dwSize = 0, read_len = 0;
	HANDLE hFile = NULL;
	
	if((dFile->file_attribute & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY )
	{
		hFile = CreateFile(ConverPathToAbsolute(dFile->file_pc_path) , GENERIC_READ , FILE_SHARE_READ , NULL , 
		OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , NULL);

		if (hFile == INVALID_HANDLE_VALUE) 
		{ 
			sprintf(buf, "[PC PRINT]: OpenFile Error\r\n");
			record_write(buf, strlen(buf), get_id()+config.base_com);
			
			return false;
		}

		dwSize = GetFileSize (hFile, NULL) ; 

		if (dwSize == 0xFFFFFFFF) 
		{ 
			sprintf(buf, "[PC PRINT]: GetFileSize Error\r\n");
			record_write(buf, strlen(buf), get_id()+config.base_com);

			CloseHandle(hFile);
			return false;
		}

        CloseHandle(hFile);
	}

	write_file.File_mode = 0;

	if((dFile->file_attribute & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY )
	{
		write_file.File_mode |= FS_S_IFDIR;
	}
	if((dFile->file_attribute & FILE_ATTRIBUTE_HIDDEN ) == FILE_ATTRIBUTE_HIDDEN )
	{
		write_file.File_mode |= FS_AHIDDEN;
	}
	if((dFile->file_attribute & FILE_ATTRIBUTE_READONLY ) == FILE_ATTRIBUTE_READONLY )
	{
		write_file.File_mode |= FS_UNDELETE;
	}
	if((dFile->file_attribute & FILE_ATTRIBUTE_SYSTEM ) == FILE_ATTRIBUTE_SYSTEM )
	{
		write_file.File_mode |= FS_ASYSTEM;
	}
	
	write_file.File_length = dwSize;

	strcpy(write_file.File_Path , dFile->file_flash_path);

	if( !write_transc_packet(WRITE_FILE_TRANSC, sizeof(T_WRITE_FILE_DATA), (BYTE *)&write_file))
	{
		sprintf(buf, "[PC PRINT]: WRITE TRANSC Error\r\n");
		record_write(buf, strlen(buf), get_id()+config.base_com);

		CloseHandle(hFile);
		return false;
	}

	if( read_transc_ack() != ACK_SUCCESS)
	{
		sprintf(buf, "[PC PRINT]: READ TRANSC ACK Error\r\n");
		record_write(buf, strlen(buf), get_id()+config.base_com);
		
		return false;
	}

	if((dFile->file_attribute & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
		return true;


	PostMessage(get_wnd(), ON_BURNFLASH_MESSAGE, WPARAM(get_id()+100), LPARAM(MESSAGE_DOWNLOADING_FILE) );

	if(download_data(dFile->file_pc_path))
    {
        if(dFile->compare)
		{
			PostMessage(get_wnd(), ON_BURNFLASH_MESSAGE, WPARAM(get_id()+100), LPARAM(MESSAGE_COMPARE_FILE) );

			if(!compare_transc(dFile->file_pc_path))
			{
				PostMessage(get_wnd(), ON_BURNFLASH_MESSAGE, WPARAM(get_id()+100), LPARAM(MESSAGE_COMPARE_FILE_FAIL) );
				return false;
			}

			PostMessage(get_wnd(), ON_BURNFLASH_MESSAGE, WPARAM(get_id()+100), LPARAM(MESSAGE_COMPARE_FILE_SUCCESS) );

		}

		return true;
    }
    else
        return false;
}

bool BurnFlash::download_u_transc(download_file *download_files, int count )
{
	if(bDownEncryptFile)
	{
		bDownEncryptFile = false;
		if(!download_u_file(&encrypt_file))
		{
			return false;
		}
	}
	
	for(int i = 0; i< count; i++)
	{
		if(!download_u_file(&download_files[i]))
		{
			return false;
		}
	}

	return true;
}


bool BurnFlash::download_nandboot_data_transc()
{
    T_WRITE_DATA_DATA write_data;

	DWORD  dwSize = 0;
	HANDLE hFile = NULL;

	hFile = CreateFile(ConverPathToAbsolute(config.nandboot_path) , GENERIC_READ , FILE_SHARE_READ , NULL , 
	OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , NULL);

	if (hFile == INVALID_HANDLE_VALUE) 
	{ 
		return false;
	}

	dwSize = GetFileSize (hFile, NULL) ; 

	if (dwSize == 0xFFFFFFFF) 
	{
		CloseHandle(hFile);
		return false;
	}

    CloseHandle(hFile);

	write_data.Download_Type = DOWNLOAD_TO_NANDFLASH;	
	write_data.Start_Address = 0x0000000;
	write_data.End_Address = CONFIG_ADDR;
	write_data.Backup_Start_Address = 0x0000000;
	write_data.Backup_End_Address = 0x0000000;
    write_data.Backup_Map_Address = 0;
    write_data.map_index = map_index++;

	write_data.Data_Length = dwSize;

	if(!write_transc_packet(WRITE_DATA_TRANSC, sizeof(T_WRITE_DATA_DATA), (BYTE *)&write_data))
	{
		return false;
	}

	if( read_transc_ack() != ACK_SUCCESS)
		return false;

    PostMessage(get_wnd(), ON_BURNFLASH_MESSAGE, WPARAM(get_id()+100), LPARAM(MESSAGE_DOWNLOADING_FILE) );

    if(download_data(config.nandboot_path))
    {
        PostMessage(get_wnd(), ON_BURNFLASH_MESSAGE, WPARAM(get_id()+100), LPARAM(MESSAGE_COMPARE_FILE) );

		if(!compare_transc(config.nandboot_path))
		{
			PostMessage(get_wnd(), ON_BURNFLASH_MESSAGE, WPARAM(get_id()+100), LPARAM(MESSAGE_COMPARE_FILE_FAIL) );
			return false;
		}

		PostMessage(get_wnd(), ON_BURNFLASH_MESSAGE, WPARAM(get_id()+100), LPARAM(MESSAGE_COMPARE_FILE_SUCCESS) );

    }
    else
        return false;

	return true;

}

bool BurnFlash::download_bios_data_transc()
{
    T_WRITE_DATA_DATA write_data;

	DWORD  dwSize = 0;
	HANDLE hFile = NULL;

	hFile = CreateFile(ConverPathToAbsolute(config.bios_path) , GENERIC_READ , FILE_SHARE_READ , NULL , 
	OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , NULL);

	if (hFile == INVALID_HANDLE_VALUE) 
	{ 
		return false;
	}

	dwSize = GetFileSize (hFile, NULL) ; 

	if (dwSize == 0xFFFFFFFF) 
	{
		CloseHandle(hFile);
		return false;
	}

    CloseHandle(hFile);


	if( !download_BIOS_config(dwSize))
        return false;

	write_data.Download_Type = DOWNLOAD_TO_NANDFLASH;
	write_data.Start_Address = config.bios_start_address;
	write_data.End_Address = config.bios_end_address;
	write_data.Backup_Start_Address = config.bios_backup_start_address;
	write_data.Backup_End_Address = config.bios_backup_end_address;
    
    if(config.bios_backup_start_address != 0 &&
        config.bios_backup_end_address != 0)
    {
        write_data.Backup_Map_Address = CONFIG_ADDR + 0x0200;
        
		map_len += ((config.bios_end_address - config.bios_start_address) 
			/ (chip_para.nandflash_parameter.page_per_blk * 
            chip_para.nandflash_parameter.page_size)
            * sizeof(T_U16) + 511) / 512;
    }
    else
        write_data.Backup_Map_Address = 0;


    write_data.map_index = map_index++;

	write_data.Data_Length = dwSize;

	if(!write_transc_packet(WRITE_DATA_TRANSC, sizeof(T_WRITE_DATA_DATA), (BYTE *)&write_data))
	{
		return false;
	}

	if( read_transc_ack() != ACK_SUCCESS)
		return false;

    PostMessage(get_wnd(), ON_BURNFLASH_MESSAGE, WPARAM(get_id()+100), LPARAM(MESSAGE_DOWNLOADING_FILE) );

    if(download_data(config.bios_path))
    {
        PostMessage(get_wnd(), ON_BURNFLASH_MESSAGE, WPARAM(get_id()+100), LPARAM(MESSAGE_COMPARE_FILE) );

		if(!compare_transc(config.bios_path))
		{
			PostMessage(get_wnd(), ON_BURNFLASH_MESSAGE, WPARAM(get_id()+100), LPARAM(MESSAGE_COMPARE_FILE_FAIL) );
			return false;
		}

		PostMessage(get_wnd(), ON_BURNFLASH_MESSAGE, WPARAM(get_id()+100), LPARAM(MESSAGE_COMPARE_FILE_SUCCESS) );
    }
    else
        return false;

	return true;
}

bool BurnFlash::get_para_transc()
{
    BYTE data[MAX_PACKET_LENGTH];
    UINT uploaded_count = 0;
	T_CHIP_SELECT_DATA chip_select;

	chip_select.b_chip_select_loop = config.bPiece_Select_Loop;
	chip_select.b_chip_select[0] = config.bHavePieceZero;
	chip_select.b_chip_select[1] = config.bHavePieceOne;
	chip_select.b_chip_select[2] = config.bHavePieceTwo;
	chip_select.b_chip_select[3] = config.bHavePieceThree;
//	get_piece_select_info();

	memcpy(data, &chip_select, sizeof(T_CHIP_SELECT_DATA));

	if( !write_transc_packet(GET_CHIPPARA_TRANS, 64, data))
		return false;
	
	Sleep(5000);
	
    if(!m_usb.M3USB_UPLOAD(data, 64, &uploaded_count))
        return false;

    if(uploaded_count == 0)
        return false;

    memcpy(&chip_para, data, sizeof(T_CHIPPARA_DATA));

    return true;
}

bool BurnFlash::set_para_transc()
{
    UINT uploaded_count = 0;
    UINT i = 0;

	//获取片选选择数据

    for(i = 0; i < config.nandflash_parameter_count; i++)
    {
        if(chip_para.nandflash_parameter.chip_id == config.nandflash_parameter[i].chip_id)
        {
            memcpy(&chip_para.nandflash_parameter, 
                    &config.nandflash_parameter[i],
                    sizeof(T_NAND_PHY_INFO));
            break;
        }
    }
	
    if(i >= config.nandflash_parameter_count)
        return false;

	if( !write_transc_packet(SET_CHIPPARA_TRANS, 64, (BYTE *)&chip_para))
		return false; 

    if( read_transc_ack() != ACK_SUCCESS)
		return false;

    return true;

} 

bool BurnFlash::construct_zone_detail()
{
    bool fake = false;
    int fake_index = 0;
    int nand_num = 0;
	int partition_num = 0;
    UINT total_size = 0;
	int sectorsize = 0;

	UINT Temp_End_Add = 0;

	double tempSize;

	tempSize = ((double)chip_para.count)*chip_para.nandflash_parameter.page_size *	
		chip_para.nandflash_parameter.page_per_blk * chip_para.nandflash_parameter.blk_num;

	if(tempSize > 0xFFFFFFFF)
	{
		total_size = TOTAL_SIZE_UINT;
	}
	else
	{
		total_size = chip_para.count * chip_para.nandflash_parameter.page_size *
			chip_para.nandflash_parameter.page_per_blk * chip_para.nandflash_parameter.blk_num;
	}

	sectorsize = chip_para.nandflash_parameter.page_size;

    information.Zone_Cnt = config.format_count;

    information.TotalLen = sizeof(T_INFOMATION) + sizeof(T_ZONE_DATAIL) * information.Zone_Cnt;

    information.Zone_Group = (TP_ZONE_DATAIL)malloc(information.Zone_Cnt * sizeof(T_ZONE_DATAIL));

    if(information.Zone_Group == NULL)
        return false;

⌨️ 快捷键说明

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