@@ -95,12 +95,28 @@ BOOT_LOG_MODULE_DECLARE(mcuboot);
95
95
#else
96
96
#define BOOT_SERIAL_HASH_SIZE_MAX 0
97
97
#endif
98
+ #ifdef MCUBOOT_SERIAL_IMG_GRP_SLOT_INFO
99
+ #define BOOT_SERIAL_SLOT_INFO_SIZE_MAX 164
100
+ #else
101
+ #define BOOT_SERIAL_SLOT_INFO_SIZE_MAX 0
102
+ #endif
103
+
104
+ #if (128 + BOOT_SERIAL_IMAGE_STATE_SIZE_MAX + BOOT_SERIAL_HASH_SIZE_MAX ) > \
105
+ BOOT_SERIAL_SLOT_INFO_SIZE_MAX
106
+ #define BOOT_SERIAL_MAX_MESSAGE_SIZE (128 + BOOT_SERIAL_IMAGE_STATE_SIZE_MAX + \
107
+ BOOT_SERIAL_HASH_SIZE_MAX)
108
+ #else
109
+ #define BOOT_SERIAL_MAX_MESSAGE_SIZE BOOT_SERIAL_SLOT_INFO_SIZE_MAX
110
+ #endif
98
111
99
- #define BOOT_SERIAL_OUT_MAX ((128 + BOOT_SERIAL_IMAGE_STATE_SIZE_MAX + \
100
- BOOT_SERIAL_HASH_SIZE_MAX) * BOOT_IMAGE_NUMBER)
112
+ #define BOOT_SERIAL_OUT_MAX (BOOT_SERIAL_MAX_MESSAGE_SIZE * BOOT_IMAGE_NUMBER)
101
113
102
114
#define BOOT_SERIAL_FRAME_MTU 124 /* 127 - pkt start (2 bytes) and stop (1 byte) */
103
115
116
+ /* Number of estimated CBOR elements for responses */
117
+ #define CBOR_ENTRIES_SLOT_INFO_IMAGE_MAP 4
118
+ #define CBOR_ENTRIES_SLOT_INFO_SLOTS_MAP 3
119
+
104
120
#ifdef __ZEPHYR__
105
121
/* base64 lib encodes data to null-terminated string */
106
122
#define BASE64_ENCODE_SIZE (in_size ) ((((((in_size) - 1) / 3) * 4) + 4) + 1)
@@ -259,11 +275,7 @@ bs_list(char *buf, int len)
259
275
int swap_status = boot_swap_type_multi (image_index );
260
276
#endif
261
277
262
- #ifdef MCUBOOT_SINGLE_APPLICATION_SLOT
263
- for (slot = 0 ; slot < 1 ; slot ++ ) {
264
- #else
265
- for (slot = 0 ; slot < 2 ; slot ++ ) {
266
- #endif
278
+ for (slot = 0 ; slot < MCUBOOT_IMAGE_NUMBER ; slot ++ ) {
267
279
FIH_DECLARE (fih_rc , FIH_FAILURE );
268
280
uint8_t tmpbuf [64 ];
269
281
@@ -576,6 +588,139 @@ bs_list_set(uint8_t op, char *buf, int len)
576
588
}
577
589
}
578
590
591
+ #ifdef MCUBOOT_SERIAL_IMG_GRP_SLOT_INFO
592
+ static void
593
+ bs_slot_info (uint8_t op , char * buf , int len )
594
+ {
595
+ uint32_t slot , area_id ;
596
+ const struct flash_area * fap ;
597
+ uint8_t image_index = 0 ;
598
+ int rc ;
599
+ bool ok = true;
600
+ const struct image_max_size * image_max_sizes ;
601
+
602
+ if (op != NMGR_OP_READ ) {
603
+ bs_rc_rsp (MGMT_ERR_ENOTSUP );
604
+ }
605
+
606
+ image_max_sizes = boot_get_max_app_size ();
607
+
608
+ zcbor_map_start_encode (cbor_state , 1 );
609
+ zcbor_tstr_put_lit_cast (cbor_state , "images" );
610
+ zcbor_list_start_encode (cbor_state , MCUBOOT_IMAGE_NUMBER );
611
+
612
+ IMAGES_ITER (image_index ) {
613
+ for (slot = 0 ; slot < MCUBOOT_IMAGE_NUMBER ; slot ++ ) {
614
+ if (slot == 0 ) {
615
+ ok = zcbor_map_start_encode (cbor_state , CBOR_ENTRIES_SLOT_INFO_IMAGE_MAP ) &&
616
+ zcbor_tstr_put_lit (cbor_state , "image" ) &&
617
+ zcbor_uint32_put (cbor_state , (uint32_t )image_index ) &&
618
+ zcbor_tstr_put_lit (cbor_state , "slots" ) &&
619
+ zcbor_list_start_encode (cbor_state , MCUBOOT_IMAGE_NUMBER );
620
+
621
+ if (!ok ) {
622
+ goto finish ;
623
+ }
624
+ }
625
+
626
+ ok = zcbor_map_start_encode (cbor_state , CBOR_ENTRIES_SLOT_INFO_SLOTS_MAP ) &&
627
+ zcbor_tstr_put_lit (cbor_state , "slot" ) &&
628
+ zcbor_uint32_put (cbor_state , slot );
629
+
630
+ if (!ok ) {
631
+ goto finish ;
632
+ }
633
+
634
+ area_id = flash_area_id_from_multi_image_slot (image_index , slot );
635
+ rc = flash_area_open (area_id , & fap );
636
+
637
+ if (rc ) {
638
+ ok = zcbor_tstr_put_lit (cbor_state , "rc" ) &&
639
+ zcbor_int32_put (cbor_state , rc );
640
+ } else {
641
+ if (sizeof (fap -> fa_size ) == sizeof (uint64_t )) {
642
+ ok = zcbor_tstr_put_lit (cbor_state , "size" ) &&
643
+ zcbor_uint64_put (cbor_state , fap -> fa_size );
644
+ } else {
645
+ ok = zcbor_tstr_put_lit (cbor_state , "size" ) &&
646
+ zcbor_uint32_put (cbor_state , fap -> fa_size );
647
+ }
648
+
649
+ if (!ok ) {
650
+ flash_area_close (fap );
651
+ goto finish ;
652
+ }
653
+
654
+ /*
655
+ * Check if we support uploading to this slot and if so, return the
656
+ * image ID
657
+ */
658
+ #if defined(MCUBOOT_SINGLE_APPLICATION_SLOT )
659
+ ok = zcbor_tstr_put_lit (cbor_state , "upload_image_id" ) &&
660
+ zcbor_uint32_put (cbor_state , (image_index + 1 ));
661
+ #elif defined(MCUBOOT_SERIAL_DIRECT_IMAGE_UPLOAD )
662
+ ok = zcbor_tstr_put_lit (cbor_state , "upload_image_id" ) &&
663
+ zcbor_uint32_put (cbor_state , (image_index * 2 + slot + 1 ));
664
+ #else
665
+ if (slot == 1 ) {
666
+ ok = zcbor_tstr_put_lit (cbor_state , "upload_image_id" ) &&
667
+ zcbor_uint32_put (cbor_state , (image_index * 2 + 1 ));
668
+ }
669
+ #endif
670
+
671
+ flash_area_close (fap );
672
+
673
+ if (!ok ) {
674
+ goto finish ;
675
+ }
676
+
677
+ ok = zcbor_map_end_encode (cbor_state , CBOR_ENTRIES_SLOT_INFO_SLOTS_MAP );
678
+
679
+ if (!ok ) {
680
+ goto finish ;
681
+ }
682
+
683
+ if (slot == (MCUBOOT_IMAGE_NUMBER - 1 )) {
684
+ ok = zcbor_list_end_encode (cbor_state , MCUBOOT_IMAGE_NUMBER );
685
+
686
+ if (!ok ) {
687
+ goto finish ;
688
+ }
689
+
690
+ if (image_max_sizes [image_index ].calculated == true) {
691
+ ok = zcbor_tstr_put_lit (cbor_state , "max_image_size" ) &&
692
+ zcbor_uint32_put (cbor_state ,
693
+ image_max_sizes [image_index ].max_size );
694
+
695
+ if (!ok ) {
696
+ goto finish ;
697
+ }
698
+ }
699
+
700
+ ok = zcbor_map_end_encode (cbor_state , CBOR_ENTRIES_SLOT_INFO_IMAGE_MAP );
701
+
702
+ }
703
+ }
704
+
705
+ if (!ok ) {
706
+ goto finish ;
707
+ }
708
+ }
709
+ }
710
+
711
+ ok = zcbor_list_end_encode (cbor_state , MCUBOOT_IMAGE_NUMBER ) &&
712
+ zcbor_map_end_encode (cbor_state , 1 );
713
+
714
+ finish :
715
+ if (!ok ) {
716
+ reset_cbor_state ();
717
+ bs_rc_rsp (MGMT_ERR_ENOMEM );
718
+ }
719
+
720
+ boot_serial_output ();
721
+ }
722
+ #endif
723
+
579
724
#ifdef MCUBOOT_ERASE_PROGRESSIVELY
580
725
/** Erases range of flash, aligned to sector size
581
726
*
@@ -1019,6 +1164,11 @@ boot_serial_input(char *buf, int len)
1019
1164
case IMGMGR_NMGR_ID_UPLOAD :
1020
1165
bs_upload (buf , len );
1021
1166
break ;
1167
+ #ifdef MCUBOOT_SERIAL_IMG_GRP_SLOT_INFO
1168
+ case IMGMGR_NMGR_ID_SLOT_INFO :
1169
+ bs_slot_info (hdr -> nh_op , buf , len );
1170
+ break ;
1171
+ #endif
1022
1172
default :
1023
1173
bs_rc_rsp (MGMT_ERR_ENOTSUP );
1024
1174
break ;
0 commit comments