Skip to content

Commit 38d7f00

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 f895f9e commit 38d7f00

File tree

1 file changed

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

1 file changed

+74
-7
lines changed

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

Lines changed: 74 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,40 @@ 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+
} else {
189+
/* Other WDSI indications can be handled here if needed */
190+
}
191+
192+
break;
193+
#endif /* CONFIG_MODEM_HL78XX_AIRVANTAGE */
163194
default:
195+
#ifdef CONFIG_MODEM_HL78XX_LOG_CONTEXT_VERBOSE_DEBUG
196+
LOG_DBG("%d HL78XX modem Event Received: %d", __LINE__, event->type);
197+
#endif
164198
break;
165199
}
166200
}
@@ -171,7 +205,7 @@ static void hl78xx_on_ok(struct modem_chat *chat, char **argv, uint16_t argc, vo
171205
return;
172206
}
173207
#ifdef CONFIG_MODEM_HL78XX_LOG_CONTEXT_VERBOSE_DEBUG
174-
LOG_DBG("%d %s %s", __LINE__, __func__, argv[0]);
208+
LOG_DBG("%d %s", __LINE__, argv[0]);
175209
#endif
176210
}
177211

@@ -251,7 +285,6 @@ int main(void)
251285
}
252286

253287
(void)conn_mgr_if_connect(iface);
254-
255288
LOG_INF("Waiting for network connection...");
256289
k_sem_take(&network_connected_sem, K_FOREVER);
257290
}
@@ -262,6 +295,7 @@ int main(void)
262295
char apn[MDM_APN_MAX_LENGTH] = {0};
263296
char operator[MDM_MODEL_LENGTH] = {0};
264297
char imei[MDM_IMEI_LENGTH] = {0};
298+
char serial_number[MDM_SERIAL_NUMBER_LENGTH] = {0};
265299
enum hl78xx_cell_rat_mode tech;
266300
enum cellular_registration_status status;
267301
int16_t rsrp;
@@ -289,6 +323,9 @@ int main(void)
289323

290324
hl78xx_get_modem_info(modem, HL78XX_MODEM_INFO_APN, (char *)apn, sizeof(apn));
291325

326+
hl78xx_get_modem_info(modem, HL78XX_MODEM_INFO_SERIAL_NUMBER, (char *)serial_number,
327+
sizeof(serial_number));
328+
292329
cellular_get_modem_info(modem, CELLULAR_MODEM_INFO_IMEI, imei, sizeof(imei));
293330
#ifdef CONFIG_MODEM_HL78XX_AUTORAT
294331
/* In auto rat mode, get the current rat from the modem status */
@@ -308,6 +345,7 @@ int main(void)
308345
LOG_RAW("**********************************************************\n");
309346
LOG_INF("Manufacturer: %s", manufacturer);
310347
LOG_INF("Firmware Version: %s", fw_ver);
348+
LOG_INF("Module Serial Number: %s", serial_number);
311349
LOG_INF("APN: \"%s\"", apn);
312350
LOG_INF("Imei: %s", imei);
313351
LOG_INF("RAT: %s", rat_get_in_string(tech));
@@ -337,6 +375,35 @@ int main(void)
337375

338376
resolve_broker_addr(&test_endpoint_addr);
339377

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

342409
return 0;

0 commit comments

Comments
 (0)