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

📄 procdiag.cpp

📁 在高通的手机平台下,一个下载手机.bin文件到手机的flash中的工具,包含PC端的程序代码和运行在基带处理器中的代码.
💻 CPP
字号:
// NAME: ProcDiag.cpp
//--------------------------------------------------------------------------------------------------
//
// GENERAL DESCRIPTION
//
//	This module provides the implementation of the interface with the phone DiagTask. 
//--------------------------------------------------------------------------------------------------
//
// Revision History:
//                             Modification     Tracking
// Author                          Date          Number     Description of Changes
// -------------------------   ------------    ----------   ----------------------------------------
//
// Portability: 
//	This module can be portable to other C++ compilers or Win32 platforms. 

//--------------------------------------------------------------------------------------------------
//                                       INCLUDE FILES
//--------------------------------------------------------------------------------------------------

#include "StdAfx.h"
#include "common.h"
#include "ProcDiag.h"
#include "DiagCmd.h"
#include "UART.h"
#include "BurnFlash.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

using namespace std;

//--------------------------------------------------------------------------------------------------
//                                     ENUM
//--------------------------------------------------------------------------------------------------
enum {
    MODE_OFFLINE_A_F,           /* Go to offline analog */
    MODE_OFFLINE_D_F,           /* Go to offline digital */
    MODE_RESET_F,               /* Reset. Only exit from offline */
    MODE_MAX_F,                 /* Last (and invalid) mode enum value */
    MODE_16BIT_SIZE = 0x7FFF
} diag_mode_enum_type;

//--------------------------------------------------------------------------------------------------
//                                     GLOBAL VARIABLES
//--------------------------------------------------------------------------------------------------

CProcDiag theDiag;				//the unique instance for the application

//--------------------------------------------------------------------------------------------------
//                                     CLASS IMPLEMENTATION
//--------------------------------------------------------------------------------------------------
//
// Construction/Destruction
//--------------------------------------------------------------------------------------------------
CProcDiag::CProcDiag()
{
	m_packet_snd = new pkt_buffer_type;
	if(m_packet_snd == NULL)
	{
		cout << "memory new error!" << endl;
		exit(1);
	}
}

CProcDiag::~CProcDiag()
{
	if(m_packet_snd != NULL)
	{
		delete m_packet_snd;
		m_packet_snd = NULL;
	}
}
//--------------------------------------------------------------------------------------------------
// External Member Fucntions
//--------------------------------------------------------------------------------------------------
//
// FUNCTION: CProcDiag::SendDloadCmd
//
// DESCRIPTION: 
//		This function writes the phone S/W to the specific Flash address.
//
// ARGUMENTS PASSED:
//		None
// RETURN VALUE:
//		SUCCESS
//		ERR_SND_CHG_TO_OFFLINE_CMD
//		ERR_COMM_FAIL
// 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
//--------------------------------------------------------------------------------------------------
BYTE 
CProcDiag::SendDloadCmd()
{
	BYTE rlt = ChangeToOffline();
	if(rlt != SUCCESS)
		return rlt;
	
	Sleep(6000);
	
	START_BUILDING_PACKET(m_packet_snd);
	ADD_BYTE_TO_PACKET(m_packet_snd, DIAG_DLOAD_F);
	FINISH_BUILDING_PACKET(m_packet_snd);

	if( !SendAndWaitRsp())
	{
		cout << TAB_SUB_OPR << "send download fail." << endl;
		TRACE0("\r\nsend download fail!\r\n");
		return ERR_COMM_FAIL;
	}

	return SUCCESS;
}
//--------------------------------------------------------------------------------------------------
// Internal Member Fucntions
//--------------------------------------------------------------------------------------------------
BOOL 
CProcDiag::SendAndWaitRsp()
{
	const BYTE *data;
	
	data = (BYTE*) m_packet_snd->buf;
	
	if(m_packet_snd->broken == TRUE)
	{
		TRACE0("\r\nthe transmit packet is broken in diag_transmit_packet!\r\n");
		return false;
	}
	
	theComm.TransmitPacket((BYTE*)m_packet_snd);

	memset(m_rcv_buf, 0, MAX_PACKET_LEN);

	if(theComm.RcvPacket (m_rcv_buf, false) == 0)
	{
		TRACE("\r\nreceive response is overtime in diag_transmit_packet!\r\n");
		return false;
	}

	switch(m_packet_snd->buf[0])
	{
		case DIAG_DLOAD_F:
			switch(m_rcv_buf[0])
			{
			case DIAG_DLOAD_F:
				return true;
			case DIAG_BAD_CMD_F:
			case DIAG_BAD_LEN_F:
			case DIAG_BAD_DEV_F:
			case DIAG_BAD_MODE_F:
			default:
				TRACE0("receive BAD response in diag_dload_cmd!");
				return false;
			}
			break;
		case DIAG_CONTROL_F:
			if(m_rcv_buf[0] == DIAG_CONTROL_F)
				return true;
			else
				break;
	    case DIAG_DIAG_VER_F:
			if(m_rcv_buf[0] == DIAG_DIAG_VER_F)
				return true;
			else
				break;
		default:
			break;
	}

	return false;
} 

BYTE 
CProcDiag::ChangeToOffline()
{
	BYTE  cTmp;
	WORD wTmp = MODE_OFFLINE_D_F;

	START_BUILDING_PACKET(m_packet_snd);
	ADD_BYTE_TO_PACKET(m_packet_snd, DIAG_CONTROL_F);
	
	cTmp = B_PTR(wTmp)[0];
	ADD_BYTE_TO_PACKET(m_packet_snd, cTmp);
	cTmp = B_PTR(wTmp)[1];
	ADD_BYTE_TO_PACKET(m_packet_snd, cTmp);
	
	FINISH_BUILDING_PACKET(m_packet_snd);

	if( !SendAndWaitRsp())
	{
		cout << TAB_SUB_OPR << "send offline fail." << endl;
		TRACE0("\r\nsend offline fail!\r\n");
		return ERR_SND_CHG_TO_OFFLINE_CMD;
	}

	return SUCCESS;
}



BYTE 
CProcDiag::SayHello()
{
    /* Send a DIAG_DIAG_VER_F diag command to check if it is in diag download mode */

    printf("111111111111111111111111111111");


	START_BUILDING_PACKET(m_packet_snd);

	ADD_BYTE_TO_PACKET(m_packet_snd, DIAG_DIAG_VER_F);
	
	FINISH_BUILDING_PACKET(m_packet_snd);

	if( !SendAndWaitRsp())
	{
		return ERR_UNKNOWN;
	}

	return SUCCESS;
}

⌨️ 快捷键说明

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