1 /*
2 * Copyright (c) 2022 Nordic Semiconductor
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 #define LOG_MODULE_NAME app_fw_update
8 #include <zephyr/logging/log.h>
9 LOG_MODULE_REGISTER(LOG_MODULE_NAME);
10
11 #include <zephyr/net/lwm2m.h>
12 #include "modules.h"
13
14 static uint8_t firmware_buf[64];
15
16 /* Array with supported PULL firmware update protocols */
17 static uint8_t supported_protocol[1];
18
firmware_update_cb(uint16_t obj_inst_id,uint8_t * args,uint16_t args_len)19 static int firmware_update_cb(uint16_t obj_inst_id,
20 uint8_t *args, uint16_t args_len)
21 {
22 LOG_DBG("UPDATE");
23
24 /* TODO: kick off update process */
25
26 /* If success, set the update result as RESULT_SUCCESS.
27 * In reality, it should be set at function lwm2m_setup()
28 */
29 lwm2m_set_u8(&LWM2M_OBJ(5, 0, 3), STATE_IDLE);
30 lwm2m_set_u8(&LWM2M_OBJ(5, 0, 5), RESULT_SUCCESS);
31 return 0;
32 }
33
firmware_get_buf(uint16_t obj_inst_id,uint16_t res_id,uint16_t res_inst_id,size_t * data_len)34 static void *firmware_get_buf(uint16_t obj_inst_id, uint16_t res_id,
35 uint16_t res_inst_id, size_t *data_len)
36 {
37 *data_len = sizeof(firmware_buf);
38 return firmware_buf;
39 }
40
firmware_block_received_cb(uint16_t obj_inst_id,uint16_t res_id,uint16_t res_inst_id,uint8_t * data,uint16_t data_len,bool last_block,size_t total_size,size_t offset)41 static int firmware_block_received_cb(uint16_t obj_inst_id, uint16_t res_id,
42 uint16_t res_inst_id, uint8_t *data,
43 uint16_t data_len, bool last_block,
44 size_t total_size, size_t offset)
45 {
46 LOG_INF("FIRMWARE: BLOCK RECEIVED: offset:%zd len:%u last_block:%d",
47 offset, data_len, last_block);
48 return 0;
49 }
50
firmware_cancel_cb(const uint16_t obj_inst_id)51 static int firmware_cancel_cb(const uint16_t obj_inst_id)
52 {
53 LOG_INF("FIRMWARE: Update canceled");
54 return 0;
55 }
56
init_firmware_update(void)57 void init_firmware_update(void)
58 {
59 /* setup data buffer for block-wise transfer */
60 lwm2m_register_pre_write_callback(&LWM2M_OBJ(5, 0, 0), firmware_get_buf);
61 lwm2m_firmware_set_write_cb(firmware_block_received_cb);
62
63 /* register cancel callback */
64 lwm2m_firmware_set_cancel_cb(firmware_cancel_cb);
65
66 if (IS_ENABLED(CONFIG_LWM2M_FIRMWARE_UPDATE_PULL_SUPPORT)) {
67 lwm2m_create_res_inst(&LWM2M_OBJ(5, 0, 8, 0));
68 lwm2m_set_res_buf(&LWM2M_OBJ(5, 0, 8, 0), &supported_protocol[0],
69 sizeof(supported_protocol[0]),
70 sizeof(supported_protocol[0]), 0);
71
72 lwm2m_firmware_set_update_cb(firmware_update_cb);
73 }
74 }
75