mirror of https://github.com/ARMmbed/mbed-os.git
				
				
				
			Merge pull request #9706 from jarvte/fix_powering_onboard_modems
Cellular: fix onboard modems powering failure.pull/9728/head
						commit
						67abaf5fa7
					
				| 
						 | 
				
			
			@ -415,7 +415,7 @@ bool AT_CellularContext::set_new_context(int cid)
 | 
			
		|||
        strncpy(pdp_type_str, "IPV6", sizeof(pdp_type_str));
 | 
			
		||||
        pdp_type = IPV6_PDP_TYPE;
 | 
			
		||||
    } else if (modem_supports_ipv4) {
 | 
			
		||||
        strncpy(pdp_type_str, "IP", sizeof(pdp_type));
 | 
			
		||||
        strncpy(pdp_type_str, "IP", sizeof(pdp_type_str));
 | 
			
		||||
        pdp_type = IPV4_PDP_TYPE;
 | 
			
		||||
    } else {
 | 
			
		||||
        return false;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -40,6 +40,7 @@
 | 
			
		|||
const int STM_STOPPED = -99;
 | 
			
		||||
const int ACTIVE_PDP_CONTEXT = 0x01;
 | 
			
		||||
const int ATTACHED_TO_NETWORK = 0x02;
 | 
			
		||||
const int DEVICE_READY = 0x04;
 | 
			
		||||
 | 
			
		||||
namespace mbed {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -48,7 +49,7 @@ CellularStateMachine::CellularStateMachine(CellularDevice &device, events::Event
 | 
			
		|||
    _event_status_cb(0), _network(0), _queue(queue), _queue_thread(0), _sim_pin(0),
 | 
			
		||||
    _retry_count(0), _event_timeout(-1), _event_id(-1), _plmn(0), _command_success(false),
 | 
			
		||||
    _plmn_network_found(false), _is_retry(false), _cb_data(), _current_event(NSAPI_EVENT_CONNECTION_STATUS_CHANGE),
 | 
			
		||||
    _network_status(0)
 | 
			
		||||
    _status(0)
 | 
			
		||||
{
 | 
			
		||||
#if MBED_CONF_CELLULAR_RANDOM_MAX_START_DELAY == 0
 | 
			
		||||
    _start_time = 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -84,7 +85,7 @@ void CellularStateMachine::reset()
 | 
			
		|||
    _event_id = -1;
 | 
			
		||||
    _plmn_network_found = false;
 | 
			
		||||
    _is_retry = false;
 | 
			
		||||
    _network_status = 0;
 | 
			
		||||
    _status = 0;
 | 
			
		||||
    _target_state = STATE_INIT;
 | 
			
		||||
    enter_to_state(STATE_INIT);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -112,7 +113,7 @@ bool CellularStateMachine::power_on()
 | 
			
		|||
{
 | 
			
		||||
    _cb_data.error = _cellularDevice.hard_power_on();
 | 
			
		||||
    if (_cb_data.error != NSAPI_ERROR_OK) {
 | 
			
		||||
        tr_warn("Power on failed.");
 | 
			
		||||
        tr_warn("Hard power on failed.");
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
    return true;
 | 
			
		||||
| 
						 | 
				
			
			@ -177,7 +178,7 @@ bool CellularStateMachine::is_registered()
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    _cb_data.status_data = status;
 | 
			
		||||
    return is_registered || _network_status;
 | 
			
		||||
    return is_registered || _status;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool CellularStateMachine::get_network_registration(CellularNetwork::RegistrationType type,
 | 
			
		||||
| 
						 | 
				
			
			@ -330,6 +331,7 @@ void CellularStateMachine::state_init()
 | 
			
		|||
    _cellularDevice.set_timeout(TIMEOUT_POWER_ON);
 | 
			
		||||
    tr_info("Start connecting (timeout %d s)", TIMEOUT_POWER_ON / 1000);
 | 
			
		||||
    _cb_data.error = _cellularDevice.is_ready();
 | 
			
		||||
    _status = _cb_data.error ? 0 : DEVICE_READY;
 | 
			
		||||
    if (_cb_data.error != NSAPI_ERROR_OK) {
 | 
			
		||||
        _event_timeout = _start_time;
 | 
			
		||||
        if (_start_time > 0) {
 | 
			
		||||
| 
						 | 
				
			
			@ -381,11 +383,15 @@ bool CellularStateMachine::device_ready()
 | 
			
		|||
void CellularStateMachine::state_device_ready()
 | 
			
		||||
{
 | 
			
		||||
    _cellularDevice.set_timeout(TIMEOUT_POWER_ON);
 | 
			
		||||
    _cb_data.error = _cellularDevice.soft_power_on();
 | 
			
		||||
    if (!(_status & DEVICE_READY)) {
 | 
			
		||||
        tr_debug("Device was not ready, calling soft_power_on()");
 | 
			
		||||
        _cb_data.error = _cellularDevice.soft_power_on();
 | 
			
		||||
    }
 | 
			
		||||
    if (_cb_data.error == NSAPI_ERROR_OK) {
 | 
			
		||||
        _cb_data.error = _cellularDevice.init();
 | 
			
		||||
        if (_cb_data.error == NSAPI_ERROR_OK) {
 | 
			
		||||
            if (device_ready()) {
 | 
			
		||||
                _status = 0;
 | 
			
		||||
                enter_to_state(STATE_SIM_PIN);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -419,11 +425,11 @@ void CellularStateMachine::state_sim_pin()
 | 
			
		|||
 | 
			
		||||
        if (_network->is_active_context()) { // check if context was already activated
 | 
			
		||||
            tr_debug("Active context found.");
 | 
			
		||||
            _network_status |= ACTIVE_PDP_CONTEXT;
 | 
			
		||||
            _status |= ACTIVE_PDP_CONTEXT;
 | 
			
		||||
        }
 | 
			
		||||
        CellularNetwork::AttachStatus status; // check if modem is already attached to a network
 | 
			
		||||
        if (_network->get_attach(status) == NSAPI_ERROR_OK && status == CellularNetwork::Attached) {
 | 
			
		||||
            _network_status |= ATTACHED_TO_NETWORK;
 | 
			
		||||
            _status |= ATTACHED_TO_NETWORK;
 | 
			
		||||
            tr_debug("Cellular already attached.");
 | 
			
		||||
        }
 | 
			
		||||
        if (_plmn) {
 | 
			
		||||
| 
						 | 
				
			
			@ -483,7 +489,7 @@ void CellularStateMachine::state_attaching()
 | 
			
		|||
{
 | 
			
		||||
    _cellularDevice.set_timeout(TIMEOUT_CONNECT);
 | 
			
		||||
    tr_info("Attaching network (timeout %d s)", TIMEOUT_CONNECT / 1000);
 | 
			
		||||
    if (_network_status != ATTACHED_TO_NETWORK) {
 | 
			
		||||
    if (_status != ATTACHED_TO_NETWORK) {
 | 
			
		||||
        _cb_data.error = _network->set_attach();
 | 
			
		||||
    }
 | 
			
		||||
    if (_cb_data.error == NSAPI_ERROR_OK) {
 | 
			
		||||
| 
						 | 
				
			
			@ -724,6 +730,7 @@ void CellularStateMachine::device_ready_cb()
 | 
			
		|||
        _event_id = -1;
 | 
			
		||||
        if (device_ready()) {
 | 
			
		||||
            _is_retry = false;
 | 
			
		||||
            _status = 0;
 | 
			
		||||
            if (!check_is_target_reached()) {
 | 
			
		||||
                continue_from_state(STATE_SIM_PIN);
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -183,7 +183,7 @@ private:
 | 
			
		|||
    bool _is_retry;
 | 
			
		||||
    cell_callback_data_t _cb_data;
 | 
			
		||||
    nsapi_event_t _current_event;
 | 
			
		||||
    int _network_status; // Is there any active context or is modem attached to a network?
 | 
			
		||||
    int _status;
 | 
			
		||||
    PlatformMutex _mutex;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,6 +19,8 @@
 | 
			
		|||
#include "cellular/onboard_modem_api.h"
 | 
			
		||||
#include "UARTSerial.h"
 | 
			
		||||
#include "ONBOARD_TELIT_HE910.h"
 | 
			
		||||
#include "ThisThread.h"
 | 
			
		||||
#include "CellularLog.h"
 | 
			
		||||
 | 
			
		||||
using namespace mbed;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -41,6 +43,8 @@ nsapi_error_t ONBOARD_TELIT_HE910::hard_power_off()
 | 
			
		|||
nsapi_error_t ONBOARD_TELIT_HE910::soft_power_on()
 | 
			
		||||
{
 | 
			
		||||
    ::onboard_modem_power_up();
 | 
			
		||||
    // From Telit_xE910 Global form factor App note: It is mandatory to avoid sending data to the serial ports during the first 200ms of the module start-up.
 | 
			
		||||
    rtos::ThisThread::sleep_for(200);
 | 
			
		||||
    return NSAPI_ERROR_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -53,6 +57,12 @@ nsapi_error_t ONBOARD_TELIT_HE910::soft_power_off()
 | 
			
		|||
CellularDevice *CellularDevice::get_target_default_instance()
 | 
			
		||||
{
 | 
			
		||||
    static UARTSerial serial(MDMTXD, MDMRXD, 115200);
 | 
			
		||||
#if DEVICE_SERIAL_FC
 | 
			
		||||
    if (MDMRTS != NC && MDMCTS != NC) {
 | 
			
		||||
        tr_debug("Modem flow control: RTS %d CTS %d", MDMRTS, MDMCTS);
 | 
			
		||||
        serial.set_flow_control(SerialBase::RTSCTS, MDMRTS, MDMCTS);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
    static ONBOARD_TELIT_HE910 device(&serial);
 | 
			
		||||
    return &device;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,6 +19,7 @@
 | 
			
		|||
#include "cellular/onboard_modem_api.h"
 | 
			
		||||
#include "UARTSerial.h"
 | 
			
		||||
#include "ONBOARD_TELIT_HE910.h"
 | 
			
		||||
#include "ThisThread.h"
 | 
			
		||||
#include "CellularLog.h"
 | 
			
		||||
 | 
			
		||||
using namespace mbed;
 | 
			
		||||
| 
						 | 
				
			
			@ -42,6 +43,8 @@ nsapi_error_t ONBOARD_TELIT_HE910::hard_power_off()
 | 
			
		|||
nsapi_error_t ONBOARD_TELIT_HE910::soft_power_on()
 | 
			
		||||
{
 | 
			
		||||
    ::onboard_modem_power_up();
 | 
			
		||||
    // From Telit_xE910 Global form factor App note: It is mandatory to avoid sending data to the serial ports during the first 200ms of the module start-up.
 | 
			
		||||
    rtos::ThisThread::sleep_for(200);
 | 
			
		||||
    return NSAPI_ERROR_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue