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