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