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

📄 rilhand.cpp

📁 手机RILGSM实现的源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
        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 + -