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