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