fixed GSM modem initialization sequence

This commit is contained in:
Bogdan Pilyugin 2024-04-23 11:27:26 +02:00
parent 3858722cca
commit 3a7bf2a635

View File

@ -41,11 +41,13 @@ static int ResetType = 0;
static bool isPPPinitializing = false;
#endif
#define MAX_COMMAND_REPEATE_NUMBER 5
#define WATCHDOG_INTERVAL 30
static bool isPPPConn = false;
static int attimeout = 1000;
TaskHandle_t initTaskhandle;
#define PPP_MODEM_TIMEOUT 40
MODEM_INFO mod_info = { "-", "-", "-", "-" };
esp_netif_t *ppp_netif;
@ -156,22 +158,23 @@ static void GSMInitTask(void *pvParameter)
if (starttype == 0)
{
ESP_LOGE(TAG, "GSM module power down and up reset");
#if CONFIG_MODEM_DEVICE_POWER_CONTROL_PIN >= 0
gpio_set_level(CONFIG_MODEM_DEVICE_POWER_CONTROL_PIN, 0);
vTaskDelay(pdMS_TO_TICKS(1000));
vTaskDelay(pdMS_TO_TICKS(5000));
gpio_set_level(CONFIG_MODEM_DEVICE_POWER_CONTROL_PIN, 1);
vTaskDelay(pdMS_TO_TICKS(5000));
#else
if (gsm_reset)
{
gsm_reset(0);
vTaskDelay(pdMS_TO_TICKS(1000));
vTaskDelay(pdMS_TO_TICKS(5000));
gsm_reset(1);
vTaskDelay(pdMS_TO_TICKS(5000));
}
else
{
ESP_LOGE(TAG, "ethernet chip reset pin not defined");
ESP_LOGE(TAG, "GSM module reset procedure not defined");
ESP_ERROR_CHECK(1);
}
#endif
@ -212,52 +215,82 @@ static void GSMInitTask(void *pvParameter)
assert(dce);
mod_info.model[0] = 0x00;
int GSMConnectTimeout = 0;
int OperationRepeate = 0;
//MODULE NAME
while (esp_modem_get_module_name(dce, mod_info.model) != ESP_OK)
{
if (++GSMConnectTimeout >= PPP_MODEM_TIMEOUT)
if (OperationRepeate++ >= MAX_COMMAND_REPEATE_NUMBER)
{
ESP_LOGE(TAG, "Error get module name");
goto modem_init_fail;
}
ESP_LOGW(TAG, "Retry get module name");
vTaskDelay(pdMS_TO_TICKS(1000));
}
ESP_LOGI(TAG, "Module type:%s", mod_info.model);
//IMSI
OperationRepeate = 0;
mod_info.imsi[0] = 0x00;
while (esp_modem_get_imsi(dce, mod_info.imsi) != ESP_OK)
{
if (++GSMConnectTimeout >= PPP_MODEM_TIMEOUT)
if (OperationRepeate++ >= MAX_COMMAND_REPEATE_NUMBER)
{
ESP_LOGE(TAG, "Error get IMSI");
goto modem_init_fail;
}
ESP_LOGW(TAG, "Retry get IMSI");
vTaskDelay(pdMS_TO_TICKS(1000));
}
ESP_LOGI(TAG, "IMSI:%s", mod_info.imsi);
//OPERATOR NAME
OperationRepeate = 0;
mod_info.oper[0] = 0x00;
int tech = 0;
vTaskDelay(pdMS_TO_TICKS(10000));
while (esp_modem_get_operator_name(dce, mod_info.oper, &tech) != ESP_OK)
{
if (++GSMConnectTimeout >= PPP_MODEM_TIMEOUT)
if (OperationRepeate++ >= MAX_COMMAND_REPEATE_NUMBER)
{
ESP_LOGE(TAG, "Error get operator name");
goto modem_init_fail;
vTaskDelay(pdMS_TO_TICKS(1000));
}
ESP_LOGW(TAG, "Retry get operator name");
vTaskDelay(pdMS_TO_TICKS(10000));
}
ESP_LOGI(TAG, "Operator:%s", mod_info.oper);
//IMEI
mod_info.imei[0] = 0x00;
OperationRepeate = 0;
while (esp_modem_get_imei(dce, mod_info.imei) != ESP_OK)
{
if (++GSMConnectTimeout >= PPP_MODEM_TIMEOUT)
if (OperationRepeate++ >= MAX_COMMAND_REPEATE_NUMBER)
{
ESP_LOGE(TAG, "Error get IMEI");
goto modem_init_fail;
}
ESP_LOGW(TAG, "Retry get IMEI");
vTaskDelay(pdMS_TO_TICKS(1000));
}
ESP_LOGI(TAG, "IMEI:%s", mod_info.imei);
//SWITCH TO CMUX
OperationRepeate = 0;
while (esp_modem_set_mode(dce, ESP_MODEM_MODE_CMUX) != ESP_OK)
{
if (++GSMConnectTimeout >= PPP_MODEM_TIMEOUT)
if (OperationRepeate++ >= MAX_COMMAND_REPEATE_NUMBER)
{
ESP_LOGE(TAG, "Error switch module to CMUX");
goto modem_init_fail;
}
ESP_LOGW(TAG, "Retry switch module to CMUX");
vTaskDelay(pdMS_TO_TICKS(1000));
}
ESP_LOGI(TAG, "PPP data mode OK");
xEventGroupWaitBits(event_group, CONNECT_BIT, pdTRUE, pdTRUE, portMAX_DELAY);
isPPPinitializing = false;
@ -265,7 +298,7 @@ static void GSMInitTask(void *pvParameter)
return;
modem_init_fail:
ESP_LOGE(TAG, "PPP modem init error");
ESP_LOGE(TAG, "PPP modem initialization fail");
isPPPinitializing = false;
vTaskDelete(NULL);
}
@ -274,12 +307,14 @@ void PPPModemColdStart(void)
{
ResetType = 0;
xTaskCreate(GSMInitTask, "GSMInitTask", 1024 * 6, &ResetType, 3, &initTaskhandle);
ESP_LOGI(TAG, "Start GSM cold initialization task");
}
void PPPModemSoftRestart(void)
{
ResetType = 1;
xTaskCreate(GSMInitTask, "GSMInitTask", 1024 * 6, &ResetType, 3, &initTaskhandle);
ESP_LOGI(TAG, "Start GSM soft initialization task");
}
static void GSMRunTask(void *pvParameter)
@ -288,10 +323,10 @@ static void GSMRunTask(void *pvParameter)
{
if (!isPPPConn && !isPPPinitializing)
{ //try to reconnect modem
ESP_LOGI(TAG, "PPP modem restart");
ESP_LOGW(TAG, "Module restart by watchdog");
PPPModemColdStart();
}
vTaskDelay(pdMS_TO_TICKS(30000));
vTaskDelay(pdMS_TO_TICKS(WATCHDOG_INTERVAL*1000));
}
}
@ -315,24 +350,24 @@ void ModemSetATTimeout(int timeout)
void ModemSendAT(char *cmd, char *resp, int timeout)
{
ESP_LOGI(TAG, "Command:%s", cmd);
int res = esp_modem_at(dce, cmd, resp, attimeout);
switch(res)
int res = esp_modem_at(dce, cmd, resp, attimeout);
switch (res)
{
case 0:
ESP_LOGI(TAG, "OK");
break;
break;
case 1:
ESP_LOGE(TAG, "FAIL");
break;
break;
case 2:
ESP_LOGE(TAG, "TIMEOUT");
break;
break;
}
ESP_LOGI(TAG, "Response:%s", resp);
}
esp_err_t cmd_cb(uint8_t* data, int len)
esp_err_t cmd_cb(uint8_t *data, int len)
{
ESP_LOGI(TAG, "Response:%*s", len, data);
return ESP_OK;
@ -340,7 +375,7 @@ esp_err_t cmd_cb(uint8_t* data, int len)
void ModemSendSMS(void)
{
esp_modem_command(dce, "atd", &cmd_cb, 3000);
esp_modem_command(dce, "atd", &cmd_cb, 3000);
}
#endif