📄 rilhand.cpp
字号:
g_bFirstIntialized = FALSE;
m_fInited = TRUE;
(void)SetEvent(m_hInitEvent);
Sleep(100);
RETAILMSG(1,(TEXT("[TI]:[StartInit] Card is off so close the radio\r\n")));
QueueCmdIgnoreRsp(APIID_NONE, "ATE0\r", CMDOPT_IGNORERADIOOFF , g_TimeoutCmdInit, NULL, NULL, 0, 0, 0);
QueueCmdIgnoreRsp(APIID_NONE, "ATV0\r", CMDOPT_IGNORERADIOOFF , g_TimeoutCmdInit, NULL, NULL, 0, 0, 0);
QueueCmdIgnoreRsp(APIID_NONE, "AT+CMEE=1\r", CMDOPT_IGNORERADIOOFF , g_TimeoutCmdInit, NULL, NULL, 0, 0, 0);
QueueCmdIgnoreRsp(APIID_NONE, "AT+CFUN=0\r", CMDOPT_IGNORERADIOOFF | CMDOPT_FLYMOD , g_TimeoutCmdInit, NULL, NULL, 0, 0, 0);
// DWORD dwState = 1;
// if (SetRegistryDWORD(HKEY_LOCAL_MACHINE, TEXT("System\\State\\Phone"), TEXT("State2"), dwState) )
// {
// RETAILMSG(1 ,(TEXT("[TI]success set reg net state 2, value is %d. \r\n"), dwState));
// }
}
#endif
#ifdef RIL_WATSON_REPORT
// Query for the equipment info so it is available in case of watson logging.
QueueCmdIgnoreRsp(APIID_NONE, "AT+CGMI;+CGMM;+CGMR;+CGSN\r", CMDOPT_IGNORERADIOOFF, g_TimeoutCmdInit, ParseGetEquipmentInfo, NULL, 0, 0, 0);
#endif // RIL_WATSON_REPORT
#endif
#endif
#ifdef SCI_OLD
if (GetCardOnOff())
{
#if defined(NO_INIT_ON_BOOT)
GeneralInitDone(TRUE);
#else
// Send the first init string to the COM port
if (!SendComInitString(COM_INIT_INDEX))
{
goto Error;
}
}
else
{
m_fInited = TRUE;
(void)SetEvent(m_hInitEvent);
Sleep(100);
RETAILMSG(1,(TEXT("[DF]:[StartInit] Card is off so close the radio\r\n")));
QueueCmdIgnoreRsp(APIID_NONE, "ATE0\r", CMDOPT_IGNORERADIOOFF , g_TimeoutCmdInit, NULL, NULL, 0, 0, 0);
QueueCmdIgnoreRsp(APIID_NONE, "ATV1\r", CMDOPT_IGNORERADIOOFF , g_TimeoutCmdInit, NULL, NULL, 0, 0, 0);
QueueCmdIgnoreRsp(APIID_NONE, "AT+CFUN=0\r", CMDOPT_IGNORERADIOOFF | CMDOPT_FLYMOD , g_TimeoutCmdInit, NULL, NULL, 0, 0, 0);
}
#ifdef RIL_WATSON_REPORT
// Query for the equipment info so it is available in case of watson logging.
QueueCmdIgnoreRsp(APIID_NONE, "AT+CGMI;+CGMM;+CGMR;+CGSN\r", CMDOPT_IGNORERADIOOFF, g_TimeoutCmdInit, ParseGetEquipmentInfo, NULL, 0, 0, 0);
#endif // RIL_WATSON_REPORT
#endif
//the mode that show the SCI menu by registry
#else
if (g_bSciNoMenuVersion || ( !g_bSciNoMenuVersion && GetCardOnOff()))
{
#if defined(NO_INIT_ON_BOOT)
GeneralInitDone(TRUE);
#else
// Send the first init string to the COM port
if (!SendComInitString(COM_INIT_INDEX))
{
goto Error;
}
}
else
{
m_fInited = TRUE;
(void)SetEvent(m_hInitEvent);
Sleep(100);
RETAILMSG(1,(TEXT("[TI]:[StartInit] Card is off so close the radio\r\n")));
QueueCmdIgnoreRsp(APIID_NONE, "ATE0\r", CMDOPT_IGNORERADIOOFF , g_TimeoutCmdInit, NULL, NULL, 0, 0, 0);
QueueCmdIgnoreRsp(APIID_NONE, "ATV1\r", CMDOPT_IGNORERADIOOFF , g_TimeoutCmdInit, NULL, NULL, 0, 0, 0);
QueueCmdIgnoreRsp(APIID_NONE, "AT+CMEE=1\r", CMDOPT_IGNORERADIOOFF , g_TimeoutCmdInit, NULL, NULL, 0, 0, 0);
QueueCmdIgnoreRsp(APIID_NONE, "AT+CFUN=0\r", CMDOPT_IGNORERADIOOFF | CMDOPT_FLYMOD , g_TimeoutCmdInit, NULL, NULL, 0, 0, 0);
}
#ifdef RIL_WATSON_REPORT
// Query for the equipment info so it is available in case of watson logging.
QueueCmdIgnoreRsp(APIID_NONE, "AT+CGMI;+CGMM;+CGMR;+CGSN\r", CMDOPT_IGNORERADIOOFF, g_TimeoutCmdInit, ParseGetEquipmentInfo, NULL, 0, 0, 0);
#endif // RIL_WATSON_REPORT
#endif
#endif
DWORD v_Solt1IsFirstPowerON = 0;
GetRegistryDWORD(HKEY_LOCAL_MACHINE, FIRST_POWERON_PATH, FIRST_POWERON_VALUE, &v_Solt1IsFirstPowerON);
if(v_Solt1IsFirstPowerON)
{
QueueCmdIgnoreRsp(APIID_NONE, "AT+CLVL=153\r", CMDOPT_IGNORERADIOOFF, g_TimeoutCmdInit, NULL, NULL, 0, 0, 0);
SetRegistryDWORD(HKEY_LOCAL_MACHINE, FIRST_POWERON_PATH, FIRST_POWERON_VALUE,0);
RETAILMSG(1,(TEXT("[DF]:The first power on\r\n")));
}
#ifdef OFFER_IMEI_IMSI
(void)SetRegistrySZ(HKEY_LOCAL_MACHINE, TEXT("System\\EquipmentInfo\\Card2"), TEXT("IMEI"), TEXT(""));
(void)SetRegistrySZ(HKEY_LOCAL_MACHINE, TEXT("System\\EquipmentInfo\\Card2"), TEXT("IMSI"), TEXT(""));
(void)SetRegistryDWORD(HKEY_LOCAL_MACHINE, TEXT("System\\State\\Phone"), TEXT("Roam2"), 0);
(void)SetRegistrySZ(HKEY_LOCAL_MACHINE, TEXT("System\\CardInfo\\Card2"), TEXT("OperatorName"), TEXT(""));
#ifdef DISPLAY_SPN
(void)SetRegistrySZ(HKEY_LOCAL_MACHINE, TEXT("System\\CardInfo\\Card2"), TEXT("SPNNAME"), TEXT(""));
#endif
(void)SetRegistryDWORD(HKEY_LOCAL_MACHINE, TEXT("System\\CardInfo\\Card2"), TEXT("NetOperatorName"), 0);
#endif
fRet = TRUE;
Error:
if (!fRet)
{
if (m_pComDevice)
{
COM_CloseInternal(m_pComDevice);
m_pComDevice = NULL;
}
if (m_hInitEvent)
{
(void)CloseHandle(m_hInitEvent);
m_hInitEvent = NULL;
}
if (m_hDataEvent)
{
(void)CloseHandle(m_hDataEvent);
m_hDataEvent = NULL;
}
}
return fRet;
}
void CRilHandle::GeneralInitDone(BOOL bSucceeded)
{
if (m_fInited)
{
DEBUGMSG(ZONE_ERROR, (TEXT("RILDrv : E : CRilHandle::FinishInit : Trying to reinit? Module reset itself?!, rebooting via CPM\r\n")));
#ifndef RIL_RADIO_RESILIENCE
if(!CreateProcess(TEXT("rs.exe"), NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL))
{
SignalCriticalError(RILLOG_EVENT_GENERALREINIT, __LINE__, __FILE__);
}
#endif // ! RIL_RADIO_RESILIENCE
}
if (bSucceeded)
{
m_fInited = TRUE;
m_fFailedInit = FALSE;
DEBUGMSG(ZONE_ERROR, (TEXT("RILDrv : E : CRilHandle::FinishInit : Module succeeded initialization!\r\n")));
}
else
{
DEBUGMSG(ZONE_ERROR, (TEXT("RILDrv : E : CRilHandle::FinishInit : Module failed initialization!\r\n")));
m_fFailedInit = TRUE;
}
(void)SetEvent(m_hInitEvent);
// Now we need to send a notification that we've intiailized properly
//if (IsPrimaryCard())
{
////HANDLE h_RilOK;
//h_RilOK = CreateEvent(NULL, TRUE, FALSE, RILDRIVERPRESENT_EVENT);
//Sleep(5000);
//SetEvent(h_RilOK);
//Sleep(5000);
RETAILMSG(1,(TEXT("[TI][ GeneralDone] RIL_READYSTATE_INITIALIZED().\r\n")));
SendReadyStateNotification(RIL_READYSTATE_INITIALIZED);
}
if (!g_Initialized && !IsPrimaryCard())
{
/*
HANDLE h_SpecInited = CreateEvent(NULL, TRUE, FALSE, TEXT("DUAL_CARD_SPEC_INITED"));
int i = 0;
while (i<50)
{
Sleep(1000);
if (WAIT_OBJECT_0 == WaitForSingleObject(h_SpecInited, 1000))
{
RETAILMSG(1,(TEXT("[TI][GeneralDONE] wait the object ok\r\n")));
break;
}
}
*/
if (g_SpecReady)
{
RETAILMSG(1,(TEXT("[TI][ GeneralDone] RIL_NOTIFY_SPECSTARTINITGSM1().\r\n")));
BroadcastDWORDBlobNotification(RIL_NOTIFY_SPECSTARTINITGSM1, RIL_EQSTATE_FULL);
}
else
{
int i = 0;
while (!g_SpecReady && (i < 3))
{
Sleep(5000);
BroadcastDWORDBlobNotification(RIL_NOTIFY_SPECSTARTINITGSM1, RIL_EQSTATE_FULL);
RETAILMSG(1,(TEXT("[TI]:Delay 5000 to Broadcast RIL_NOTIFY_SPECSTARTINITGSM1\r\n")));
i++;
}
if (!g_SpecReady)
{
RETAILMSG(1,(TEXT("[TI]:Error-->does not get the specready IOcontrol!\r\n")));
}
}
//QueueCmdIgnoreRsp(APIID_SETEQUIPMENTSTATE, "AT+CFUN=1\r", CMDOPT_SETRADIOON |CMDOPT_REINIT | CMDOPT_IGNORERADIOOFF, g_TimeoutCmdInit, NULL, NULL, 0, 0, 0);
//BroadcastDWORDBlobNotification(RIL_NOTIFY_SPECSTARTINITGSM1, 0);
g_Initialized = TRUE;
}
}
//
// Finish intialization
//
void CRilHandle::FinishInit(CCommand* pInitCmd, BOOL bSucceeded)
{
// FUNCTION_TRACE(CRilHandle::FinishInit);
DEBUGCHK(NULL != pInitCmd);
#ifdef OEM2_DRIVER
// One more thing, check if we are CFUN=1 so that we won't send it down again unnecesarily.
QueueCmdIgnoreRsp(APIID_NONE, "AT+CFUN?\r", CMDOPT_IGNORERADIOOFF, g_TimeoutCmdInit, ParseGetEquipmentState, NULL, 0, 0, 0);
#endif
if (pInitCmd->FGeneralInit())
{
GeneralInitDone(bSucceeded);
}
if (pInitCmd->FSMSInit())
{
if (m_fInitedForSMS)
{
DEBUGMSG(ZONE_ERROR, (TEXT("RILDrv : E : CRilHandle::FinishInit : Trying to reinit SMS? Module reset itself?!, rebooting via CPM\r\n")));
#ifndef RIL_RADIO_RESILIENCE
if(!CreateProcess(TEXT("rs.exe"), NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL))
#endif // ! RIL_RADIO_RESILIENCE
{
SignalCriticalError(RILLOG_EVENT_GENERALREINIT, __LINE__, __FILE__);
}
}
if (bSucceeded)
{
m_fInitedForSMS = TRUE;
}
}
}
//
// Function passed to CQueue::Enum() below
//
BOOL GenerateCancelledRsp(void* pItem, DWORD dwData)
{
FUNCTION_TRACE(GenerateCancelledRsp);
DEBUGCHK(pItem != NULL);
DEBUGCHK(dwData != NULL);
CCommand* pCmd = (CCommand*)pItem;
CRilHandle* pRilDevice = (CRilHandle*)dwData;
HRESULT dwError = RIL_E_CANCELLED;
// Send out cancelled response as a notification
pCmd->SendResponse(RIL_RESULT_ERROR, &dwError, sizeof(HRESULT));
// Continue enumeration
return FALSE;
}
//
//
//
void CRilHandle::PrepareForReinit()
{
// FUNCTION_TRACE(CRilHandle::PrepareForReinit);
(void)ResetEvent(m_hInitEvent);
m_fInited = FALSE;
m_fFailedInit = FALSE;
m_fInitedForSMS = FALSE;
m_fInitedForSIMPB = FALSE;
m_dwSIMPBLastSize = (DWORD)-1;
// Reset g_dwReadyState
SendReadyStateNotification(RIL_READYSTATE_NONE);
// Clear the command queue, sending out "cancelled" responses to response callbacks
// NOTE: The following line has been commented out to prevent commands
// from being cancelled on start up when the shell turns the radio on.
//g_pCmdQ->Enum(GenerateCancelledRsp, (DWORD)this, TRUE);
}
//
// Launch auxiliary threads
//
BOOL CRilHandle::LaunchThreads()
{
// FUNCTION_TRACE(CRilHandle::LaunchThreads);
BOOL fRet = FALSE;
DWORD NumThreads = 2;
if ( TRUE == CRilNdis.NdisSupported())
{
NumThreads++;
}
// Create a cancel event
m_hCancelEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (!m_hCancelEvent)
{
goto Error;
}
// Create command and response queues
g_pCmdQ = new CPriorityQueue<CCommand, 40>;
if (!g_pCmdQ || !g_pCmdQ->Init(m_hCancelEvent))
{
goto Error;
}
g_pRspQ = new CQueue<CResponse, 10>;
if (!g_pRspQ || !g_pRspQ->Init(m_hCancelEvent))
{
goto Error;
}
g_pSimLockedQueue = new CQueue<CCommand, 10>;
if (!g_pSimLockedQueue || !g_pSimLockedQueue->Init(m_hCancelEvent))
{
goto Error;
}
// Create a thread checkpoint
m_pCheckPoint = new CCheckPoint;
if (!m_pCheckPoint || !m_pCheckPoint->Init(NumThreads))
{
goto Error;
}
// Launch a auxiliary threads
m_hCmdThread = CreateThread(NULL, 0, CmdThreadProc, (LPVOID)this, 0, &m_dwCmdThreadID);
if (!m_hCmdThread)
{
goto Error;
}
m_hReadThread = CreateThread(NULL, 0, ReadThreadProc, (LPVOID)this, 0, &m_dwReadThreadID);
if (!m_hReadThread)
{
goto Error;
}
// Launch NDIS notification thread.
if ( !CRilNdis.NdisStart(m_hCancelEvent))
{
goto Error;
}
// Wait until all threads reach the checkpoint
if (!m_pCheckPoint->Wait(10000))
{
goto Error;
}
DEBUGMSG(ZONE_TRACE, (TEXT("RILDrv : t : CRilHandle::LaunchThreads : Launched threads reached ckeckpoint\r\n")));
fRet = TRUE;
Error:
if (!fRet)
{
if (m_hCmdThread)
{
(void)CloseHandle(m_hCmdThread);
m_hCmdThread = NULL;
m_dwCmdThreadID = 0;
}
if (m_hReadThread)
{
(void)CloseHandle(m_hReadThread);
m_hReadThread = NULL;
m_dwReadThreadID = 0;
}
delete m_pCheckPoint;
m_pCheckPoint = NULL;
delete g_pCmdQ;
delete g_pRspQ;
delete g_pSimLockedQueue;
g_pCmdQ = NULL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -