]> git.proxmox.com Git - mirror_edk2.git/blob - BeagleBoardPkg/Tools/generate_image.c
9bcd67a1878799a0d51b8a40b120d5a591cd2d80
[mirror_edk2.git] / BeagleBoardPkg / Tools / generate_image.c
1 /** @file
2
3 Copyright (c) 2008-2009, Apple Inc. All rights reserved.
4
5 All rights reserved. This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13 **/
14
15 #include <stdio.h>
16 #include <stdlib.h>
17 #include <string.h>
18 #include <errno.h>
19 #include <sys/types.h>
20 #include <sys/stat.h>
21 #include <unistd.h>
22
23 //TOC structure as defined by OMAP35XX TRM.
24 typedef struct {
25 unsigned int Start;
26 unsigned int Size;
27 unsigned int Reserved1;
28 unsigned int Reserved2;
29 unsigned int Reserved3;
30 unsigned char Filename[12];
31 } TOC_DATA;
32
33 //NOTE: OMAP3430 TRM has CHSETTINGS and CHRAM structures.
34 typedef struct {
35 unsigned int SectionKey;
36 unsigned char Valid;
37 unsigned char Version;
38 unsigned short Reserved;
39 unsigned int Flags;
40 unsigned int PRM_CLKSRC_CTRL;
41 unsigned int PRM_CLKSEL;
42 unsigned int CM_CLKSEL1_EMU;
43 unsigned int CM_CLKSEL_CORE;
44 unsigned int CM_CLKSEL_WKUP;
45 unsigned int CM_CLKEN_PLL_DPLL3;
46 unsigned int CM_AUTOIDLE_PLL_DPLL3;
47 unsigned int CM_CLKSEL1_PLL;
48 unsigned int CM_CLKEN_PLL_DPLL4;
49 unsigned int CM_AUTOIDLE_PLL_DPLL4;
50 unsigned int CM_CLKSEL2_PLL;
51 unsigned int CM_CLKSEL3_PLL;
52 unsigned int CM_CLKEN_PLL_MPU;
53 unsigned int CM_AUTOIDLE_PLL_MPU;
54 unsigned int CM_CLKSEL1_PLL_MPU;
55 unsigned int CM_CLKSEL2_PLL_MPU;
56 unsigned int CM_CLKSTCTRL_MPU;
57 } CHSETTINGS_DATA;
58
59 typedef struct {
60 unsigned int SectionKey;
61 unsigned char Valid;
62 unsigned char Reserved1;
63 unsigned char Reserved2;
64 unsigned char Reserved3;
65 unsigned short SDRC_SYSCONFIG_LSB;
66 unsigned short SDRC_CS_CFG_LSB;
67 unsigned short SDRC_SHARING_LSB;
68 unsigned short SDRC_ERR_TYPE_LSB;
69 unsigned int SDRC_DLLA_CTRL;
70 unsigned short Reserved4;
71 unsigned short Reserved5;
72 unsigned int SDRC_POWER;
73 unsigned short MEMORY_TYPE_CS0;
74 unsigned short Reserved6;
75 unsigned int SDRC_MCFG_0;
76 unsigned short SDRC_MR_0_LSB;
77 unsigned short SDRC_EMR1_0_LSB;
78 unsigned short SDRC_EMR2_0_LSB;
79 unsigned short SDRC_EMR3_0_LSB;
80 unsigned int SDRC_ACTIM_CTRLA_0;
81 unsigned int SDRC_ACTIM_CTRLB_0;
82 unsigned int SDRC_RFRCTRL_0;
83 unsigned short MEMORY_TYPE_CS1;
84 unsigned short Reserved7;
85 unsigned int SDRC_MCFG_1;
86 unsigned short SDRC_MR_1_LSB;
87 unsigned short SDRC_EMR1_1_LSB;
88 unsigned short SDRC_EMR2_1_LSB;
89 unsigned short SDRC_EMR3_1_LSB;
90 unsigned int SDRC_ACTIM_CTRLA_1;
91 unsigned int SDRC_ACTIM_CTRLB_1;
92 unsigned int SDRC_RFRCTRL_1;
93 unsigned int Reserved8;
94 unsigned short Flags;
95 unsigned short Reserved9;
96 } CHRAM_DATA;
97
98 #define CHSETTINGS_START 0xA0
99 #define CHSETTINGS_SIZE 0x50
100 #define CHRAM_START 0xF0
101 #define CHRAM_SIZE 0x5C
102 #define CLOSING_TOC_ITEM_SIZE 4
103
104 unsigned char gConfigurationHeader[512];
105 unsigned int gImageExecutionAddress;
106 char *gInputImageFile = NULL;
107 char *gOutputImageFile = NULL;
108 char *gDataFile = NULL;
109
110 static
111 void
112 PrintUsage (
113 void
114 )
115 {
116 printf("Usage..\n");
117 }
118
119 static
120 void
121 PopulateCHSETTINGSData (
122 FILE *DataFile,
123 CHSETTINGS_DATA *CHSETTINGSData
124 )
125 {
126 unsigned int Value;
127
128 CHSETTINGSData->SectionKey = 0xC0C0C0C1;
129 CHSETTINGSData->Valid = 0x1;
130 CHSETTINGSData->Version = 0x1;
131 CHSETTINGSData->Reserved = 0x00;
132 CHSETTINGSData->Flags = 0x050001FD;
133
134 //General clock settings.
135 fscanf(DataFile, "PRM_CLKSRC_CTRL=0x%08x\n", &Value);
136 CHSETTINGSData->PRM_CLKSRC_CTRL = Value;
137 fscanf(DataFile, "PRM_CLKSEL=0x%08x\n", &Value);
138 CHSETTINGSData->PRM_CLKSEL = Value;
139 fscanf(DataFile, "CM_CLKSEL1_EMU=0x%08x\n", &Value);
140 CHSETTINGSData->CM_CLKSEL1_EMU = Value;
141
142 //Clock configuration
143 fscanf(DataFile, "CM_CLKSEL_CORE=0x%08x\n", &Value);
144 CHSETTINGSData->CM_CLKSEL_CORE = Value;
145 fscanf(DataFile, "CM_CLKSEL_WKUP=0x%08x\n", &Value);
146 CHSETTINGSData->CM_CLKSEL_WKUP = Value;
147
148 //DPLL3 (Core) settings
149 fscanf(DataFile, "CM_CLKEN_PLL_DPLL3=0x%08x\n", &Value);
150 CHSETTINGSData->CM_CLKEN_PLL_DPLL3 = Value;
151 fscanf(DataFile, "CM_AUTOIDLE_PLL_DPLL3=0x%08x\n", &Value);
152 CHSETTINGSData->CM_AUTOIDLE_PLL_DPLL3 = Value;
153 fscanf(DataFile, "CM_CLKSEL1_PLL=0x%08x\n", &Value);
154 CHSETTINGSData->CM_CLKSEL1_PLL = Value;
155
156 //DPLL4 (Peripheral) settings
157 fscanf(DataFile, "CM_CLKEN_PLL_DPLL4=0x%08x\n", &Value);
158 CHSETTINGSData->CM_CLKEN_PLL_DPLL4 = Value;
159 fscanf(DataFile, "CM_AUTOIDLE_PLL_DPLL4=0x%08x\n", &Value);
160 CHSETTINGSData->CM_AUTOIDLE_PLL_DPLL4 = Value;
161 fscanf(DataFile, "CM_CLKSEL2_PLL=0x%08x\n", &Value);
162 CHSETTINGSData->CM_CLKSEL2_PLL = Value;
163 fscanf(DataFile, "CM_CLKSEL3_PLL=0x%08x\n", &Value);
164 CHSETTINGSData->CM_CLKSEL3_PLL = Value;
165
166 //DPLL1 (MPU) settings
167 fscanf(DataFile, "CM_CLKEN_PLL_MPU=0x%08x\n", &Value);
168 CHSETTINGSData->CM_CLKEN_PLL_MPU = Value;
169 fscanf(DataFile, "CM_AUTOIDLE_PLL_MPU=0x%08x\n", &Value);
170 CHSETTINGSData->CM_AUTOIDLE_PLL_MPU = Value;
171 fscanf(DataFile, "CM_CLKSEL1_PLL_MPU=0x%08x\n", &Value);
172 CHSETTINGSData->CM_CLKSEL1_PLL_MPU = Value;
173 fscanf(DataFile, "CM_CLKSEL2_PLL_MPU=0x%08x\n", &Value);
174 CHSETTINGSData->CM_CLKSEL2_PLL_MPU = Value;
175 fscanf(DataFile, "CM_CLKSTCTRL_MPU=0x%08x\n", &Value);
176 CHSETTINGSData->CM_CLKSTCTRL_MPU = Value;
177 }
178
179 static
180 void
181 PopulateCHRAMData (
182 FILE *DataFile,
183 CHRAM_DATA *CHRAMData
184 )
185 {
186 unsigned int Value;
187
188 CHRAMData->SectionKey = 0xC0C0C0C2;
189 CHRAMData->Valid = 0x1;
190
191 fscanf(DataFile, "SDRC_SYSCONFIG_LSB=0x%04x\n", &Value);
192 CHRAMData->SDRC_SYSCONFIG_LSB = Value;
193 fscanf(DataFile, "SDRC_CS_CFG_LSB=0x%04x\n", &Value);
194 CHRAMData->SDRC_CS_CFG_LSB = Value;
195 fscanf(DataFile, "SDRC_SHARING_LSB=0x%04x\n", &Value);
196 CHRAMData->SDRC_SHARING_LSB = Value;
197 fscanf(DataFile, "SDRC_ERR_TYPE_LSB=0x%04x\n", &Value);
198 CHRAMData->SDRC_ERR_TYPE_LSB = Value;
199 fscanf(DataFile, "SDRC_DLLA_CTRL=0x%08x\n", &Value);
200 CHRAMData->SDRC_DLLA_CTRL = Value;
201 fscanf(DataFile, "SDRC_POWER=0x%08x\n", &Value);
202 CHRAMData->SDRC_POWER = Value;
203 fscanf(DataFile, "MEMORY_TYPE_CS0=0x%04x\n", &Value);
204 CHRAMData->MEMORY_TYPE_CS0 = Value;
205 fscanf(DataFile, "SDRC_MCFG_0=0x%08x\n", &Value);
206 CHRAMData->SDRC_MCFG_0 = Value;
207 fscanf(DataFile, "SDRC_MR_0_LSB=0x%04x\n", &Value);
208 CHRAMData->SDRC_MR_0_LSB = Value;
209 fscanf(DataFile, "SDRC_EMR1_0_LSB=0x%04x\n", &Value);
210 CHRAMData->SDRC_EMR1_0_LSB = Value;
211 fscanf(DataFile, "SDRC_EMR2_0_LSB=0x%04x\n", &Value);
212 CHRAMData->SDRC_EMR2_0_LSB = Value;
213 fscanf(DataFile, "SDRC_EMR3_0_LSB=0x%04x\n", &Value);
214 CHRAMData->SDRC_EMR3_0_LSB = Value;
215 fscanf(DataFile, "SDRC_ACTIM_CTRLA_0=0x%08x\n", &Value);
216 CHRAMData->SDRC_ACTIM_CTRLA_0 = Value;
217 fscanf(DataFile, "SDRC_ACTIM_CTRLB_0=0x%08x\n", &Value);
218 CHRAMData->SDRC_ACTIM_CTRLB_0 = Value;
219 fscanf(DataFile, "SDRC_RFRCTRL_0=0x%08x\n", &Value);
220 CHRAMData->SDRC_RFRCTRL_0 = Value;
221 fscanf(DataFile, "MEMORY_TYPE_CS1=0x%04x\n", &Value);
222 CHRAMData->MEMORY_TYPE_CS1 = Value;
223 fscanf(DataFile, "SDRC_MCFG_1=0x%08x\n", &Value);
224 CHRAMData->SDRC_MCFG_1 = Value;
225 fscanf(DataFile, "SDRC_MR_1_LSB=0x%04x\n", &Value);
226 CHRAMData->SDRC_MR_1_LSB = Value;
227 fscanf(DataFile, "SDRC_EMR1_1_LSB=0x%04x\n", &Value);
228 CHRAMData->SDRC_EMR1_1_LSB = Value;
229 fscanf(DataFile, "SDRC_EMR2_1_LSB=0x%04x\n", &Value);
230 CHRAMData->SDRC_EMR2_1_LSB = Value;
231 fscanf(DataFile, "SDRC_EMR3_1_LSB=0x%04x\n", &Value);
232 CHRAMData->SDRC_EMR3_1_LSB = Value;
233 fscanf(DataFile, "SDRC_ACTIM_CTRLA_1=0x%08x\n", &Value);
234 CHRAMData->SDRC_ACTIM_CTRLA_1 = Value;
235 fscanf(DataFile, "SDRC_ACTIM_CTRLB_1=0x%08x\n", &Value);
236 CHRAMData->SDRC_ACTIM_CTRLB_1 = Value;
237 fscanf(DataFile, "SDRC_RFRCTRL_1=0x%08x\n", &Value);
238 CHRAMData->SDRC_RFRCTRL_1 = Value;
239
240 CHRAMData->Flags = 0x0003;
241 }
242
243 static
244 void
245 PrepareConfigurationHeader (
246 void
247 )
248 {
249 TOC_DATA Toc;
250 CHSETTINGS_DATA CHSETTINGSData;
251 CHRAM_DATA CHRAMData;
252 unsigned int ConfigurationHdrOffset = 0;
253 FILE *DataFile;
254
255 // Open data file
256 DataFile = fopen(gDataFile, "rb");
257 if (DataFile == NULL) {
258 fprintf(stderr, "Can't open data file %s.\n", gOutputImageFile);
259 exit(1);
260 }
261
262 //Initialize configuration header.
263 memset(gConfigurationHeader, 0x00, sizeof(gConfigurationHeader));
264
265 //CHSETTINGS TOC
266 memset(&Toc, 0x00, sizeof(TOC_DATA));
267 Toc.Start = CHSETTINGS_START;
268 Toc.Size = CHSETTINGS_SIZE;
269 strcpy((char *)Toc.Filename, (const char *)"CHSETTINGS");
270 memcpy(gConfigurationHeader + ConfigurationHdrOffset, &Toc, sizeof(TOC_DATA));
271
272 //Populate CHSETTINGS Data
273 memset(&CHSETTINGSData, 0x00, sizeof(CHSETTINGS_DATA));
274 PopulateCHSETTINGSData(DataFile, &CHSETTINGSData);
275 memcpy(gConfigurationHeader + Toc.Start, &CHSETTINGSData, Toc.Size);
276
277 //Adjust ConfigurationHdrOffset to point to next TOC
278 ConfigurationHdrOffset += sizeof(TOC_DATA);
279
280 //CHRAM TOC
281 memset(&Toc, 0x00, sizeof(TOC_DATA));
282 Toc.Start = CHRAM_START;
283 Toc.Size = CHRAM_SIZE;
284 strcpy((char *)Toc.Filename, (const char *)"CHRAM");
285 memcpy(gConfigurationHeader + ConfigurationHdrOffset, &Toc, sizeof(TOC_DATA));
286
287 //Populate CHRAM Data
288 memset(&CHRAMData, 0x00, sizeof(CHRAM_DATA));
289 PopulateCHRAMData(DataFile, &CHRAMData);
290 memcpy(gConfigurationHeader + Toc.Start, &CHRAMData, Toc.Size);
291
292 //Adjust ConfigurationHdrOffset to point to next TOC
293 ConfigurationHdrOffset += sizeof(TOC_DATA);
294
295 //Closing TOC item
296 memset(gConfigurationHeader + ConfigurationHdrOffset, 0xFF, CLOSING_TOC_ITEM_SIZE);
297 ConfigurationHdrOffset += CLOSING_TOC_ITEM_SIZE;
298
299 // Close data file
300 fclose(DataFile);
301 }
302
303 static
304 void
305 ConstructImage (
306 void
307 )
308 {
309 FILE *InputFile;
310 FILE *OutputFile;
311 unsigned int InputImageFileSize;
312 unsigned int NewImageFileSize;
313 struct stat FileStat;
314 char Ch;
315 unsigned int i;
316
317 InputFile = fopen(gInputImageFile, "rb");
318 if (InputFile == NULL) {
319 fprintf(stderr, "Can't open input file.\n");
320 exit(0);
321 }
322
323 //Get the size of the input image.
324 fstat(fileno(InputFile), &FileStat);
325 InputImageFileSize = FileStat.st_size;
326
327 //Calculate new file size
328 NewImageFileSize = InputImageFileSize - 520;
329
330 OutputFile = fopen(gOutputImageFile, "wb");
331 if (OutputFile == NULL) {
332 fprintf(stderr, "Can't open output file %s.\n", gOutputImageFile);
333 exit(0);
334 }
335
336 //Write Configuration header
337 fwrite(gConfigurationHeader, 1, sizeof(gConfigurationHeader), OutputFile);
338
339 //Write image header (Input image size, execution address)
340 fwrite(&NewImageFileSize, 1, 4, OutputFile);
341 fwrite(&gImageExecutionAddress, 1, 4, OutputFile);
342
343 //Skip first 0x207 bytes
344 fseek(InputFile, 520, SEEK_SET);
345
346 //Copy input image to the output file.
347 for (i = 0; i < NewImageFileSize; i++) {
348 fread(&Ch, 1, 1, InputFile);
349 fwrite(&Ch, 1, 1, OutputFile);
350 }
351
352 fclose(InputFile);
353 fclose(OutputFile);
354 }
355
356 int
357 main (
358 int argc,
359 char** argv
360 )
361 {
362 char Ch;
363 unsigned char *ptr;
364
365 if (argc == 1) {
366 PrintUsage ();
367 exit(1);
368 }
369
370 while ((Ch = getopt(argc, argv, "D:E:I:O:")) != -1) {
371 switch (Ch) {
372 case 'E': /* Image execution address */
373 gImageExecutionAddress = strtoul (optarg, (char **)&ptr, 16);
374 break;
375
376 case 'I': /* Input image file */
377 gInputImageFile = optarg;
378 break;
379
380 case 'O': /* Output image file */
381 gOutputImageFile = optarg;
382 break;
383
384 case 'D': /* Data file */
385 gDataFile = optarg;
386 break;
387
388 case '?':
389 if ((optopt == 'E') || (optopt == 'I') || (optopt == 'O')) {
390 fprintf (stderr, "Option -%c requires an argument.\n", optopt);
391 } else if (isprint (optopt)) {
392 fprintf (stderr, "Unknown option `-%c'.\n", optopt);
393 } else {
394 fprintf (stderr, "Unknown option character `\\x%x'.\n", optopt);
395 }
396 return 1;
397
398 default:
399 abort ();
400 }
401 }
402
403 //Prepare configuration header
404 PrepareConfigurationHeader ();
405
406 //Build image with configuration header + image header + image
407 ConstructImage ();
408
409 return 0;
410 }