OLD | NEW |
---|---|
1 /** | 1 /** |
2 * Copyright (c) 2011 NVIDIA Corporation. All rights reserved. | 2 * Copyright (c) 2011 NVIDIA Corporation. All rights reserved. |
3 * | 3 * |
4 * See file CREDITS for list of people who contributed to this | 4 * See file CREDITS for list of people who contributed to this |
5 * project. | 5 * project. |
6 * | 6 * |
7 * This program is free software; you can redistribute it and/or | 7 * This program is free software; you can redistribute it and/or |
8 * modify it under the terms of the GNU General Public License as | 8 * modify it under the terms of the GNU General Public License as |
9 * published by the Free Software Foundation; either version 2 of | 9 * published by the Free Software Foundation; either version 2 of |
10 * the License, or (at your option) any later version. | 10 * the License, or (at your option) any later version. |
(...skipping 18 matching lines...) Expand all Loading... | |
29 #include <string.h> | 29 #include <string.h> |
30 | 30 |
31 int enable_debug = 0; | 31 int enable_debug = 0; |
32 | 32 |
33 typedef struct { | 33 typedef struct { |
34 nvbct_lib_id id; | 34 nvbct_lib_id id; |
35 char const * message; | 35 char const * message; |
36 } value_data; | 36 } value_data; |
37 | 37 |
38 static value_data const values[] = { | 38 static value_data const values[] = { |
39 » {nvbct_lib_id_boot_data_version, | 39 » { nvbct_lib_id_boot_data_version, "Version = 0x%08x;\n" }, |
40 » "Version..................: 0x%08x\n"}, | 40 » { nvbct_lib_id_block_size_log2,» "BlockSize = 0x%08x;\n" }, |
Vincent Palatin
2011/03/14 21:11:10
I'm seeing mixed tabs and spaces between the 2 col
| |
41 » {nvbct_lib_id_block_size_log2, | 41 » { nvbct_lib_id_page_size_log2, "PageSize = 0x%08x;\n" }, |
42 » "Block size (log2)........: %d\n"}, | 42 » { nvbct_lib_id_partition_size,» "PartitionSize = 0x%08x;\n" }, |
43 » {nvbct_lib_id_page_size_log2, | 43 » { nvbct_lib_id_bootloader_used,» "# Bootloader used = %d;\n" }, |
44 » "Page size (log2).........: %d\n"}, | 44 » { nvbct_lib_id_bootloaders_max, "# Bootloaders max = %d;\n" }, |
45 » {nvbct_lib_id_partition_size, | 45 » { nvbct_lib_id_bct_size, "# BCT size = %d;\n" }, |
46 » "Parition size............: 0x%08x\n"}, | 46 » { nvbct_lib_id_hash_size, "# Hash size = %d;\n" }, |
47 » {nvbct_lib_id_bootloader_used, | 47 » { nvbct_lib_id_crypto_offset, "# Crypto offset = %d;\n" }, |
48 » "Bootloader used..........: %d\n"}, | 48 » { nvbct_lib_id_crypto_length, "# Crypto length = %d;\n" }, |
49 » {nvbct_lib_id_bootloaders_max, | 49 » { nvbct_lib_id_max_bct_search_blks, "# Max BCT search blocks = %d;\n" }, |
50 » "Bootloaders max..........: %d\n"}, | |
51 » {nvbct_lib_id_bct_size, | |
52 » "BCT size.................: %d\n"}, | |
53 » {nvbct_lib_id_hash_size, | |
54 » "Hash size................: %d\n"}, | |
55 » {nvbct_lib_id_crypto_offset, | |
56 » "Crypto offset............: %d\n"}, | |
57 » {nvbct_lib_id_crypto_length, | |
58 » "Crypto length............: %d\n"}, | |
59 » {nvbct_lib_id_max_bct_search_blks, | |
60 » "Max BCT search blocks....: %d\n"}, | |
61 » {nvbct_lib_id_num_param_sets, | |
62 » "Device parameters used...: %d\n"}, | |
63 }; | 50 }; |
64 | 51 |
65 static value_data const bl_values[] = { | 52 static value_data const bl_values[] = { |
66 » {nvbct_lib_id_bl_version, | 53 » { nvbct_lib_id_bl_version, "Version = 0x%08x;\n" }, |
67 » " Version.......: 0x%08x\n"}, | 54 » { nvbct_lib_id_bl_start_blk, "Start block = %d;\n" }, |
68 » {nvbct_lib_id_bl_start_blk, | 55 » { nvbct_lib_id_bl_start_page, "Start page = %d;\n" }, |
69 » " Start block...: %d\n"}, | 56 » { nvbct_lib_id_bl_length, "Length = %d;\n" }, |
70 » {nvbct_lib_id_bl_start_page, | 57 » { nvbct_lib_id_bl_load_addr, "Load address = 0x%08x;\n" }, |
71 » " Start page....: %d\n"}, | 58 » { nvbct_lib_id_bl_entry_point, "Entry point = 0x%08x;\n" }, |
72 » {nvbct_lib_id_bl_length, | 59 » { nvbct_lib_id_bl_attribute, "Attributes = 0x%08x;\n" }, |
73 » " Length........: %d\n"}, | |
74 » {nvbct_lib_id_bl_load_addr, | |
75 » " Load address..: 0x%08x\n"}, | |
76 » {nvbct_lib_id_bl_entry_point, | |
77 » " Entry point...: 0x%08x\n"}, | |
78 » {nvbct_lib_id_bl_attribute, | |
79 » " Attributes....: 0x%08x\n"}, | |
80 }; | |
81 | |
82 static const char *sdram_types[nvboot_memory_type_num] = { | |
83 » "None", "DDR", "LPDDR", "DDR2", "LPDDR2" | |
84 }; | 60 }; |
85 | 61 |
86 /*****************************************************************************/ | 62 /*****************************************************************************/ |
87 static void usage(void) | 63 static void usage(void) |
88 { | 64 { |
89 printf("Usage: bct_dump bctfile\n"); | 65 printf("Usage: bct_dump bctfile\n"); |
90 printf(" bctfile BCT filename to read and display\n"); | 66 printf(" bctfile BCT filename to read and display\n"); |
91 } | 67 } |
92 /*****************************************************************************/ | 68 /*****************************************************************************/ |
93 static int max_width(field_item const * table) | 69 static int max_width(field_item const * table) |
94 { | 70 { |
95 int width = 0; | 71 int width = 0; |
96 int i; | 72 int i; |
97 | 73 |
98 for (i = 0; table[i].name != NULL; ++i) | 74 for (i = 0; table[i].name != NULL; ++i) |
99 { | 75 { |
100 int length = strlen(table[i].name); | 76 int length = strlen(table[i].name); |
101 | 77 |
102 if (width < length) | 78 if (width < length) |
103 width = length; | 79 width = length; |
104 } | 80 } |
105 | 81 |
106 return width; | 82 return width; |
107 } | 83 } |
108 /*****************************************************************************/ | 84 /*****************************************************************************/ |
109 static int display_field_value(field_item const * item, u_int32_t value) | 85 static enum_item const * find_enum_item(build_image_context *context, |
86 » » » » » enum_item const * table, | |
87 » » » » » u_int32_t value) | |
88 { | |
89 » int i; | |
90 | |
91 » for (i = 0; table[i].name != NULL; ++i) | |
92 » { | |
93 » » u_int32_t» table_value; | |
94 | |
95 » » if (!context->bctlib.get_value(table[i].value, | |
96 » » » » » &table_value, | |
97 » » » » » context->bct) && | |
98 » » table_value == value) | |
99 » » » return table + i; | |
100 » } | |
101 | |
102 » return NULL; | |
103 } | |
104 /*****************************************************************************/ | |
105 static void display_enum_value(build_image_context *context, | |
106 » » » enum_item const * table, | |
107 » » » u_int32_t value) | |
108 { | |
109 » enum_item const * e_item = find_enum_item(context, table, value); | |
110 | |
111 » if (e_item) | |
112 » » printf("%s", e_item->name); | |
113 » else | |
114 » » printf("<UNKNOWN ENUM VALUE (%d)>", value); | |
115 } | |
116 /*****************************************************************************/ | |
117 static int display_field_value(build_image_context *context, | |
118 » » » field_item const * item, | |
119 » » » u_int32_t value) | |
110 { | 120 { |
111 switch (item->type) | 121 switch (item->type) |
112 { | 122 { |
113 case field_type_enum: | 123 case field_type_enum: |
114 » » » /* | 124 » » » display_enum_value(context, item->enum_table, value); |
115 » » » * It would be ideal if we could take the enum value | 125 » » » break; |
116 » » » * and programatically look up a string that the parse | |
117 » » » * would accept for this field. The problem is that | |
118 » » » * the mapping between field values and nvbct_lib_id | |
119 » » » * values is hard coded in the nvbctlib source. For | |
120 » » » * now we drop down to the u32 printing code. | |
121 » » » * | |
122 » » » * TODO(robotboy): Fix this | |
123 » » » */ | |
124 | 126 |
125 case field_type_u32: | 127 case field_type_u32: |
126 printf("0x%08x", value); | 128 printf("0x%08x", value); |
127 break; | 129 break; |
128 | 130 |
129 case field_type_u8: | 131 case field_type_u8: |
130 » » » printf("0x%02x", value); | 132 » » » printf("%d", value); |
131 break; | 133 break; |
132 | 134 |
133 default: | 135 default: |
134 printf("<UNKNOWN FIELD TYPE (%d)>", item->type); | 136 printf("<UNKNOWN FIELD TYPE (%d)>", item->type); |
135 return 1; | 137 return 1; |
136 } | 138 } |
137 | 139 |
138 return 0; | 140 return 0; |
139 } | 141 } |
140 /*****************************************************************************/ | 142 /*****************************************************************************/ |
(...skipping 23 matching lines...) Expand all Loading... | |
164 if (e != 0) { | 166 if (e != 0) { |
165 printf("context initialization failed. Aborting.\n"); | 167 printf("context initialization failed. Aborting.\n"); |
166 return e; | 168 return e; |
167 } | 169 } |
168 | 170 |
169 read_bct_file(&context); | 171 read_bct_file(&context); |
170 | 172 |
171 /* Display root values */ | 173 /* Display root values */ |
172 for (i = 0; i < sizeof(values) / sizeof(values[0]); ++i) { | 174 for (i = 0; i < sizeof(values) / sizeof(values[0]); ++i) { |
173 e = context.bctlib.get_value(values[i].id, &data, context.bct); | 175 e = context.bctlib.get_value(values[i].id, &data, context.bct); |
174 » » printf(values[i].message, e == 0 ? data : -1); | 176 |
177 » » if (e != 0) | |
178 » » » data = -1; | |
179 » » else if (values[i].id == nvbct_lib_id_block_size_log2 || | |
180 » » » values[i].id == nvbct_lib_id_page_size_log2) | |
181 » » » data = 1 << data; | |
182 | |
183 » » printf(values[i].message, data); | |
175 } | 184 } |
176 | 185 |
177 /* Display bootloader values */ | 186 /* Display bootloader values */ |
178 e = context.bctlib.get_value(nvbct_lib_id_bootloader_used, | 187 e = context.bctlib.get_value(nvbct_lib_id_bootloader_used, |
179 &bootloaders_used, | 188 &bootloaders_used, |
180 context.bct); | 189 context.bct); |
181 | 190 |
182 » for (i = 0; (e == 0) && (i < bootloaders_used); ++i) { | 191 » if ((e == 0) && (bootloaders_used > 0)) { |
183 » » printf("Bootloader[%d]\n", i); | 192 » » int bl_count = sizeof(bl_values) / sizeof(bl_values[0]); |
184 | 193 |
185 » » for (j = 0; j < sizeof(bl_values) / sizeof(bl_values[0]); ++j) { | 194 » » printf("#\n" |
186 » » » e = context.bctlib.getbl_param(i, | 195 » » "# These values are set by cbootimage using the\n" |
187 » » » » » » bl_values[j].id, | 196 » » "# bootloader provided by the Bootloader=...\n" |
188 » » » » » » &data, | 197 » » "# configuration option.\n" |
189 » » » » » » context.bct); | 198 » » "#\n"); |
190 » » » printf(bl_values[j].message, e == 0 ? data : -1); | 199 |
200 » » for (i = 0; i < bootloaders_used; ++i) { | |
201 » » » for (j = 0; j < bl_count; ++j) { | |
202 » » » » e = context.bctlib.getbl_param(i, | |
203 » » » » » » » bl_values[j].id, | |
204 » » » » » » » &data, | |
205 » » » » » » » context.bct); | |
206 » » » » printf("# Bootloader[%d].", i); | |
207 | |
208 » » » » if (e != 0) | |
209 » » » » » data = -1; | |
210 | |
211 » » » » printf(bl_values[j].message, data); | |
212 » » » } | |
191 } | 213 } |
192 } | 214 } |
193 | 215 |
194 » /* Display device values */ | 216 » /* Display flash device parameters */ |
195 e = context.bctlib.get_value(nvbct_lib_id_num_param_sets, | 217 e = context.bctlib.get_value(nvbct_lib_id_num_param_sets, |
196 ¶meters_used, | 218 ¶meters_used, |
197 context.bct); | 219 context.bct); |
198 | 220 |
199 for (i = 0; (e == 0) && (i < parameters_used); ++i) { | 221 for (i = 0; (e == 0) && (i < parameters_used); ++i) { |
200 field_item const * device_field_table = NULL; | 222 field_item const * device_field_table = NULL; |
223 char const * prefix = NULL; | |
201 field_item const * item; | 224 field_item const * item; |
202 | 225 |
203 printf("DeviceParameter[%d]\n", i); | |
204 | |
205 e = context.bctlib.getdev_param(i, | 226 e = context.bctlib.getdev_param(i, |
206 nvbct_lib_id_dev_type, | 227 nvbct_lib_id_dev_type, |
207 &type, | 228 &type, |
208 context.bct); | 229 context.bct); |
209 | 230 |
231 printf("\n" | |
232 "DevType[%d] = ", i); | |
233 display_enum_value(&context, s_devtype_table, type); | |
234 printf(";\n"); | |
235 | |
210 switch (type) | 236 switch (type) |
211 { | 237 { |
212 case nvboot_dev_type_spi: | 238 case nvboot_dev_type_spi: |
213 printf(" Type = SPI\n"); | |
214 device_field_table = s_spiflash_table; | 239 device_field_table = s_spiflash_table; |
240 prefix = "SpiFlashParams"; | |
215 break; | 241 break; |
216 | 242 |
217 case nvboot_dev_type_sdmmc: | 243 case nvboot_dev_type_sdmmc: |
218 printf(" Type = SDMMC\n"); | |
219 device_field_table = s_sdmmc_table; | 244 device_field_table = s_sdmmc_table; |
245 prefix = "SdmmcParams"; | |
220 break; | 246 break; |
221 | 247 |
222 case nvboot_dev_type_nand: | 248 case nvboot_dev_type_nand: |
223 printf(" Type = NAND\n"); | |
224 device_field_table = s_nand_table; | 249 device_field_table = s_nand_table; |
250 prefix = "NandParams"; | |
225 break; | 251 break; |
226 | 252 |
227 default: | 253 default: |
228 device_field_table = NULL; | 254 device_field_table = NULL; |
229 » » » » printf(" Type = <UNKNOWN TYPE (%d)>\n", | 255 » » » » prefix = ""; |
230 » » » » type); | |
231 break; | 256 break; |
232 } | 257 } |
233 | 258 |
234 if (!device_field_table) | 259 if (!device_field_table) |
235 continue; | 260 continue; |
236 | 261 |
237 int width = max_width(device_field_table); | 262 int width = max_width(device_field_table); |
238 | 263 |
239 for (item = device_field_table; item->name != NULL; ++item) { | 264 for (item = device_field_table; item->name != NULL; ++item) { |
240 e = context.bctlib.getdev_param(i, | 265 e = context.bctlib.getdev_param(i, |
241 item->enum_value, | 266 item->enum_value, |
242 &data, | 267 &data, |
243 context.bct); | 268 context.bct); |
244 » » » printf(" %-*s = 0x%08x\n", | 269 » » » printf("DeviceParam[%d].%s.%-*s = ", |
245 » » » width, item->name, | 270 » » » i, prefix, width, item->name); |
246 » » » e == 0 ? data : -1); | 271 |
272 » » » if (e != 0) | |
273 » » » » printf("<ERROR reading parameter (%d)>", e); | |
274 » » » else | |
275 » » » » display_field_value(&context, item, data); | |
276 | |
277 » » » printf(";\n"); | |
247 } | 278 } |
248 } | 279 } |
249 | 280 |
250 » /* Display SDRAM parameters sets */ | 281 » /* Display SDRAM parameters */ |
251 e = context.bctlib.get_value(nvbct_lib_id_num_sdram_sets, | 282 e = context.bctlib.get_value(nvbct_lib_id_num_sdram_sets, |
252 &sdram_used, | 283 &sdram_used, |
253 context.bct); | 284 context.bct); |
254 | 285 |
255 for (i = 0; (e == 0) && (i < sdram_used); ++i) { | 286 for (i = 0; (e == 0) && (i < sdram_used); ++i) { |
256 printf("SDRAMParameter[%d]\n", i); | |
257 | |
258 e = context.bctlib.get_sdram_params(i, | |
259 nvbct_lib_id_sdram_memory_type, | |
260 &type, | |
261 context.bct); | |
262 | |
263 printf(" Type............................: %s\n", | |
264 type < nvboot_memory_type_num ? sdram_types[type] | |
265 : "Unknown"); | |
266 | |
267 int width = max_width(s_sdram_field_table); | 287 int width = max_width(s_sdram_field_table); |
268 field_item const * item; | 288 field_item const * item; |
269 | 289 |
290 printf("\n"); | |
291 | |
270 for (item = s_sdram_field_table; item->name != NULL; ++item) { | 292 for (item = s_sdram_field_table; item->name != NULL; ++item) { |
271 e = context.bctlib.get_sdram_params(i, | 293 e = context.bctlib.get_sdram_params(i, |
272 item->enum_value, | 294 item->enum_value, |
273 &data, | 295 &data, |
274 context.bct); | 296 context.bct); |
275 » » » printf(" %-*s = ", width, item->name); | 297 » » » printf("SDRAM[%d].%-*s = ", i, width, item->name); |
276 | 298 |
277 if (e != 0) | 299 if (e != 0) |
278 printf("<ERROR reading parameter (%d)>", e); | 300 printf("<ERROR reading parameter (%d)>", e); |
279 else | 301 else |
280 » » » » display_field_value(item, data); | 302 » » » » display_field_value(&context, item, data); |
281 | 303 |
282 » » » printf("\n"); | 304 » » » printf(";\n"); |
283 } | 305 } |
284 } | 306 } |
285 | 307 |
286 /* Clean up memory. */ | 308 /* Clean up memory. */ |
287 cleanup_context(&context); | 309 cleanup_context(&context); |
288 | 310 |
289 return e; | 311 return e; |
290 } | 312 } |
313 /*****************************************************************************/ | |
OLD | NEW |