Merge pull request #12966 from MultiTechSystems/update-df413-onoff

DRAGONFLY_F413RH: Update power on and power off functionality
pull/12899/head
Martin Kojtal 2020-06-16 13:54:01 +02:00 committed by GitHub
commit 7b5a8d37b5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 67 additions and 21 deletions

View File

@ -17,7 +17,6 @@
#if MBED_CONF_NSAPI_PRESENT
#include "gpio_api.h"
#include "platform/mbed_wait_api.h"
#include "PinNames.h"
#include "drivers/BufferedSerial.h"
@ -33,23 +32,20 @@ ONBOARD_TELIT_HE910::ONBOARD_TELIT_HE910(FileHandle *fh) : TELIT_HE910(fh)
nsapi_error_t ONBOARD_TELIT_HE910::hard_power_on()
{
//does nothing at the moment, TODO: MultiTech to add hardware initialization stuff if needed
power_up();
return NSAPI_ERROR_OK;
}
nsapi_error_t ONBOARD_TELIT_HE910::hard_power_off()
{
//does nothing at the moment, TODO: MultiTech to add hardware de-initialization stuff if needed
power_down();
return NSAPI_ERROR_OK;
}
nsapi_error_t ONBOARD_TELIT_HE910::soft_power_on()
{
/* keep the power line low for 200 milisecond */
press_power_button(200);
/* give modem a little time to respond */
rtos::ThisThread::sleep_for(100);
power_down();
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;
@ -57,25 +53,72 @@ nsapi_error_t ONBOARD_TELIT_HE910::soft_power_on()
nsapi_error_t ONBOARD_TELIT_HE910::soft_power_off()
{
gpio_t gpio;
gpio_init_out_ex(&gpio, MDMPWRON, 0);
/* keep the power line low for more than 10 seconds.
* If 3G_ON_OFF pin is kept low for more than a second, a controlled disconnect and shutdown takes
* place, Due to the network disconnect, shut-off can take up to 30 seconds. However, we wait for 10
* seconds only */
rtos::ThisThread::sleep_for(10 * 1000);
power_down();
return NSAPI_ERROR_OK;
}
void ONBOARD_TELIT_HE910::press_power_button(int time_ms)
void ONBOARD_TELIT_HE910::press_power_button()
{
gpio_t gpio;
gpio_init_out_ex(&gpio, MDMPWRON, 0);
}
void ONBOARD_TELIT_HE910::release_power_button()
{
gpio_t gpio;
gpio_init_out_ex(&gpio, MDMPWRON, 1);
gpio_write(&gpio, 0);
rtos::ThisThread::sleep_for(time_ms);
gpio_write(&gpio, 1);
}
// 1.8v from the radio should be high before exiting this function. Do nothing if it's already high.
// Releasing MDMPWRON (going high) tells the tiny9 to turn the radio back on, assuming 1.8v was low.
void ONBOARD_TELIT_HE910::power_up()
{
// Set up to read 1.8v from the radio.
gpio_t radioOn;
gpio_init_in(&radioOn, PC_5);
// Do nothing if it's already powered.
if (gpio_read(&radioOn)) {
return;
}
else {
// power it up.
release_power_button();
}
// wait a max of 60s for 1.8v to go high.
volatile int v1_8 = 0;
uint8_t timeout = 60;
do {
rtos::ThisThread::sleep_for(1000);
v1_8 = gpio_read(&radioOn);
} while (!v1_8 && timeout--);
// The radio should be ready for commands after another 2s minimum.
rtos::ThisThread::sleep_for(3000);
}
void ONBOARD_TELIT_HE910::power_down()
{
gpio_t radioOn;
gpio_init_in(&radioOn, PC_5);
// Do nothing if it's already off.
if (!gpio_read(&radioOn)) {
return;
}
else {
// power down.
press_power_button();
}
// wait a max of 60s for 1.8v to go low.
volatile int v1_8 = 1;
uint8_t timeout = 60;
do {
rtos::ThisThread::sleep_for(1000);
v1_8 = gpio_read(&radioOn);
} while (v1_8 && timeout--);
}
CellularDevice *CellularDevice::get_target_default_instance()

View File

@ -31,7 +31,10 @@ public:
virtual nsapi_error_t soft_power_off();
private:
void press_power_button(int time_ms);
void press_power_button();
void release_power_button();
void power_up();
void power_down();
};
} // namespace mbed