📄 burnflash.cpp
字号:
// 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 + -