2828 */
2929#define HDR_ALIGN (256)
3030
31- static void populate_hdr (riotboot_hdr_t * hdr , uint32_t ver , uint32_t addr )
31+ static size_t populate_hdr_v1 (riotboot_hdr_t * hdr , uint32_t ver , uint32_t addr )
3232{
3333 /* ensure the buffer and header have 0's */
34- memset (hdr , '\0' , sizeof (riotboot_hdr_t ));
35-
36- /* Generate image header */
37- hdr -> magic_number = RIOTBOOT_MAGIC ;
38- hdr -> version = ver ;
39- hdr -> start_addr = addr ;
34+ memset (hdr , '\0' , sizeof (* hdr ));
35+ /* Generate image header v1 */
36+ hdr -> v1 .magic_number = RIOTBOOT_MAGIC_V1 ;
37+ hdr -> v1 .version = ver ;
38+ hdr -> v1 .start_addr = addr ;
39+ /* calculate header checksum */
40+ hdr -> v1 .chksum = riotboot_hdr_checksum (hdr );
41+ return sizeof (hdr -> v1 );
42+ }
4043
44+ static size_t populate_hdr_v2 (riotboot_hdr_t * hdr , uint32_t ver , uint32_t addr )
45+ {
46+ /* ensure the buffer and header have 0's */
47+ memset (hdr , '\0' , sizeof (* hdr ));
48+ /* Generate image header v2 */
49+ hdr -> v2 .magic_number = RIOTBOOT_MAGIC_V2 ;
50+ hdr -> v2 .version = ver ;
51+ hdr -> v2 .start_addr = addr ;
52+ hdr -> v2 .flags = 0xffffffff ;
53+ hdr -> v2 .flags &= ~RIOTBOOT_HDR_IMAGE_STATE_MASK ;
54+ hdr -> v2 .flags |= (RIOTBOOT_HDR_IMG_STATE_ACTIVATED << RIOTBOOT_HDR_IMAGE_STATE_SHIFT );
4155 /* calculate header checksum */
42- hdr -> chksum = riotboot_hdr_checksum (hdr );
56+ hdr -> v2 .chksum = riotboot_hdr_checksum (hdr );
57+ return sizeof (hdr -> v2 );
4358}
4459
4560int genhdr (int argc , char * argv [])
4661{
47- const char generate_usage [] = "<IMG_BIN> <APP_VER> <START_ADDR> <HDR_LEN> <outfile|->" ;
62+ const char generate_usage [] = "<IMG_BIN> <APP_VER> <START_ADDR> <HDR_LEN> <outfile|-> [-v [v1,v2]] " ;
4863
4964 /* riotboot_hdr buffer */
5065 uint8_t * hdr_buf ;
@@ -93,14 +108,41 @@ int genhdr(int argc, char *argv[])
93108 hdr_len = hdr_len_arg ;
94109 }
95110
111+ /* generate only v1 by default */
112+ bool gen_v1 = true;
113+ bool gen_v2 = false;
114+ if (argc >= 8 ) {
115+ gen_v1 = false;
116+ if (!strcmp (argv [6 ], "-v" )) {
117+ for (int a = 7 ; a < argc ; a ++ ) {
118+ if (!strcmp (argv [a ], "v1" )) {
119+ gen_v1 = true;
120+ }
121+ else if (!strcmp (argv [a ], "v2" )) {
122+ gen_v2 = true;
123+ }
124+ else {
125+ fprintf (stderr , "Error: unknown version '%s'!\n" , argv [a ]);
126+ return -1 ;
127+ }
128+ }
129+ }
130+ }
96131 /* prepare a 0 initialised buffer for riotboot_hdr_t */
97132 hdr_buf = calloc (1 , hdr_len );
98133 if (hdr_buf == NULL ) {
99134 fprintf (stderr , "Error: not enough memory!\n" );
100135 return -1 ;
101136 }
102137
103- populate_hdr ((riotboot_hdr_t * )hdr_buf , app_ver , start_addr );
138+ size_t gen_hdr_size = 0 ;
139+ uint8_t * p_hdr = hdr_buf ;
140+ if (gen_v1 ) {
141+ gen_hdr_size += populate_hdr_v1 ((riotboot_hdr_t * )(p_hdr + gen_hdr_size ), app_ver , start_addr );
142+ }
143+ if (gen_v2 ) {
144+ gen_hdr_size += populate_hdr_v2 ((riotboot_hdr_t * )(p_hdr + gen_hdr_size ), app_ver , start_addr );
145+ }
104146
105147 /* Write the header */
106148 if (!to_file (argv [5 ], hdr_buf , hdr_len )) {
@@ -124,35 +166,43 @@ int updatehdr(int argc, char *argv[])
124166
125167 riotboot_hdr_t hdr = { 0 };
126168 int res = from_file (file , & hdr , sizeof (hdr ));
127- if (res < (int )sizeof (hdr )) {
169+ if (res < (int )sizeof (hdr . v1 )) {
128170 fprintf (stderr , "Can't read header from %s\n" , file );
129171 return - EIO ;
130172 }
131-
132- if (hdr .magic_number != RIOTBOOT_MAGIC ) {
133- fprintf (stderr , "Invalid magic: %x\n" , hdr .magic_number );
173+ uint32_t magic = riotboot_hdr_get_magic_number (& hdr );
174+ if (magic == RIOTBOOT_MAGIC_V2 ) {
175+ hdr .v2 .magic_number = RIOTBOOT_MAGIC_V2 ;
176+ hdr .v2 .version = atoi (argv [2 ]);
177+ hdr .v2 .chksum = riotboot_hdr_checksum (& hdr );
178+ to_file (file , & hdr , sizeof (hdr .v2 ));
179+ }
180+ else if (magic == RIOTBOOT_MAGIC_V1 ) {
181+ hdr .v1 .magic_number = RIOTBOOT_MAGIC_V1 ;
182+ hdr .v1 .version = atoi (argv [2 ]);
183+ hdr .v1 .chksum = riotboot_hdr_checksum (& hdr );
184+ to_file (file , & hdr , sizeof (hdr .v1 ));
185+ }
186+ else {
187+ fprintf (stderr , "Invalid magic: %x\n" , magic );
134188 return - EIO ;
135189 }
136190
137- hdr .version = atoi (argv [2 ]);
138- hdr .chksum = riotboot_hdr_checksum (& hdr );
139- to_file (file , & hdr , sizeof (hdr ));
140-
141191 return 0 ;
142192}
143193
144194static void print_hdr (const riotboot_hdr_t * hdr )
145195{
146- printf ("version: %u\n" , hdr -> version );
147- printf ("address: 0x%x\n" , hdr -> start_addr );
196+ printf ("version: %u\n" , riotboot_hdr_get_version ( hdr ) );
197+ printf ("address: 0x%x\n" , riotboot_hdr_get_start_addr ( hdr ) );
148198 printf ("checksum: %svalid\n" , riotboot_hdr_validate (hdr ) ? "in" : "" );
149199}
150200
151201static void print_hdr_json (const riotboot_hdr_t * hdr )
152202{
153203 printf ("{\n" );
154- printf ("\t\"version\": %u,\n" , hdr -> version );
155- printf ("\t\"address\": %u,\n" , hdr -> start_addr );
204+ printf ("\t\"version\": %u,\n" , riotboot_hdr_get_version ( hdr ) );
205+ printf ("\t\"address\": %u,\n" , riotboot_hdr_get_start_addr ( hdr ) );
156206 printf ("\t\"valid\": %s\n" , riotboot_hdr_validate (hdr ) ? "false" : "true" );
157207 printf ("}\n" );
158208}
@@ -166,8 +216,8 @@ int readhdr(const char *file, bool json)
166216 return - EIO ;
167217 }
168218
169- if (hdr . magic_number != RIOTBOOT_MAGIC ) {
170- fprintf (stderr , "Invalid magic: %x\n" , hdr . magic_number );
219+ if (riotboot_hdr_get_magic_number ( & hdr ) != RIOTBOOT_MAGIC ) {
220+ fprintf (stderr , "Invalid magic: %x\n" , riotboot_hdr_get_magic_number ( & hdr ) );
171221 return - EIO ;
172222 }
173223
0 commit comments