3 Copyright (c) 2008-2009, Apple Inc. All rights reserved.
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
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.
19 #include <sys/types.h>
23 //TOC structure as defined by OMAP35XX TRM.
27 unsigned int Reserved1
;
28 unsigned int Reserved2
;
29 unsigned int Reserved3
;
30 unsigned char Filename
[12];
33 //NOTE: OMAP3430 TRM has CHSETTINGS and CHRAM structures.
35 unsigned int SectionKey
;
37 unsigned char Version
;
38 unsigned short Reserved
;
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
;
60 unsigned int SectionKey
;
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
;
95 unsigned short Reserved9
;
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
104 unsigned char gConfigurationHeader
[512];
105 unsigned int gImageExecutionAddress
;
106 char *gInputImageFile
= NULL
;
107 char *gOutputImageFile
= NULL
;
108 char *gDataFile
= NULL
;
121 PopulateCHSETTINGSData (
123 CHSETTINGS_DATA
*CHSETTINGSData
128 CHSETTINGSData
->SectionKey
= 0xC0C0C0C1;
129 CHSETTINGSData
->Valid
= 0x1;
130 CHSETTINGSData
->Version
= 0x1;
131 CHSETTINGSData
->Reserved
= 0x00;
132 CHSETTINGSData
->Flags
= 0x050001FD;
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
;
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
;
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
;
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
;
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
;
183 CHRAM_DATA
*CHRAMData
188 CHRAMData
->SectionKey
= 0xC0C0C0C2;
189 CHRAMData
->Valid
= 0x1;
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
;
240 CHRAMData
->Flags
= 0x0003;
245 PrepareConfigurationHeader (
250 CHSETTINGS_DATA CHSETTINGSData
;
251 CHRAM_DATA CHRAMData
;
252 unsigned int ConfigurationHdrOffset
= 0;
256 DataFile
= fopen(gDataFile
, "rb");
257 if (DataFile
== NULL
) {
258 fprintf(stderr
, "Can't open data file %s.\n", gOutputImageFile
);
262 //Initialize configuration header.
263 memset(gConfigurationHeader
, 0x00, sizeof(gConfigurationHeader
));
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
));
272 //Populate CHSETTINGS Data
273 memset(&CHSETTINGSData
, 0x00, sizeof(CHSETTINGS_DATA
));
274 PopulateCHSETTINGSData(DataFile
, &CHSETTINGSData
);
275 memcpy(gConfigurationHeader
+ Toc
.Start
, &CHSETTINGSData
, Toc
.Size
);
277 //Adjust ConfigurationHdrOffset to point to next TOC
278 ConfigurationHdrOffset
+= sizeof(TOC_DATA
);
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
));
287 //Populate CHRAM Data
288 memset(&CHRAMData
, 0x00, sizeof(CHRAM_DATA
));
289 PopulateCHRAMData(DataFile
, &CHRAMData
);
290 memcpy(gConfigurationHeader
+ Toc
.Start
, &CHRAMData
, Toc
.Size
);
292 //Adjust ConfigurationHdrOffset to point to next TOC
293 ConfigurationHdrOffset
+= sizeof(TOC_DATA
);
296 memset(gConfigurationHeader
+ ConfigurationHdrOffset
, 0xFF, CLOSING_TOC_ITEM_SIZE
);
297 ConfigurationHdrOffset
+= CLOSING_TOC_ITEM_SIZE
;
311 unsigned int InputImageFileSize
;
312 unsigned int NewImageFileSize
;
313 struct stat FileStat
;
317 InputFile
= fopen(gInputImageFile
, "rb");
318 if (InputFile
== NULL
) {
319 fprintf(stderr
, "Can't open input file.\n");
323 //Get the size of the input image.
324 fstat(fileno(InputFile
), &FileStat
);
325 InputImageFileSize
= FileStat
.st_size
;
327 //Calculate new file size
328 NewImageFileSize
= InputImageFileSize
- 520;
330 OutputFile
= fopen(gOutputImageFile
, "wb");
331 if (OutputFile
== NULL
) {
332 fprintf(stderr
, "Can't open output file %s.\n", gOutputImageFile
);
336 //Write Configuration header
337 fwrite(gConfigurationHeader
, 1, sizeof(gConfigurationHeader
), OutputFile
);
339 //Write image header (Input image size, execution address)
340 fwrite(&NewImageFileSize
, 1, 4, OutputFile
);
341 fwrite(&gImageExecutionAddress
, 1, 4, OutputFile
);
343 //Skip first 0x207 bytes
344 fseek(InputFile
, 520, SEEK_SET
);
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
);
370 while ((Ch
= getopt(argc
, argv
, "D:E:I:O:")) != -1) {
372 case 'E': /* Image execution address */
373 gImageExecutionAddress
= strtoul (optarg
, (char **)&ptr
, 16);
376 case 'I': /* Input image file */
377 gInputImageFile
= optarg
;
380 case 'O': /* Output image file */
381 gOutputImageFile
= optarg
;
384 case 'D': /* Data file */
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
);
394 fprintf (stderr
, "Unknown option character `\\x%x'.\n", optopt
);
403 //Prepare configuration header
404 PrepareConfigurationHeader ();
406 //Build image with configuration header + image header + image