Skip to content

Commit aae984c

Browse files
committed
samples: modem: hello_hl78xx: demonstrate AirVantage FOTA API
Add support for handling AirVantage WDSI indications in the sample application. FOTA update progress, download requests, and completion events are processed and coordinated using a new semaphore. The sample can restart its connection workflow after a successful firmware update. Additional updates include: - add serial number retrieval and logging - add fota_complete_rerun semaphore and status tracking - simplify debug logging in event listener and OK handler - reorganize main loop to support FOTA-triggered reruns This aligns the sample with the modem driver's expanded AirVantage and WDSI support. Signed-off-by: Zafer SEN <zafersn93@gmail.com>
1 parent 1051adc commit aae984c

File tree

1 file changed

+75
-7
lines changed
  • samples/drivers/modem/hello_hl78xx/src

1 file changed

+75
-7
lines changed

samples/drivers/modem/hello_hl78xx/src/main.c

Lines changed: 75 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,16 @@
3030
LOG_MODULE_REGISTER(main, CONFIG_MODEM_LOG_LEVEL);
3131

3232
static K_SEM_DEFINE(network_connected_sem, 0, 1);
33-
const struct device *modem = DEVICE_DT_GET(DT_ALIAS(modem));
33+
static K_SEM_DEFINE(fota_complete_rerun, 0, 1);
34+
const static struct device *modem = DEVICE_DT_GET(DT_ALIAS(modem));
3435

3536
/* Zephyr NET management event callback structures. */
3637
static struct net_mgmt_event_callback l4_cb;
3738
static struct net_mgmt_event_callback conn_cb;
38-
39+
#ifdef CONFIG_MODEM_HL78XX_AIRVANTAGE
40+
static int fota_update_status = -1;
41+
#endif
42+
/** Convert RAT mode enum to string */
3943
static const char *rat_get_in_string(enum hl78xx_cell_rat_mode rat)
4044
{
4145
switch (rat) {
@@ -144,9 +148,6 @@ static void l4_event_handler(struct net_mgmt_event_callback *cb, uint64_t event,
144148

145149
static void evnt_listener(struct hl78xx_evt *event, struct hl78xx_evt_monitor_entry *context)
146150
{
147-
#ifdef CONFIG_MODEM_HL78XX_LOG_CONTEXT_VERBOSE_DEBUG
148-
LOG_DBG("%d HL78XX modem Event Received: %d", __LINE__, event->type);
149-
#endif
150151
switch (event->type) {
151152
/* Do something */
152153
case HL78XX_LTE_RAT_UPDATE:
@@ -160,7 +161,41 @@ static void evnt_listener(struct hl78xx_evt *event, struct hl78xx_evt_monitor_en
160161
LOG_INF("%d HL78XX modem startup status: %s", __LINE__,
161162
hl78xx_module_status_to_string(event->content.value));
162163
break;
164+
#ifdef CONFIG_MODEM_HL78XX_AIRVANTAGE
165+
case HL78XX_LTE_FOTA_UPDATE_STATUS:
166+
LOG_INF("%d HL78XX modem FOTA update status: %d", __LINE__,
167+
event->content.wdsi_indication);
168+
if (event->content.wdsi_indication == WDSI_FIRMWARE_UPDATE_SUCCESS) {
169+
LOG_INF("FOTA update complete, restarting modem...");
170+
k_sem_reset(&network_connected_sem);
171+
fota_update_status = (int)WDSI_FIRMWARE_UPDATE_SUCCESS;
172+
k_sem_give(&fota_complete_rerun);
173+
} else if (event->content.wdsi_indication == WDSI_FIRMWARE_UPDATE_FAILED) {
174+
LOG_INF("FOTA update failed.");
175+
fota_update_status = (int)WDSI_FIRMWARE_UPDATE_FAILED;
176+
k_sem_give(&fota_complete_rerun);
177+
} else if (event->content.wdsi_indication == WDSI_FIRMWARE_DOWNLOAD_REQUEST &&
178+
fota_update_status != (int)WDSI_FIRMWARE_DOWNLOAD_REQUEST) {
179+
LOG_INF("FOTA download requested, starting download...");
180+
if (fota_update_status != (int)WDSI_SESSION_STARTED) {
181+
return;
182+
}
183+
fota_update_status = (int)WDSI_FIRMWARE_DOWNLOAD_REQUEST;
184+
k_sem_give(&fota_complete_rerun);
185+
} else if (event->content.wdsi_indication == WDSI_SESSION_STARTED) {
186+
LOG_INF("FOTA session started...");
187+
fota_update_status = (int)WDSI_SESSION_STARTED;
188+
}
189+
else {
190+
/* Other WDSI indications can be handled here if needed */
191+
}
192+
193+
break;
194+
#endif /* CONFIG_MODEM_HL78XX_AIRVANTAGE */
163195
default:
196+
#ifdef CONFIG_MODEM_HL78XX_LOG_CONTEXT_VERBOSE_DEBUG
197+
LOG_DBG("%d HL78XX modem Event Received: %d", __LINE__, event->type);
198+
#endif
164199
break;
165200
}
166201
}
@@ -171,7 +206,7 @@ static void hl78xx_on_ok(struct modem_chat *chat, char **argv, uint16_t argc, vo
171206
return;
172207
}
173208
#ifdef CONFIG_MODEM_HL78XX_LOG_CONTEXT_VERBOSE_DEBUG
174-
LOG_DBG("%d %s %s", __LINE__, __func__, argv[0]);
209+
LOG_DBG("%d %s", __LINE__, argv[0]);
175210
#endif
176211
}
177212

@@ -251,7 +286,6 @@ int main(void)
251286
}
252287

253288
(void)conn_mgr_if_connect(iface);
254-
255289
LOG_INF("Waiting for network connection...");
256290
k_sem_take(&network_connected_sem, K_FOREVER);
257291
}
@@ -262,6 +296,7 @@ int main(void)
262296
char apn[MDM_APN_MAX_LENGTH] = {0};
263297
char operator[MDM_MODEL_LENGTH] = {0};
264298
char imei[MDM_IMEI_LENGTH] = {0};
299+
char serial_number[MDM_SERIAL_NUMBER_LENGTH] = {0};
265300
enum hl78xx_cell_rat_mode tech;
266301
enum cellular_registration_status status;
267302
int16_t rsrp;
@@ -289,6 +324,9 @@ int main(void)
289324

290325
hl78xx_get_modem_info(modem, HL78XX_MODEM_INFO_APN, (char *)apn, sizeof(apn));
291326

327+
hl78xx_get_modem_info(modem, HL78XX_MODEM_INFO_SERIAL_NUMBER, (char *)serial_number,
328+
sizeof(serial_number));
329+
292330
cellular_get_modem_info(modem, CELLULAR_MODEM_INFO_IMEI, imei, sizeof(imei));
293331
#ifdef CONFIG_MODEM_HL78XX_AUTORAT
294332
/* In auto rat mode, get the current rat from the modem status */
@@ -308,6 +346,7 @@ int main(void)
308346
LOG_RAW("**********************************************************\n");
309347
LOG_INF("Manufacturer: %s", manufacturer);
310348
LOG_INF("Firmware Version: %s", fw_ver);
349+
LOG_INF("Module Serial Number: %s", serial_number);
311350
LOG_INF("APN: \"%s\"", apn);
312351
LOG_INF("Imei: %s", imei);
313352
LOG_INF("RAT: %s", rat_get_in_string(tech));
@@ -337,6 +376,35 @@ int main(void)
337376

338377
resolve_broker_addr(&test_endpoint_addr);
339378

379+
#ifdef CONFIG_MODEM_HL78XX_AIRVANTAGE
380+
#ifdef CONFIG_MODEM_HL78XX_AIRVANTAGE_UA_CONNECT_AIRVANTAGE
381+
LOG_INF("Starting AirVantage DM session...");
382+
hl78xx_start_airvantage_dm_session(modem);
383+
k_sem_reset(&fota_complete_rerun);
384+
LOG_INF("Waiting for AirVantage FOTA Creation...");
385+
/* Wait for FOTA download request, max 120 seconds */
386+
ret = k_sem_take(&fota_complete_rerun, K_SECONDS(120));
387+
if (ret < 0) {
388+
LOG_WRN("AirVantage DM session timed out waiting for FOTA download request.%d",
389+
ret);
390+
} else {
391+
k_sem_reset(&fota_complete_rerun);
392+
LOG_INF("Waiting for AirVantage FOTA Completion...");
393+
/* Wait for FOTA completion */
394+
ret = k_sem_take(&fota_complete_rerun, K_FOREVER);
395+
if (fota_update_status == (int)WDSI_FIRMWARE_UPDATE_SUCCESS) {
396+
LOG_INF("FOTA update successful, restarting application to apply update.");
397+
} else if (fota_update_status == (int)WDSI_FIRMWARE_UPDATE_FAILED) {
398+
LOG_WRN("FOTA update failed.");
399+
} else {
400+
LOG_WRN("FOTA update status unknown.");
401+
}
402+
}
403+
404+
#else
405+
LOG_WRN("AirVantage User Agreement not accepted, cannot start DM session.");
406+
#endif
407+
#endif /* CONFIG_MODEM_HL78XX_AIRVANTAGE */
340408
LOG_INF("Sample application finished.");
341409

342410
return 0;

0 commit comments

Comments
 (0)