diff --git a/features/cellular/framework/targets/QUECTEL/BG96/QUECTEL_BG96.cpp b/features/cellular/framework/targets/QUECTEL/BG96/QUECTEL_BG96.cpp index d9e2de23dd..c2148bf0a5 100644 --- a/features/cellular/framework/targets/QUECTEL/BG96/QUECTEL_BG96.cpp +++ b/features/cellular/framework/targets/QUECTEL/BG96/QUECTEL_BG96.cpp @@ -15,17 +15,17 @@ * limitations under the License. */ +#include "rtos/ThisThread.h" #include "QUECTEL_BG96.h" #include "QUECTEL_BG96_CellularNetwork.h" #include "QUECTEL_BG96_CellularStack.h" #include "QUECTEL_BG96_CellularInformation.h" #include "QUECTEL_BG96_CellularContext.h" #include "CellularLog.h" -#include "DigitalOut.h" -#include "mbed_wait_api.h" using namespace mbed; using namespace events; +using namespace rtos; #define CONNECT_DELIM "\r\n" #define CONNECT_BUFFER_SIZE (1280 + 80 + 80) // AT response + sscanf format @@ -33,6 +33,18 @@ using namespace events; #define DEVICE_READY_URC "CPIN:" +#if !defined(MBED_CONF_QUECTEL_BG96_PWR) +#define MBED_CONF_QUECTEL_BG96_PWR NC +#endif + +#if !defined(MBED_CONF_QUECTEL_BG96_RST) +#define MBED_CONF_QUECTEL_BG96_RST NC +#endif + +#if !defined(MBED_CONF_QUECTEL_BG96_POLARITY) +#define MBED_CONF_QUECTEL_BG96_POLARITY 1 // active high +#endif + static const intptr_t cellular_properties[AT_CellularBase::PROPERTY_MAX] = { AT_CellularNetwork::RegistrationModeLAC, // C_EREG AT_CellularNetwork::RegistrationModeLAC, // C_GREG @@ -51,11 +63,16 @@ static const intptr_t cellular_properties[AT_CellularBase::PROPERTY_MAX] = { 1, // PROPERTY_AT_CGEREP }; -QUECTEL_BG96::QUECTEL_BG96(FileHandle *fh) : AT_CellularDevice(fh) +QUECTEL_BG96::QUECTEL_BG96(FileHandle *fh, PinName pwr, bool active_high, PinName rst) + : AT_CellularDevice(fh), + _active_high(active_high), + _pwr(pwr, !_active_high), + _rst(rst, !_active_high) { AT_CellularBase::set_cellular_properties(cellular_properties); } + AT_CellularNetwork *QUECTEL_BG96::open_network_impl(ATHandler &at) { return new QUECTEL_BG96_CellularNetwork(at); @@ -78,41 +95,42 @@ void QUECTEL_BG96::set_ready_cb(Callback callback) nsapi_error_t QUECTEL_BG96::hard_power_on() { - DigitalOut ModemResetIn (MBED_CONF_QUECTEL_BG96_PWR); - - wait_ms(250); - ModemResetIn = 0; - wait_ms(250); - ModemResetIn = 1; - wait_ms(500); + if (_pwr.is_connected()) { + tr_info("Modem power on"); + ThisThread::sleep_for(250); + _pwr = !_active_high; + ThisThread::sleep_for(250); // BG96_Hardware_Design_V1.1 says 100 ms, but 250 ms seems to be more robust + _pwr = _active_high; + ThisThread::sleep_for(500); + } return NSAPI_ERROR_OK; } nsapi_error_t QUECTEL_BG96::soft_power_on() { - // turn moden on - DigitalOut ModemPwrkey (MBED_CONF_QUECTEL_BG96_RST); + if (_rst.is_connected()) { + tr_info("Reset modem"); + _rst = !_active_high; + ThisThread::sleep_for(100); + _rst = _active_high; + ThisThread::sleep_for(150 + 460); // RESET_N timeout from BG96_Hardware_Design_V1.1 + _rst = !_active_high; + ThisThread::sleep_for(500); - ModemPwrkey = 0; - wait_ms(100); - ModemPwrkey = 1; - wait_ms(500); - ModemPwrkey = 0; - wait_ms(500); + // wait for RDY + _at->lock(); + _at->set_at_timeout(10 * 1000); + _at->resp_start(); + _at->set_stop_tag("RDY"); + bool rdy = _at->consume_to_stop_tag(); + _at->set_stop_tag(OK); + _at->restore_at_timeout(); + _at->unlock(); - // wait for RDY - _at->lock(); - _at->set_at_timeout(60000); - _at->resp_start(); - _at->set_stop_tag("RDY"); - bool rdy = _at->consume_to_stop_tag(); - _at->set_stop_tag(OK); - _at->unlock(); - - if (!rdy) - { - return NSAPI_ERROR_DEVICE_ERROR; + if (!rdy) { + return NSAPI_ERROR_DEVICE_ERROR; + } } return NSAPI_ERROR_OK; @@ -120,12 +138,12 @@ nsapi_error_t QUECTEL_BG96::soft_power_on() nsapi_error_t QUECTEL_BG96::hard_power_off() { - // turn moden off - DigitalOut ModemPwrkey (MBED_CONF_QUECTEL_BG96_PWR); - - ModemPwrkey = 1; - wait_ms(250); - ModemPwrkey = 0; + if (_pwr.is_connected()) { + tr_info("Modem power off"); + _pwr = _active_high; + ThisThread::sleep_for(650); // from BG96_Hardware_Design_V1.1 + _pwr = !_active_high; + } return NSAPI_ERROR_OK; } @@ -142,30 +160,26 @@ nsapi_error_t QUECTEL_BG96::init() _at->cmd_start("AT+CMEE=1"); // verbose responses _at->cmd_stop_read_resp(); - if (_at->get_last_error() != NSAPI_ERROR_OK) - { - do - { + if (_at->get_last_error() == NSAPI_ERROR_OK) { + do { _at->cmd_start("AT+CFUN=1"); // set full functionality _at->cmd_stop_read_resp(); - // CFUN executed ok - if (_at->get_last_error() != NSAPI_ERROR_OK) - { + // CFUN executed ok + if (_at->get_last_error() != NSAPI_ERROR_OK) { // wait some time that modem gets ready for CFUN command, and try again retry++; _at->flush(); - wait_ms(64); - } - else - { + ThisThread::sleep_for(64); // experimental value + } else { // yes continue break; } /* code */ - } while ( (retry < 3) ); + } while ((retry < 3)); } + return _at->unlock_return_error(); } @@ -178,7 +192,10 @@ CellularDevice *CellularDevice::get_default_instance() tr_debug("QUECTEL_BG96 flow control: RTS %d CTS %d", MBED_CONF_QUECTEL_BG96_RTS, MBED_CONF_QUECTEL_BG96_CTS); serial.set_flow_control(SerialBase::RTSCTS, MBED_CONF_QUECTEL_BG96_RTS, MBED_CONF_QUECTEL_BG96_CTS); #endif - static QUECTEL_BG96 device(&serial); + static QUECTEL_BG96 device(&serial, + MBED_CONF_QUECTEL_BG96_PWR, + MBED_CONF_QUECTEL_BG96_POLARITY, + MBED_CONF_QUECTEL_BG96_RST); return &device; } #endif diff --git a/features/cellular/framework/targets/QUECTEL/BG96/QUECTEL_BG96.h b/features/cellular/framework/targets/QUECTEL/BG96/QUECTEL_BG96.h index 3744308f19..f7000fbfe4 100644 --- a/features/cellular/framework/targets/QUECTEL/BG96/QUECTEL_BG96.h +++ b/features/cellular/framework/targets/QUECTEL/BG96/QUECTEL_BG96.h @@ -27,13 +27,14 @@ #endif #endif /* TARGET_FF_ARDUINO */ +#include "DigitalOut.h" #include "AT_CellularDevice.h" namespace mbed { class QUECTEL_BG96 : public AT_CellularDevice { public: - QUECTEL_BG96(FileHandle *fh); + QUECTEL_BG96(FileHandle *fh, PinName pwr = NC, bool active_high = true, PinName rst = NC); protected: // AT_CellularDevice virtual AT_CellularNetwork *open_network_impl(ATHandler &at); @@ -47,6 +48,12 @@ protected: // AT_CellularDevice public: void handle_urc(FileHandle *fh); + +private: + nsapi_error_t press_power_button(uint32_t timeout); + bool _active_high; + DigitalOut _pwr; + DigitalOut _rst; }; } // namespace mbed #endif // QUECTEL_BG96_H_ diff --git a/features/cellular/framework/targets/QUECTEL/BG96/mbed_lib.json b/features/cellular/framework/targets/QUECTEL/BG96/mbed_lib.json index d72b2fba46..00b85f3de8 100644 --- a/features/cellular/framework/targets/QUECTEL/BG96/mbed_lib.json +++ b/features/cellular/framework/targets/QUECTEL/BG96/mbed_lib.json @@ -37,5 +37,13 @@ "help": "Provide as default CellularDevice [true/false]", "value": false } + }, + "target_overrides": { + "MTB_STM_L475": { + "tx": "SERIAL_TX", + "rx": "SERIAL_RX", + "pwr": "PE_15", + "rst": "PE_9" + } } }