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

📄 burnflash.cpp

📁 在高通的手机平台下,一个下载手机.bin文件到手机的flash中的工具,包含PC端的程序代码和运行在基带处理器中的代码.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//	 TRUE
//	 FASLE
// PRE-CONDITIONS:
//    (1) The phone must work on a normal state. 
//	  (2) The phone and the PC connect with a cable through COM1/COM2
//
// POST-CONDITIONS:
//    None
//
// IMPORTANT NOTES:
//    None
//
//--------------------------------------------------------------------------------------------------
BOOL 
CBurnFlash::ResetPhone()
{
	cout << TAB_SUB_OPR << "send Reset Cmd to phone." << endl;		
	FormResetCMD();
	BOOL rlt = SendAndWaitRsp();
	
	cout << TAB_SUB_OPR << "restore PC BaudRate to 38400." << endl;	
	theComm.SetBaudRateTo38400();
	
	return rlt;
}

//--------------------------------------------------------------------------------------------------
//Internal Member Fucntions
//--------------------------------------------------------------------------------------------------
void 
CBurnFlash::FormWriteCMD(DWORD dwDstAddr, BYTE* pBuf, WORD wLen)
{
	BYTE	tmp;
	
	START_BUILDING_PACKET(m_packet_snd);
	ADD_BYTE_TO_PACKET(m_packet_snd, CMD_WRITE);
	
	tmp = B_PTR(dwDstAddr)[2];
	ADD_BYTE_TO_PACKET(m_packet_snd, tmp);
	tmp = B_PTR(dwDstAddr)[1];
	ADD_BYTE_TO_PACKET(m_packet_snd, tmp);
	tmp = B_PTR(dwDstAddr)[0]; 
	ADD_BYTE_TO_PACKET(m_packet_snd, tmp);
	
	tmp = B_PTR(wLen)[1];
	ADD_BYTE_TO_PACKET(m_packet_snd, tmp);
	tmp = B_PTR(wLen)[0];
	ADD_BYTE_TO_PACKET(m_packet_snd, tmp);
	
	for(int i = 0; i < wLen; i++)
		ADD_BYTE_TO_PACKET(m_packet_snd, pBuf[i]);

	FINISH_BUILDING_PACKET(m_packet_snd);
}

void 
CBurnFlash::FormGoCMD(DWORD dwAddr)
{
	BYTE	tmp;

	START_BUILDING_PACKET(m_packet_snd);
	ADD_BYTE_TO_PACKET(m_packet_snd, CMD_GO);
	
	tmp = B_PTR(dwAddr)[3];
	ADD_BYTE_TO_PACKET(m_packet_snd, tmp);
	tmp = B_PTR(dwAddr)[2];
	ADD_BYTE_TO_PACKET(m_packet_snd, tmp);
	tmp = B_PTR(dwAddr)[1];
	ADD_BYTE_TO_PACKET(m_packet_snd, tmp);
	tmp = B_PTR(dwAddr)[0];
	ADD_BYTE_TO_PACKET(m_packet_snd, tmp);
	
	FINISH_BUILDING_PACKET(m_packet_snd);
}

void 
CBurnFlash::FormResetCMD()
{
	START_BUILDING_PACKET(m_packet_snd);
	ADD_BYTE_TO_PACKET(m_packet_snd, CMD_RESET);
	FINISH_BUILDING_PACKET(m_packet_snd);
}

void 
CBurnFlash::FormWriteFlashCMD(DWORD dwDstAddr, BYTE* pBuf, DWORD dwLen,BOOL bCode)
{
	BYTE	tmp;
	
	START_BUILDING_PACKET(m_packet_snd);
	if(bCode)
		ADD_BYTE_TO_PACKET(m_packet_snd, CMD_WRITE_CODE_FLASH);
	else
		ADD_BYTE_TO_PACKET(m_packet_snd, CMD_WRITE_DATA_FLASH);

	tmp = B_PTR(dwDstAddr)[3];
	ADD_BYTE_TO_PACKET(m_packet_snd, tmp);
	tmp = B_PTR(dwDstAddr)[2];
	ADD_BYTE_TO_PACKET(m_packet_snd, tmp);
	tmp = B_PTR(dwDstAddr)[1];
	ADD_BYTE_TO_PACKET(m_packet_snd, tmp);
	tmp = B_PTR(dwDstAddr)[0]; 
	ADD_BYTE_TO_PACKET(m_packet_snd, tmp);

	tmp = B_PTR(dwLen)[3];
	ADD_BYTE_TO_PACKET(m_packet_snd, tmp);
	tmp = B_PTR(dwLen)[2];
	ADD_BYTE_TO_PACKET(m_packet_snd, tmp);
	tmp = B_PTR(dwLen)[1];
	ADD_BYTE_TO_PACKET(m_packet_snd, tmp);
	tmp = B_PTR(dwLen)[0];
	ADD_BYTE_TO_PACKET(m_packet_snd, tmp);
	
	for(DWORD i = 0; i < dwLen; i++)
		ADD_BYTE_TO_PACKET(m_packet_snd, pBuf[i]);
	
	FINISH_BUILDING_PACKET(m_packet_snd);
}

void 
CBurnFlash::FormEraseFlashCMD(DWORD dwDstAddr, DWORD dwLen, BOOL bCode)
{
	BYTE	tmp;

	START_BUILDING_PACKET(m_packet_snd);
	if(bCode)
		ADD_BYTE_TO_PACKET(m_packet_snd, CMD_ERASE_CODE_FLASH);
	else
		ADD_BYTE_TO_PACKET(m_packet_snd, CMD_ERASE_DATA_FLASH);

	tmp = B_PTR(dwDstAddr)[3];
	ADD_BYTE_TO_PACKET(m_packet_snd, tmp);
	tmp = B_PTR(dwDstAddr)[2];
	ADD_BYTE_TO_PACKET(m_packet_snd, tmp);
	tmp = B_PTR(dwDstAddr)[1];
	ADD_BYTE_TO_PACKET(m_packet_snd, tmp);
	tmp = B_PTR(dwDstAddr)[0]; 
	ADD_BYTE_TO_PACKET(m_packet_snd, tmp);

	tmp = B_PTR(dwLen)[3];
	ADD_BYTE_TO_PACKET(m_packet_snd, tmp);
	tmp = B_PTR(dwLen)[2];
	ADD_BYTE_TO_PACKET(m_packet_snd, tmp);
	tmp = B_PTR(dwLen)[1];
	ADD_BYTE_TO_PACKET(m_packet_snd, tmp);
	tmp = B_PTR(dwLen)[0];
	ADD_BYTE_TO_PACKET(m_packet_snd, tmp);

	FINISH_BUILDING_PACKET(m_packet_snd);
}

void 
CBurnFlash::FormChangeBaudRateCMD(baud_rate_type baud_rate)
{
	BYTE	tmp;

	START_BUILDING_PACKET(m_packet_snd);
	ADD_BYTE_TO_PACKET(m_packet_snd, CMD_CHANGE_BAUD_RATE);

 	tmp = (byte)baud_rate;
	ADD_BYTE_TO_PACKET(m_packet_snd, tmp);

	FINISH_BUILDING_PACKET(m_packet_snd);
}
BOOL 
CBurnFlash::SendAndWaitRsp()
{
	const BYTE *data = (BYTE*) m_packet_snd->buf;
	BYTE cPacketFlag = *data;
	
	if(m_packet_snd->broken == TRUE)
	{
		cout << "the transmit packet is broken in dload_transmit_packet." << endl;
		return false;
	}
	
	theComm.TransmitPacket((BYTE*)m_packet_snd);
	
	BYTE cWait;

	memset(m_rcv_buf, 0, MAX_PACKET_LEN);

	if(cPacketFlag == CMD_ERASE_CODE_FLASH || cPacketFlag == CMD_ERASE_DATA_FLASH )
		cWait= 240; 
	else if(cPacketFlag == CMD_WRITE_CODE_FLASH || cPacketFlag == CMD_WRITE_DATA_FLASH)
		cWait= 40; 
	else
		cWait = 5; 

	if(theComm.RcvPacket ((BYTE*)m_rcv_buf, true, cWait) == 0)
	{
		cout << "receive response is overtime in dload_transmit_packet." << endl;
		return false;
	}

	WORD wKey = 0xFFFF;
	
	switch(m_rcv_buf[0])
	{
	  case CMD_ACK:
		  return true;
	  case CMD_NAK:
	  default:
			B_PTR(wKey)[1]  = m_rcv_buf[1];	      
			B_PTR(wKey)[0]  = m_rcv_buf[2];
		switch(wKey)
		{
		case 0x0001:
			cout << "receive rsp:NAK_INVALID_FCS." << endl;
			break;
		case 0x0002:
			cout << "receive rsp:NAK_INVALID_DEST." << endl;
			break;
 		case 0x0003:
			cout << "receive rsp:NAK_INVALID_LEN." << endl;
			break;   
		case 0x0004:
			cout << "receive rsp:NAK_EARLY_END." << endl;
			break;     
		case 0x0005:
			cout << "receive rsp:NAK_TOO_LARGE." << endl;
			break;     
		case 0x0006:
			cout << "receive rsp:NAK_INVALID_CMD." << endl;
			break;   
  		case 0x0007:
			cout << "receive rsp:NAK_FAILED." << endl;
			break;        
  		case 0x0008:
			cout << "receive rsp:NAK_WRONG_IID." << endl;
			break;
  		case 0x0009:
			cout << "receive rsp:NAK_BAD_VPP." << endl;
			break; 
  		case 0x000a:
			cout << "receive rsp:NAK_VERIFY_FAILED." << endl;
			break;
		case 0x000b:
			cout << "receive rsp:NAK_NO_SEC_CODE." << endl;
			break;
		case 0x000c:
			cout << "receive rsp:NAK_BAD_SEC_CODE." << endl;
			break;
		default:
			cout << "receive rsp:unknown error." << endl;
		}
		return false;
	}

	return false;
} 

BOOL 
CBurnFlash::RAMFileExist()
{
	int hRAMFile = _open("dlram.bin", _O_BINARY | _O_RDONLY,_S_IREAD);
	
	if( hRAMFile == -1 )
		return false;

	_close(hRAMFile);

	return true;
}

int 
CBurnFlash::LoadRAMFile(char* strFile)
{
	BYTE buf[MAX_PACKET_LEN];
	DWORD dwDstAddr = RAM_BASE;
	DWORD dwMaxReadSize = 7* 1024;
	
	DWORD dwLen = 0;
	
	int hFile = _open(strFile, _O_BINARY | _O_RDONLY,_S_IREAD);
	
	if( hFile == -1 || (dwLen = _filelength(hFile)) == 0)
	{	
		TRACE0("\r\nopen RAM File Err.\r\n");
		if(hFile != -1)
			_close(hFile);
		return ERR_NO_VALID_RAM_FILE;
	}

	WORD wRead = 0;
	while(1)
	{
		wRead = _read(hFile, buf, dwMaxReadSize);
		if(wRead == 0)
			break;

		FormWriteCMD(dwDstAddr, buf, wRead);	

		if( !SendAndWaitRsp())
		{
			TRACE0("\r\nsend RAMfile fail.\r\n");
			_close(hFile);
			return ERR_COMM_FAIL;
		}

		dwDstAddr += wRead;
	}


		
	//send go_cmd
	FormGoCMD(RAM_BASE);
	
	if( !SendAndWaitRsp())
	{
		TRACE0("\r\nsend go_cmd fail.\r\n");
		_close(hFile);
		return ERR_COMM_FAIL;
	}

	_close(hFile);

	return SUCCESS;
}

⌨️ 快捷键说明

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