3434*/
3535/**************************************************************************/
3636
37+ #include <Arduino.h>
3738#include "utilities.h"
3839
40+ #include "nrf_sdm.h"
41+ #include "nrf52/nrf_mbr.h"
42+
43+ static lookup_entry_t const sd_lookup_items [] =
44+ {
45+ { .key = 0x0088 , .data = "S132 2.0.1" },
46+ };
47+
48+ static const lookup_table_t sd_lookup_table =
49+ {
50+ .count = sizeof (sd_lookup_items )/sizeof (lookup_entry_t ),
51+ .items = sd_lookup_items
52+ };
53+
3954/******************************************************************************/
4055/*!
4156 @brief Find the corresponding data from the key
@@ -51,3 +66,95 @@ void const * lookup_find(lookup_table_t const* p_table, uint32_t key)
5166
5267 return NULL ;
5368}
69+ /**
70+ * Format: SDname SDverion, bootloader version
71+ * e.g
72+ * "S132 2.0.1, 0.5.0"
73+ * @return
74+ */
75+ const char * getFirmwareVersion (void )
76+ {
77+ static char fw_str [20 + 1 ] = { 0 };
78+
79+ // Skip if already created
80+ if ( fw_str [0 ] == 0 )
81+ {
82+ uint32_t sd_id = SD_FWID_GET (MBR_SIZE ) & 0x0000ffff ;
83+ char const * p_lookup = (char const * ) lookup_find (& sd_lookup_table , sd_id );
84+
85+ if (p_lookup )
86+ {
87+ sprintf (fw_str , "%s, %d.%d.%d" , p_lookup ,
88+ U32_BYTE2 (bootloaderVersion ), U32_BYTE3 (bootloaderVersion ), U32_BYTE4 (bootloaderVersion ));
89+ }else
90+ {
91+ // Unknown SD ID --> display ID
92+ sprintf (fw_str , "0x%04X, %d.%d.%d" , (uint16_t ) sd_id ,
93+ U32_BYTE2 (bootloaderVersion ), U32_BYTE3 (bootloaderVersion ), U32_BYTE4 (bootloaderVersion ));
94+ }
95+ }
96+
97+ return fw_str ;
98+ }
99+
100+ const char * getMcuUniqueID (void )
101+ {
102+ static char serial_str [16 + 1 ] = { 0 };
103+
104+ // Skip if already created
105+ if ( serial_str [0 ] == 0 )
106+ {
107+ sprintf (serial_str , "%08lX%08lX" , NRF_FICR -> DEVICEID [1 ], NRF_FICR -> DEVICEID [0 ]);
108+ }
109+
110+ return serial_str ;
111+ }
112+
113+ /*
114+ * nrfjprog --family NRF52 --memrd 0x0000300C
115+ *
116+ SoftDevice | FWID | memory address |
117+ --------------------|--------|----------------
118+ S110 v5.2.1 | 0x0043 | 0x10001010 |
119+ S110 v6.0.0 | 0x0049 | 0x10001010 |
120+ S110 v6.2.1 | 0x0035 | 0x10001010 |
121+ S110 v7.0.0 | 0x004F | 0x0000300C |
122+ S110 v7.1.0 | 0x005A | 0x0000300C |
123+ S110 v7.3.0 | 0x0063 | 0x0000300C |
124+ S110 v8.0.0 | 0x0064 | 0x0000300C |
125+ ----------------------------------------------
126+ S120 v1.0.0 | 0x0055 | 0x0000300C |
127+ S120 v1.0.1 | 0x0058 | 0x0000300C |
128+ S120 v2.0.0-1.alpha | 0x005B | 0x0000300C |
129+ S120 v2.0.0 | 0x0060 | 0x0000300C |
130+ S120 v2.1.0 | 0x006B | 0x0000300C |
131+ ----------------------------------------------
132+ S130 v0.9.0-1.alpha | 0x005E | 0x0000300C |
133+ S130 v1.0.0-3.alpha | 0x0066 | 0x0000300C |
134+ S130 v1.0.0 | 0x0067 | 0x0000300C |
135+ S130 v2.0.0 | 0x0080 | 0x0000300C |
136+ S130 v2.0.1 | 0x0087 | 0x0000300C |
137+ ----------------------------------------------
138+ S210 v3.0.0 | 0x004B | 0x10001010 |
139+ S210 v4.0.0 | 0x0057 | 0x0000300C |
140+ ----------------------------------------------
141+ S310 v1.0.0 | 0x004D | 0x10001010 |
142+ S310 v2.0.0 | 0x005D | 0x0000300C |
143+ S310 v2.0.1 | 0x005D | 0x0000300C |
144+ S310 v3.0.0 | 0x0065 | 0x0000300C |
145+ ----------------------------------------------
146+ S132 v1.0.0-3.alpha | 0x006D | ? |
147+ S132 v2.0.0-4.alpha | 0x0074 | ? |
148+ S132 v2.0.0-7.alpha | 0x0079 | 0x0000300C |
149+ S132 v2.0.0 | 0x0081 | 0x0000300C |
150+ S132 v2.0.1 | 0x0088 | 0x0000300C |
151+ ----------------------------------------------
152+ S212 v0.6.0.alpha | 0x007F | 0x0000300C |
153+ S212 v0.9.1.alpha | 0x0083 | 0x0000300C |
154+ ----------------------------------------------
155+ S332 v0.6.0.alpha | 0x007E | 0x0000300C |
156+ S332 v0.9.1.alpha | 0x0082 | 0x0000300C |
157+ ----------------------------------------------
158+ Development/any | 0xFFFE
159+ ----------------------------
160+ */
0 commit comments