summaryrefslogtreecommitdiff
path: root/fw/esp32/components/eos/cell_modem.c
diff options
context:
space:
mode:
Diffstat (limited to 'fw/esp32/components/eos/cell_modem.c')
-rw-r--r--fw/esp32/components/eos/cell_modem.c139
1 files changed, 73 insertions, 66 deletions
diff --git a/fw/esp32/components/eos/cell_modem.c b/fw/esp32/components/eos/cell_modem.c
index 4f8efd1..9a024ae 100644
--- a/fw/esp32/components/eos/cell_modem.c
+++ b/fw/esp32/components/eos/cell_modem.c
@@ -152,17 +152,21 @@ static void uart_data_read(uint8_t mode) {
}
case EOS_CELL_UART_MODE_RELAY: {
- unsigned char *buf;
+ EOSMessage msg;
int rv;
rd = 0;
do {
int _rd;
- buf = eos_net_alloc();
- buf[0] = EOS_CELL_MTYPE_DEV | EOS_CELL_MTYPE_UART_DATA;
- _rd = eos_modem_read(buf + 1, MIN(bsize - rd, EOS_NET_SIZE_BUF - 1), 100);
- rv = eos_net_send(EOS_NET_MTYPE_CELL, buf, _rd + 1);
+ eos_net_alloc(&msg);
+ if (msg.size < 1) {
+ eos_net_free(&msg);
+ break;
+ }
+ msg.buffer[0] = EOS_CELL_MTYPE_DEV | EOS_CELL_MTYPE_UART_DATA;
+ _rd = eos_modem_read(msg.buffer + 1, MIN(bsize - rd, msg.size - 1), 100);
+ rv = eos_net_send(EOS_NET_MTYPE_CELL, &msg, _rd + 1);
if (rv) ESP_LOGE(TAG, "NET SEND ERR:%d", rv);
rd += _rd;
} while (rd != bsize);
@@ -330,13 +334,18 @@ static void modem_event_task(void *pvParameters) {
}
case MODEM_ETYPE_STATUS: {
- unsigned char *buf;
+ EOSMessage msg;
int rv;
- buf = eos_net_alloc();
- buf[0] = EOS_CELL_MTYPE_DEV | EOS_CELL_MTYPE_STATUS;
- memcpy(buf + 1, evt.param, evt.param_len);
- rv = eos_net_send(EOS_NET_MTYPE_CELL, buf, evt.param_len + 1);
+ eos_net_alloc(&msg);
+ if (msg.size < 3) {
+ eos_net_free(&msg);
+ break;
+ }
+
+ msg.buffer[0] = EOS_CELL_MTYPE_DEV | EOS_CELL_MTYPE_STATUS;
+ memcpy(msg.buffer + 1, evt.param, evt.param_len);
+ rv = eos_net_send(EOS_NET_MTYPE_CELL, &msg, evt.param_len + 1);
if (rv) ESP_LOGE(TAG, "NET SEND ERR:%d", rv);
break;
}
@@ -633,6 +642,19 @@ static int ppp_setup(void) {
return EOS_OK;
}
+static void modem_init_ri(void) {
+ gpio_config_t io_conf = {
+ .pin_bit_mask = BIT64(UART_GPIO_RI),
+ .mode = GPIO_MODE_INPUT,
+ .intr_type = GPIO_INTR_NEGEDGE,
+ .pull_up_en = 1,
+ .pull_down_en = 0,
+ };
+
+ gpio_config(&io_conf);
+ gpio_isr_handler_add(UART_GPIO_RI, uart_ring_handler, NULL);
+}
+
void eos_modem_init(void) {
gpio_config_t io_conf = {};
uart_config_t uart_config = {
@@ -652,6 +674,25 @@ void eos_modem_init(void) {
ret = uart_driver_install(UART_PORT, UART_SIZE_IO_BUF, UART_SIZE_IO_BUF, 10, &uart_queue, 0);
assert(ret == ESP_OK);
+ mutex = xSemaphoreCreateBinary();
+ assert(mutex != NULL);
+ if (esp_reset_reason() != ESP_RST_DEEPSLEEP) {
+ xSemaphoreGive(mutex);
+ }
+
+ uart_mutex = xSemaphoreCreateBinary();
+ assert(uart_mutex != NULL);
+ if (esp_reset_reason() != ESP_RST_DEEPSLEEP) {
+ xSemaphoreGive(uart_mutex);
+ }
+
+ ppp_mutex = xSemaphoreCreateBinary();
+ assert(ppp_mutex != NULL);
+ xSemaphoreGive(ppp_mutex);
+
+ modem_queue = xQueueCreate(4, sizeof(modem_event_t));
+ assert(modem_queue != NULL);
+
// Configuration for the RST/DTR/USB/RI lines
gpio_set_level(MODEM_GPIO_RST, 1);
io_conf.intr_type = GPIO_INTR_DISABLE;
@@ -661,7 +702,7 @@ void eos_modem_init(void) {
io_conf.pull_down_en = 0;
gpio_config(&io_conf);
- gpio_set_level(UART_GPIO_DTR, 0);
+ gpio_set_level(UART_GPIO_DTR, esp_reset_reason() == ESP_RST_DEEPSLEEP ? 1 : 0);
/* enable USB MUX and grab signals */
gpio_set_level(MODEM_GPIO_USB_EN, 0);
gpio_set_level(MODEM_GPIO_USB_S, 1);
@@ -672,37 +713,10 @@ void eos_modem_init(void) {
io_conf.pull_down_en = 0;
gpio_config(&io_conf);
- io_conf.intr_type = GPIO_INTR_NEGEDGE;
- io_conf.mode = GPIO_MODE_INPUT;
- io_conf.pin_bit_mask = BIT64(UART_GPIO_RI);
- io_conf.pull_up_en = 1;
- io_conf.pull_down_en = 0;
- gpio_config(&io_conf);
-
- if (esp_reset_reason() == ESP_RST_DEEPSLEEP) {
- gpio_hold_dis(UART_GPIO_DTR);
- gpio_hold_dis(MODEM_GPIO_USB_EN);
- gpio_hold_dis(MODEM_GPIO_USB_S);
- } else {
- modem_present = 0;
- modem_initialized = 0;
+ if (esp_reset_reason() != ESP_RST_DEEPSLEEP) {
+ modem_init_ri();
}
- mutex = xSemaphoreCreateBinary();
- assert(mutex != NULL);
- xSemaphoreGive(mutex);
-
- uart_mutex = xSemaphoreCreateBinary();
- assert(uart_mutex != NULL);
- xSemaphoreGive(uart_mutex);
-
- ppp_mutex = xSemaphoreCreateBinary();
- assert(ppp_mutex != NULL);
- xSemaphoreGive(ppp_mutex);
-
- modem_queue = xQueueCreate(4, sizeof(modem_event_t));
- assert(modem_queue != NULL);
-
at_init();
rv = at_urc_insert("^RDY", modem_atinit_handler, REG_EXTENDED);
assert(rv == EOS_OK);
@@ -717,7 +731,13 @@ void eos_modem_init(void) {
void eos_modem_run(void) {
BaseType_t rv;
- gpio_isr_handler_add(UART_GPIO_RI, uart_ring_handler, NULL);
+ if (esp_reset_reason() == ESP_RST_DEEPSLEEP) {
+ eos_modem_deep_wake();
+ } else {
+ uart_mode = EOS_CELL_UART_MODE_NONE;
+ modem_present = 0;
+ modem_initialized = 0;
+ }
rv = xTaskCreate(uart_event_task, "uart_event", EOS_TASK_SSIZE_UART, NULL, EOS_TASK_PRIORITY_UART, NULL);
assert(rv == pdPASS);
@@ -952,43 +972,30 @@ void eos_modem_sleep_req(void) {
if (rv == pdFALSE) ESP_LOGE(TAG, "Obtaining UART mutex before sleep failed");
gpio_isr_handler_remove(UART_GPIO_RI);
gpio_reset_pin(UART_GPIO_RI);
- /* for deep sleep */
- gpio_hold_en(UART_GPIO_DTR);
- gpio_hold_en(MODEM_GPIO_USB_EN);
- gpio_hold_en(MODEM_GPIO_USB_S);
+
eos_power_sleep_rdy(EOS_PWR_DEV_MODEM);
}
void eos_modem_wake(void) {
- gpio_config_t io_conf = {
- .pin_bit_mask = BIT64(UART_GPIO_RI),
- .mode = GPIO_MODE_INPUT,
- .intr_type = GPIO_INTR_NEGEDGE,
- };
- uint32_t dev;
-
- gpio_hold_dis(UART_GPIO_DTR);
- gpio_hold_dis(MODEM_GPIO_USB_EN);
- gpio_hold_dis(MODEM_GPIO_USB_S);
-
- gpio_config(&io_conf);
- gpio_isr_handler_add(UART_GPIO_RI, uart_ring_handler, NULL);
-
+ modem_init_ri();
uart_change_mode(uart_mode);
xSemaphoreGive(uart_mutex);
xSemaphoreGive(mutex);
gpio_set_level(UART_GPIO_DTR, 0);
+}
- dev = eos_power_wakeup_source();
- if (dev == EOS_PWR_DEV_MODEM) {
- modem_event_t evt;
-
- evt.type = MODEM_ETYPE_RING;
- xQueueSend(modem_queue, &evt, portMAX_DELAY);
- }
+void eos_modem_deep_sleep(void) {
+ gpio_hold_en(UART_GPIO_DTR);
+ gpio_hold_en(MODEM_GPIO_USB_EN);
+ gpio_hold_en(MODEM_GPIO_USB_S);
}
+void eos_modem_deep_wake(void) {
+ gpio_hold_dis(UART_GPIO_DTR);
+ gpio_hold_dis(MODEM_GPIO_USB_EN);
+ gpio_hold_dis(MODEM_GPIO_USB_S);
+}
void eos_ppp_get_apn(char *apn) {
xSemaphoreTake(mutex, portMAX_DELAY);