mirror of
https://gitlab.com/mobian1/eg25-manager.git
synced 2025-08-29 23:32:14 +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:
36
src/at.c
36
src/at.c
@@ -6,6 +6,7 @@
|
||||
|
||||
#include "at.h"
|
||||
#include "suspend.h"
|
||||
#include "gpio.h"
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
@@ -59,6 +60,10 @@ static gboolean send_at_command(struct EG25Manager *manager)
|
||||
int ret, len = 0;
|
||||
|
||||
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)
|
||||
len = sprintf(command, "AT+%s\r\n", at_cmd->cmd);
|
||||
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_message("Sending command: %s", g_strstrip(command));
|
||||
} else if (manager->modem_state < EG25_STATE_CONFIGURED) {
|
||||
if (manager->modem_iface == MODEM_IFACE_MODEMMANAGER) {
|
||||
} else {
|
||||
/* Allow the modem to enter soft sleep again when we sent the AT command*/
|
||||
gpio_sequence_sleep(manager);
|
||||
|
||||
if (manager->modem_state < EG25_STATE_CONFIGURED) {
|
||||
if (manager->modem_iface == MODEM_IFACE_MODEMMANAGER) {
|
||||
#ifdef HAVE_MMGLIB
|
||||
MMModemState modem_state = mm_modem_get_state(manager->mm_modem);
|
||||
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;
|
||||
if (manager->mm_modem && modem_state >= MM_MODEM_STATE_REGISTERED)
|
||||
modem_update_state(manager, modem_state);
|
||||
else
|
||||
manager->modem_state = EG25_STATE_CONFIGURED;
|
||||
#endif
|
||||
} else {
|
||||
manager->modem_state = EG25_STATE_CONFIGURED;
|
||||
} else {
|
||||
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;
|
||||
|
24
src/gpio.c
24
src/gpio.c
@@ -6,6 +6,8 @@
|
||||
|
||||
#include "gpio.h"
|
||||
|
||||
#include <unistd.h>
|
||||
|
||||
#define GPIO_CHIP1_LABEL "1c20800.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)
|
||||
{
|
||||
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");
|
||||
|
||||
@@ -62,13 +63,32 @@ int gpio_sequence_suspend(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_DTR], 0);
|
||||
|
||||
g_message("Executed resume sequence");
|
||||
|
||||
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)
|
||||
{
|
||||
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_suspend(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);
|
||||
|
Reference in New Issue
Block a user