mirror of
https://gitlab.com/mobian1/eg25-manager.git
synced 2025-08-30 07:42:23 +02:00
Merge branch 'soft-sleep-runtime' into 'master'
at: wake only when sending AT commands Closes #12 See merge request mobian1/devices/eg25-manager!21
This commit is contained in:
38
src/at.c
38
src/at.c
@@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
#include "at.h"
|
#include "at.h"
|
||||||
#include "suspend.h"
|
#include "suspend.h"
|
||||||
|
#include "gpio.h"
|
||||||
|
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -59,6 +60,10 @@ static gboolean send_at_command(struct EG25Manager *manager)
|
|||||||
int ret, len = 0;
|
int ret, len = 0;
|
||||||
|
|
||||||
if (at_cmd) {
|
if (at_cmd) {
|
||||||
|
/* Wake up the modem from soft sleep before sending an AT command */
|
||||||
|
gpio_sequence_wake(manager);
|
||||||
|
|
||||||
|
/* Send AT command */
|
||||||
if (at_cmd->subcmd == NULL && at_cmd->value == NULL && at_cmd->expected == NULL)
|
if (at_cmd->subcmd == NULL && at_cmd->value == NULL && at_cmd->expected == NULL)
|
||||||
len = sprintf(command, "AT+%s\r\n", at_cmd->cmd);
|
len = sprintf(command, "AT+%s\r\n", at_cmd->cmd);
|
||||||
else if (at_cmd->subcmd == NULL && at_cmd->value == NULL)
|
else if (at_cmd->subcmd == NULL && at_cmd->value == NULL)
|
||||||
@@ -75,23 +80,28 @@ static gboolean send_at_command(struct EG25Manager *manager)
|
|||||||
g_warning("Couldn't write full AT command: wrote %d/%d bytes", ret, len);
|
g_warning("Couldn't write full AT command: wrote %d/%d bytes", ret, len);
|
||||||
|
|
||||||
g_message("Sending command: %s", g_strstrip(command));
|
g_message("Sending command: %s", g_strstrip(command));
|
||||||
} else if (manager->modem_state < EG25_STATE_CONFIGURED) {
|
} else {
|
||||||
if (manager->modem_iface == MODEM_IFACE_MODEMMANAGER) {
|
/* Allow the modem to enter soft sleep again when we sent the AT command*/
|
||||||
#ifdef HAVE_MMGLIB
|
gpio_sequence_sleep(manager);
|
||||||
MMModemState modem_state = mm_modem_get_state(manager->mm_modem);
|
|
||||||
|
|
||||||
if (manager->mm_modem && modem_state >= MM_MODEM_STATE_REGISTERED)
|
if (manager->modem_state < EG25_STATE_CONFIGURED) {
|
||||||
modem_update_state(manager, modem_state);
|
if (manager->modem_iface == MODEM_IFACE_MODEMMANAGER) {
|
||||||
else
|
#ifdef HAVE_MMGLIB
|
||||||
manager->modem_state = EG25_STATE_CONFIGURED;
|
MMModemState modem_state = mm_modem_get_state(manager->mm_modem);
|
||||||
|
|
||||||
|
if (manager->mm_modem && modem_state >= MM_MODEM_STATE_REGISTERED)
|
||||||
|
modem_update_state(manager, modem_state);
|
||||||
|
else
|
||||||
|
manager->modem_state = EG25_STATE_CONFIGURED;
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
manager->modem_state = EG25_STATE_CONFIGURED;
|
manager->modem_state = EG25_STATE_CONFIGURED;
|
||||||
|
}
|
||||||
|
} else if (manager->modem_state == EG25_STATE_SUSPENDING) {
|
||||||
|
modem_suspend_post(manager);
|
||||||
|
} else if (manager->modem_state == EG25_STATE_RESETTING) {
|
||||||
|
manager->modem_state = EG25_STATE_POWERED;
|
||||||
}
|
}
|
||||||
} else if (manager->modem_state == EG25_STATE_SUSPENDING) {
|
|
||||||
modem_suspend_post(manager);
|
|
||||||
} else if (manager->modem_state == EG25_STATE_RESETTING) {
|
|
||||||
manager->modem_state = EG25_STATE_POWERED;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
24
src/gpio.c
24
src/gpio.c
@@ -6,6 +6,8 @@
|
|||||||
|
|
||||||
#include "gpio.h"
|
#include "gpio.h"
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
#define GPIO_CHIP1_LABEL "1c20800.pinctrl"
|
#define GPIO_CHIP1_LABEL "1c20800.pinctrl"
|
||||||
#define GPIO_CHIP2_LABEL "1f02c00.pinctrl"
|
#define GPIO_CHIP2_LABEL "1f02c00.pinctrl"
|
||||||
|
|
||||||
@@ -52,7 +54,6 @@ int gpio_sequence_shutdown(struct EG25Manager *manager)
|
|||||||
int gpio_sequence_suspend(struct EG25Manager *manager)
|
int gpio_sequence_suspend(struct EG25Manager *manager)
|
||||||
{
|
{
|
||||||
gpiod_line_set_value(manager->gpio_out[GPIO_OUT_APREADY], 1);
|
gpiod_line_set_value(manager->gpio_out[GPIO_OUT_APREADY], 1);
|
||||||
gpiod_line_set_value(manager->gpio_out[GPIO_OUT_DTR], 1);
|
|
||||||
|
|
||||||
g_message("Executed suspend sequence");
|
g_message("Executed suspend sequence");
|
||||||
|
|
||||||
@@ -62,13 +63,32 @@ int gpio_sequence_suspend(struct EG25Manager *manager)
|
|||||||
int gpio_sequence_resume(struct EG25Manager *manager)
|
int gpio_sequence_resume(struct EG25Manager *manager)
|
||||||
{
|
{
|
||||||
gpiod_line_set_value(manager->gpio_out[GPIO_OUT_APREADY], 0);
|
gpiod_line_set_value(manager->gpio_out[GPIO_OUT_APREADY], 0);
|
||||||
gpiod_line_set_value(manager->gpio_out[GPIO_OUT_DTR], 0);
|
|
||||||
|
|
||||||
g_message("Executed resume sequence");
|
g_message("Executed resume sequence");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int gpio_sequence_wake(struct EG25Manager *manager)
|
||||||
|
{
|
||||||
|
gpiod_line_set_value(manager->gpio_out[GPIO_OUT_DTR], 0);
|
||||||
|
|
||||||
|
/* Give the modem 5ms to wake from soft sleep */
|
||||||
|
usleep(5000);
|
||||||
|
|
||||||
|
g_message("Executed soft wake sequence");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int gpio_sequence_sleep(struct EG25Manager *manager)
|
||||||
|
{
|
||||||
|
gpiod_line_set_value(manager->gpio_out[GPIO_OUT_DTR], 1);
|
||||||
|
g_message("Executed soft sleep sequence");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static guint get_config_gpio(toml_table_t *config, const char *id)
|
static guint get_config_gpio(toml_table_t *config, const char *id)
|
||||||
{
|
{
|
||||||
toml_datum_t value = toml_int_in(config, id);
|
toml_datum_t value = toml_int_in(config, id);
|
||||||
|
@@ -15,5 +15,7 @@ int gpio_sequence_poweron(struct EG25Manager *state);
|
|||||||
int gpio_sequence_shutdown(struct EG25Manager *state);
|
int gpio_sequence_shutdown(struct EG25Manager *state);
|
||||||
int gpio_sequence_suspend(struct EG25Manager *state);
|
int gpio_sequence_suspend(struct EG25Manager *state);
|
||||||
int gpio_sequence_resume(struct EG25Manager *state);
|
int gpio_sequence_resume(struct EG25Manager *state);
|
||||||
|
int gpio_sequence_wake(struct EG25Manager *state);
|
||||||
|
int gpio_sequence_sleep(struct EG25Manager *state);
|
||||||
|
|
||||||
gboolean gpio_check_poweroff(struct EG25Manager *manager, gboolean keep_down);
|
gboolean gpio_check_poweroff(struct EG25Manager *manager, gboolean keep_down);
|
||||||
|
Reference in New Issue
Block a user