]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BeagleBoardPkg/Tools/generate_image.c
ARM Packages: Fixed line endings
[mirror_edk2.git] / BeagleBoardPkg / Tools / generate_image.c
index fa4cdcc497eedb1f4684362a6b8573dee579edbb..9426ca333761a1f3be36ce38fd90781cedc1a2f3 100644 (file)
-/** @file
- The data structures in this code come from:
- OMAP35x Applications Processor Technical Reference Manual chapter 25
- OMAP34xx Multimedia Device Technical Reference Manual chapter 26.4.8.
- You should use the OMAP35x manual when possible. Some things, like SectionKey, 
- are not defined in the OMAP35x manual and you have to use the OMAP34xx manual
- to find the data. 
-
-  Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
-  
-  This program and the accompanying materials
-  are licensed and made available under the terms and conditions of the BSD License
-  which accompanies this distribution.  The full text of the license may be found at
-  http://opensource.org/licenses/bsd-license.php
-
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-
-
-
-//TOC structure as defined by OMAP35XX TRM.
-typedef struct {
-  unsigned int  Start;
-  unsigned int  Size;
-  unsigned int  Reserved1;
-  unsigned int  Reserved2;
-  unsigned int  Reserved3;
-  unsigned char Filename[12];
-} TOC_DATA;
-
-//NOTE: OMAP3430 TRM has CHSETTINGS and CHRAM structures.
-typedef struct {
-  unsigned int   SectionKey;
-  unsigned char  Valid;
-  unsigned char  Version;
-  unsigned short Reserved;
-  unsigned int   Flags;
-  unsigned int   PRM_CLKSRC_CTRL; 
-  unsigned int   PRM_CLKSEL; 
-  unsigned int   CM_CLKSEL1_EMU;
-  unsigned int   CM_CLKSEL_CORE;
-  unsigned int   CM_CLKSEL_WKUP;
-  unsigned int   CM_CLKEN_PLL_DPLL3;
-  unsigned int   CM_AUTOIDLE_PLL_DPLL3; 
-  unsigned int   CM_CLKSEL1_PLL; 
-  unsigned int   CM_CLKEN_PLL_DPLL4;
-  unsigned int   CM_AUTOIDLE_PLL_DPLL4;
-  unsigned int   CM_CLKSEL2_PLL;
-  unsigned int   CM_CLKSEL3_PLL; 
-  unsigned int   CM_CLKEN_PLL_MPU; 
-  unsigned int   CM_AUTOIDLE_PLL_MPU; 
-  unsigned int   CM_CLKSEL1_PLL_MPU; 
-  unsigned int   CM_CLKSEL2_PLL_MPU; 
-  unsigned int   CM_CLKSTCTRL_MPU;
-} CHSETTINGS_DATA;
-
-typedef struct {
-  unsigned int   SectionKey;
-  unsigned char  Valid;
-  unsigned char  Reserved1;
-  unsigned char  Reserved2;
-  unsigned char  Reserved3;
-  unsigned short SDRC_SYSCONFIG_LSB;
-  unsigned short SDRC_CS_CFG_LSB;
-  unsigned short SDRC_SHARING_LSB;
-  unsigned short SDRC_ERR_TYPE_LSB;
-  unsigned int   SDRC_DLLA_CTRL;
-  unsigned short Reserved4;
-  unsigned short Reserved5;
-  unsigned int   SDRC_POWER;
-  unsigned short MEMORY_TYPE_CS0;
-  unsigned short Reserved6;
-  unsigned int   SDRC_MCFG_0;
-  unsigned short SDRC_MR_0_LSB;
-  unsigned short SDRC_EMR1_0_LSB;
-  unsigned short SDRC_EMR2_0_LSB;
-  unsigned short SDRC_EMR3_0_LSB;
-  unsigned int   SDRC_ACTIM_CTRLA_0;
-  unsigned int   SDRC_ACTIM_CTRLB_0;
-  unsigned int   SDRC_RFRCTRL_0;
-  unsigned short MEMORY_TYPE_CS1;
-  unsigned short Reserved7;
-  unsigned int   SDRC_MCFG_1;
-  unsigned short SDRC_MR_1_LSB;
-  unsigned short SDRC_EMR1_1_LSB;
-  unsigned short SDRC_EMR2_1_LSB;
-  unsigned short SDRC_EMR3_1_LSB;
-  unsigned int   SDRC_ACTIM_CTRLA_1;
-  unsigned int   SDRC_ACTIM_CTRLB_1;
-  unsigned int   SDRC_RFRCTRL_1;
-  unsigned int   Reserved8;
-  unsigned short Flags;
-  unsigned short Reserved9;
-} CHRAM_DATA;
-
-#define CHSETTINGS_START      0xA0
-#define CHSETTINGS_SIZE       0x50
-#define CHRAM_START           0xF0
-#define CHRAM_SIZE            0x5C
-#define CLOSING_TOC_ITEM_SIZE 4
-
-unsigned char gConfigurationHeader[512];
-unsigned int  gImageExecutionAddress;
-char          *gInputImageFile = NULL;
-char          *gOutputImageFile = NULL;
-char          *gDataFile = NULL;
-
-static
-void
-PrintUsage (
-  void
-  )
-{
-  printf("Usage..\n");
-}
-
-static
-void
-PopulateCHSETTINGSData (
-  FILE            *DataFile,
-  CHSETTINGS_DATA *CHSETTINGSData
-  )
-{
-  unsigned int Value;
-  
-  CHSETTINGSData->SectionKey            = 0xC0C0C0C1;
-  CHSETTINGSData->Valid                 = 0x1;
-  CHSETTINGSData->Version               = 0x1;
-  CHSETTINGSData->Reserved              = 0x00;
-  CHSETTINGSData->Flags                 = 0x050001FD;
-
-  //General clock settings.
-  fscanf(DataFile, "PRM_CLKSRC_CTRL=0x%08x\n", &Value);
-  CHSETTINGSData->PRM_CLKSRC_CTRL = Value;
-  fscanf(DataFile, "PRM_CLKSEL=0x%08x\n", &Value);
-  CHSETTINGSData->PRM_CLKSEL = Value;
-  fscanf(DataFile, "CM_CLKSEL1_EMU=0x%08x\n", &Value);
-  CHSETTINGSData->CM_CLKSEL1_EMU = Value;
-
-  //Clock configuration
-  fscanf(DataFile, "CM_CLKSEL_CORE=0x%08x\n", &Value);
-  CHSETTINGSData->CM_CLKSEL_CORE = Value;
-  fscanf(DataFile, "CM_CLKSEL_WKUP=0x%08x\n", &Value);
-  CHSETTINGSData->CM_CLKSEL_WKUP = Value;
-
-  //DPLL3 (Core) settings
-  fscanf(DataFile, "CM_CLKEN_PLL_DPLL3=0x%08x\n", &Value);
-  CHSETTINGSData->CM_CLKEN_PLL_DPLL3 = Value;
-  fscanf(DataFile, "CM_AUTOIDLE_PLL_DPLL3=0x%08x\n", &Value);
-  CHSETTINGSData->CM_AUTOIDLE_PLL_DPLL3 = Value;
-  fscanf(DataFile, "CM_CLKSEL1_PLL=0x%08x\n", &Value);
-  CHSETTINGSData->CM_CLKSEL1_PLL = Value;
-
-  //DPLL4 (Peripheral) settings
-  fscanf(DataFile, "CM_CLKEN_PLL_DPLL4=0x%08x\n", &Value);
-  CHSETTINGSData->CM_CLKEN_PLL_DPLL4 = Value;
-  fscanf(DataFile, "CM_AUTOIDLE_PLL_DPLL4=0x%08x\n", &Value);
-  CHSETTINGSData->CM_AUTOIDLE_PLL_DPLL4 = Value;
-  fscanf(DataFile, "CM_CLKSEL2_PLL=0x%08x\n", &Value);
-  CHSETTINGSData->CM_CLKSEL2_PLL = Value;
-  fscanf(DataFile, "CM_CLKSEL3_PLL=0x%08x\n", &Value);
-  CHSETTINGSData->CM_CLKSEL3_PLL = Value;
-
-  //DPLL1 (MPU) settings
-  fscanf(DataFile, "CM_CLKEN_PLL_MPU=0x%08x\n", &Value);
-  CHSETTINGSData->CM_CLKEN_PLL_MPU = Value;
-  fscanf(DataFile, "CM_AUTOIDLE_PLL_MPU=0x%08x\n", &Value);
-  CHSETTINGSData->CM_AUTOIDLE_PLL_MPU = Value;
-  fscanf(DataFile, "CM_CLKSEL1_PLL_MPU=0x%08x\n", &Value);
-  CHSETTINGSData->CM_CLKSEL1_PLL_MPU = Value;
-  fscanf(DataFile, "CM_CLKSEL2_PLL_MPU=0x%08x\n", &Value);
-  CHSETTINGSData->CM_CLKSEL2_PLL_MPU = Value;
-  fscanf(DataFile, "CM_CLKSTCTRL_MPU=0x%08x\n", &Value);
-  CHSETTINGSData->CM_CLKSTCTRL_MPU = Value;
-}
-
-static
-void
-PopulateCHRAMData (
-  FILE       *DataFile,
-  CHRAM_DATA *CHRAMData
-  )
-{
-  unsigned int Value;
-  
-  CHRAMData->SectionKey         = 0xC0C0C0C2;
-  CHRAMData->Valid              = 0x1;
-  
-  fscanf(DataFile, "SDRC_SYSCONFIG_LSB=0x%04x\n", &Value);
-  CHRAMData->SDRC_SYSCONFIG_LSB = Value;
-  fscanf(DataFile, "SDRC_CS_CFG_LSB=0x%04x\n", &Value);
-  CHRAMData->SDRC_CS_CFG_LSB    = Value;
-  fscanf(DataFile, "SDRC_SHARING_LSB=0x%04x\n", &Value);
-  CHRAMData->SDRC_SHARING_LSB   = Value;
-  fscanf(DataFile, "SDRC_ERR_TYPE_LSB=0x%04x\n", &Value);
-  CHRAMData->SDRC_ERR_TYPE_LSB  = Value;
-  fscanf(DataFile, "SDRC_DLLA_CTRL=0x%08x\n", &Value);
-  CHRAMData->SDRC_DLLA_CTRL     = Value;
-  fscanf(DataFile, "SDRC_POWER=0x%08x\n", &Value);
-  CHRAMData->SDRC_POWER         = Value;
-  fscanf(DataFile, "MEMORY_TYPE_CS0=0x%04x\n", &Value);
-  CHRAMData->MEMORY_TYPE_CS0    = Value;
-  fscanf(DataFile, "SDRC_MCFG_0=0x%08x\n", &Value);
-  CHRAMData->SDRC_MCFG_0        = Value;
-  fscanf(DataFile, "SDRC_MR_0_LSB=0x%04x\n", &Value);
-  CHRAMData->SDRC_MR_0_LSB      = Value;
-  fscanf(DataFile, "SDRC_EMR1_0_LSB=0x%04x\n", &Value);
-  CHRAMData->SDRC_EMR1_0_LSB    = Value;
-  fscanf(DataFile, "SDRC_EMR2_0_LSB=0x%04x\n", &Value);
-  CHRAMData->SDRC_EMR2_0_LSB    = Value;
-  fscanf(DataFile, "SDRC_EMR3_0_LSB=0x%04x\n", &Value);
-  CHRAMData->SDRC_EMR3_0_LSB    = Value;
-  fscanf(DataFile, "SDRC_ACTIM_CTRLA_0=0x%08x\n", &Value);
-  CHRAMData->SDRC_ACTIM_CTRLA_0 = Value;
-  fscanf(DataFile, "SDRC_ACTIM_CTRLB_0=0x%08x\n", &Value);
-  CHRAMData->SDRC_ACTIM_CTRLB_0 = Value;
-  fscanf(DataFile, "SDRC_RFRCTRL_0=0x%08x\n", &Value);
-  CHRAMData->SDRC_RFRCTRL_0     = Value;
-  fscanf(DataFile, "MEMORY_TYPE_CS1=0x%04x\n", &Value);
-  CHRAMData->MEMORY_TYPE_CS1    = Value;
-  fscanf(DataFile, "SDRC_MCFG_1=0x%08x\n", &Value);
-  CHRAMData->SDRC_MCFG_1        = Value;
-  fscanf(DataFile, "SDRC_MR_1_LSB=0x%04x\n", &Value);
-  CHRAMData->SDRC_MR_1_LSB      = Value;
-  fscanf(DataFile, "SDRC_EMR1_1_LSB=0x%04x\n", &Value);
-  CHRAMData->SDRC_EMR1_1_LSB    = Value;
-  fscanf(DataFile, "SDRC_EMR2_1_LSB=0x%04x\n", &Value);
-  CHRAMData->SDRC_EMR2_1_LSB    = Value;
-  fscanf(DataFile, "SDRC_EMR3_1_LSB=0x%04x\n", &Value);
-  CHRAMData->SDRC_EMR3_1_LSB    = Value;
-  fscanf(DataFile, "SDRC_ACTIM_CTRLA_1=0x%08x\n", &Value);
-  CHRAMData->SDRC_ACTIM_CTRLA_1 = Value;
-  fscanf(DataFile, "SDRC_ACTIM_CTRLB_1=0x%08x\n", &Value);
-  CHRAMData->SDRC_ACTIM_CTRLB_1 = Value;
-  fscanf(DataFile, "SDRC_RFRCTRL_1=0x%08x\n", &Value);
-  CHRAMData->SDRC_RFRCTRL_1     = Value;
-
-  CHRAMData->Flags              = 0x0003;
-}
-
-static 
-void 
-PrepareConfigurationHeader (
-  void
-  )
-{
-  TOC_DATA        Toc;
-  CHSETTINGS_DATA CHSETTINGSData;
-  CHRAM_DATA      CHRAMData;
-  unsigned int    ConfigurationHdrOffset = 0;
-  FILE            *DataFile;
-  
-  // Open data file
-  DataFile = fopen(gDataFile, "rb");
-  if (DataFile == NULL) {
-    fprintf(stderr, "Can't open data file %s.\n", gDataFile);
-    exit(1);
-  }
-  
-  //Initialize configuration header.
-  memset(gConfigurationHeader, 0x00, sizeof(gConfigurationHeader));
-
-  //CHSETTINGS TOC
-  memset(&Toc, 0x00, sizeof(TOC_DATA));
-  Toc.Start = CHSETTINGS_START;
-  Toc.Size = CHSETTINGS_SIZE;
-  strcpy((char *)Toc.Filename, (const char *)"CHSETTINGS");
-  memcpy(gConfigurationHeader + ConfigurationHdrOffset, &Toc, sizeof(TOC_DATA));
-
-  //Populate CHSETTINGS Data
-  memset(&CHSETTINGSData, 0x00, sizeof(CHSETTINGS_DATA));
-  PopulateCHSETTINGSData(DataFile, &CHSETTINGSData);
-  memcpy(gConfigurationHeader + Toc.Start, &CHSETTINGSData, Toc.Size);
-
-  //Adjust ConfigurationHdrOffset to point to next TOC
-  ConfigurationHdrOffset += sizeof(TOC_DATA);
-
-  //CHRAM TOC
-  memset(&Toc, 0x00, sizeof(TOC_DATA));
-  Toc.Start = CHRAM_START;
-  Toc.Size = CHRAM_SIZE;
-  strcpy((char *)Toc.Filename, (const char *)"CHRAM");
-  memcpy(gConfigurationHeader + ConfigurationHdrOffset, &Toc, sizeof(TOC_DATA));
-
-  //Populate CHRAM Data
-  memset(&CHRAMData, 0x00, sizeof(CHRAM_DATA));
-  PopulateCHRAMData(DataFile, &CHRAMData);
-  memcpy(gConfigurationHeader + Toc.Start, &CHRAMData, Toc.Size);
-  
-  //Adjust ConfigurationHdrOffset to point to next TOC
-  ConfigurationHdrOffset += sizeof(TOC_DATA);
-
-  //Closing TOC item
-  memset(gConfigurationHeader + ConfigurationHdrOffset, 0xFF, CLOSING_TOC_ITEM_SIZE);
-  ConfigurationHdrOffset += CLOSING_TOC_ITEM_SIZE;
-  
-  // Close data file
-  fclose(DataFile);
-}
-
-static 
-void
-ConstructImage (
-  void
-  )
-{
-  FILE         *InputFile;
-  FILE         *OutputFile;
-  unsigned int InputImageFileSize;
-  struct       stat FileStat;
-  char         Ch;
-  unsigned int i;
-
-  InputFile = fopen(gInputImageFile, "rb");
-  if (InputFile == NULL) {
-    fprintf(stderr, "Can't open input file.\n");
-    exit(0);
-  } 
-
-  // Get the size of the input image.
-  fstat(fileno(InputFile), &FileStat);
-  InputImageFileSize = FileStat.st_size;
-  
-  OutputFile = fopen(gOutputImageFile, "wb");
-  if (OutputFile == NULL) {
-    fprintf(stderr, "Can't open output file %s.\n", gOutputImageFile);
-    exit(0);
-  }
-
-  // Write Configuration header 
-  fwrite(gConfigurationHeader, 1, sizeof(gConfigurationHeader), OutputFile);
-
-  // Write image header (Input image size, execution address)
-  fwrite(&InputImageFileSize, 1, 4, OutputFile);
-  fwrite(&gImageExecutionAddress, 1, 4, OutputFile);
-
-  // Copy input image to the output file.
-  for (i = 0; i < InputImageFileSize; i++) {
-    fread(&Ch, 1, 1, InputFile);
-    fwrite(&Ch, 1, 1, OutputFile);
-  }
-
-  fclose(InputFile);
-  fclose(OutputFile);
-}
-
-
-int 
-main (
-  int    argc, 
-  char** argv
-  )
-{
-  char          Ch;
-  unsigned char *ptr;
-  int           i;
-  int           TwoArg;  
-
-  if (argc == 1) {
-    PrintUsage ();
-    exit(1);
-  }
-
-  for (i=1; i < argc; i++) {
-    if (argv[i][0] == '-') {
-      // TwoArg TRUE -E 0x123, FALSE -E0x1234
-      TwoArg = (argv[i][2] != ' ');
-      switch (argv[i][1]) {
-        case 'E': /* Image execution address */
-          gImageExecutionAddress = strtoul (TwoArg ? argv[i+1] : &argv[i][2], (char **)&ptr, 16);
-          break;
-        
-        case 'I': /* Input image file */
-          gInputImageFile = TwoArg ? argv[i+1] : &argv[i][2];
-          break;
-
-        case 'O': /* Output image file */
-          gOutputImageFile = TwoArg ? argv[i+1] : &argv[i][2];
-          break;
-        
-        case 'D': /* Data file */
-          gDataFile = TwoArg ? argv[i+1] : &argv[i][2];
-          break;
-
-        default:
-          abort ();
-      }
-    }
-  }
-
-  //Prepare configuration header
-  PrepareConfigurationHeader ();
-
-  //Build image with configuration header + image header + image
-  ConstructImage ();
-
-  return 0;
-}
+/** @file\r
+ The data structures in this code come from:\r
+ OMAP35x Applications Processor Technical Reference Manual chapter 25\r
+ OMAP34xx Multimedia Device Technical Reference Manual chapter 26.4.8.\r
\r
+ You should use the OMAP35x manual when possible. Some things, like SectionKey, \r
+ are not defined in the OMAP35x manual and you have to use the OMAP34xx manual\r
+ to find the data. \r
+\r
+  Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>\r
+  \r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include <errno.h>\r
+#include <sys/types.h>\r
+#include <sys/stat.h>\r
+\r
+\r
+\r
+//TOC structure as defined by OMAP35XX TRM.\r
+typedef struct {\r
+  unsigned int  Start;\r
+  unsigned int  Size;\r
+  unsigned int  Reserved1;\r
+  unsigned int  Reserved2;\r
+  unsigned int  Reserved3;\r
+  unsigned char Filename[12];\r
+} TOC_DATA;\r
+\r
+//NOTE: OMAP3430 TRM has CHSETTINGS and CHRAM structures.\r
+typedef struct {\r
+  unsigned int   SectionKey;\r
+  unsigned char  Valid;\r
+  unsigned char  Version;\r
+  unsigned short Reserved;\r
+  unsigned int   Flags;\r
+  unsigned int   PRM_CLKSRC_CTRL; \r
+  unsigned int   PRM_CLKSEL; \r
+  unsigned int   CM_CLKSEL1_EMU;\r
+  unsigned int   CM_CLKSEL_CORE;\r
+  unsigned int   CM_CLKSEL_WKUP;\r
+  unsigned int   CM_CLKEN_PLL_DPLL3;\r
+  unsigned int   CM_AUTOIDLE_PLL_DPLL3; \r
+  unsigned int   CM_CLKSEL1_PLL; \r
+  unsigned int   CM_CLKEN_PLL_DPLL4;\r
+  unsigned int   CM_AUTOIDLE_PLL_DPLL4;\r
+  unsigned int   CM_CLKSEL2_PLL;\r
+  unsigned int   CM_CLKSEL3_PLL; \r
+  unsigned int   CM_CLKEN_PLL_MPU; \r
+  unsigned int   CM_AUTOIDLE_PLL_MPU; \r
+  unsigned int   CM_CLKSEL1_PLL_MPU; \r
+  unsigned int   CM_CLKSEL2_PLL_MPU; \r
+  unsigned int   CM_CLKSTCTRL_MPU;\r
+} CHSETTINGS_DATA;\r
+\r
+typedef struct {\r
+  unsigned int   SectionKey;\r
+  unsigned char  Valid;\r
+  unsigned char  Reserved1;\r
+  unsigned char  Reserved2;\r
+  unsigned char  Reserved3;\r
+  unsigned short SDRC_SYSCONFIG_LSB;\r
+  unsigned short SDRC_CS_CFG_LSB;\r
+  unsigned short SDRC_SHARING_LSB;\r
+  unsigned short SDRC_ERR_TYPE_LSB;\r
+  unsigned int   SDRC_DLLA_CTRL;\r
+  unsigned short Reserved4;\r
+  unsigned short Reserved5;\r
+  unsigned int   SDRC_POWER;\r
+  unsigned short MEMORY_TYPE_CS0;\r
+  unsigned short Reserved6;\r
+  unsigned int   SDRC_MCFG_0;\r
+  unsigned short SDRC_MR_0_LSB;\r
+  unsigned short SDRC_EMR1_0_LSB;\r
+  unsigned short SDRC_EMR2_0_LSB;\r
+  unsigned short SDRC_EMR3_0_LSB;\r
+  unsigned int   SDRC_ACTIM_CTRLA_0;\r
+  unsigned int   SDRC_ACTIM_CTRLB_0;\r
+  unsigned int   SDRC_RFRCTRL_0;\r
+  unsigned short MEMORY_TYPE_CS1;\r
+  unsigned short Reserved7;\r
+  unsigned int   SDRC_MCFG_1;\r
+  unsigned short SDRC_MR_1_LSB;\r
+  unsigned short SDRC_EMR1_1_LSB;\r
+  unsigned short SDRC_EMR2_1_LSB;\r
+  unsigned short SDRC_EMR3_1_LSB;\r
+  unsigned int   SDRC_ACTIM_CTRLA_1;\r
+  unsigned int   SDRC_ACTIM_CTRLB_1;\r
+  unsigned int   SDRC_RFRCTRL_1;\r
+  unsigned int   Reserved8;\r
+  unsigned short Flags;\r
+  unsigned short Reserved9;\r
+} CHRAM_DATA;\r
+\r
+#define CHSETTINGS_START      0xA0\r
+#define CHSETTINGS_SIZE       0x50\r
+#define CHRAM_START           0xF0\r
+#define CHRAM_SIZE            0x5C\r
+#define CLOSING_TOC_ITEM_SIZE 4\r
+\r
+unsigned char gConfigurationHeader[512];\r
+unsigned int  gImageExecutionAddress;\r
+char          *gInputImageFile = NULL;\r
+char          *gOutputImageFile = NULL;\r
+char          *gDataFile = NULL;\r
+\r
+static\r
+void\r
+PrintUsage (\r
+  void\r
+  )\r
+{\r
+  printf("Usage..\n");\r
+}\r
+\r
+static\r
+void\r
+PopulateCHSETTINGSData (\r
+  FILE            *DataFile,\r
+  CHSETTINGS_DATA *CHSETTINGSData\r
+  )\r
+{\r
+  unsigned int Value;\r
+  \r
+  CHSETTINGSData->SectionKey            = 0xC0C0C0C1;\r
+  CHSETTINGSData->Valid                 = 0x1;\r
+  CHSETTINGSData->Version               = 0x1;\r
+  CHSETTINGSData->Reserved              = 0x00;\r
+  CHSETTINGSData->Flags                 = 0x050001FD;\r
+\r
+  //General clock settings.\r
+  fscanf(DataFile, "PRM_CLKSRC_CTRL=0x%08x\n", &Value);\r
+  CHSETTINGSData->PRM_CLKSRC_CTRL = Value;\r
+  fscanf(DataFile, "PRM_CLKSEL=0x%08x\n", &Value);\r
+  CHSETTINGSData->PRM_CLKSEL = Value;\r
+  fscanf(DataFile, "CM_CLKSEL1_EMU=0x%08x\n", &Value);\r
+  CHSETTINGSData->CM_CLKSEL1_EMU = Value;\r
+\r
+  //Clock configuration\r
+  fscanf(DataFile, "CM_CLKSEL_CORE=0x%08x\n", &Value);\r
+  CHSETTINGSData->CM_CLKSEL_CORE = Value;\r
+  fscanf(DataFile, "CM_CLKSEL_WKUP=0x%08x\n", &Value);\r
+  CHSETTINGSData->CM_CLKSEL_WKUP = Value;\r
+\r
+  //DPLL3 (Core) settings\r
+  fscanf(DataFile, "CM_CLKEN_PLL_DPLL3=0x%08x\n", &Value);\r
+  CHSETTINGSData->CM_CLKEN_PLL_DPLL3 = Value;\r
+  fscanf(DataFile, "CM_AUTOIDLE_PLL_DPLL3=0x%08x\n", &Value);\r
+  CHSETTINGSData->CM_AUTOIDLE_PLL_DPLL3 = Value;\r
+  fscanf(DataFile, "CM_CLKSEL1_PLL=0x%08x\n", &Value);\r
+  CHSETTINGSData->CM_CLKSEL1_PLL = Value;\r
+\r
+  //DPLL4 (Peripheral) settings\r
+  fscanf(DataFile, "CM_CLKEN_PLL_DPLL4=0x%08x\n", &Value);\r
+  CHSETTINGSData->CM_CLKEN_PLL_DPLL4 = Value;\r
+  fscanf(DataFile, "CM_AUTOIDLE_PLL_DPLL4=0x%08x\n", &Value);\r
+  CHSETTINGSData->CM_AUTOIDLE_PLL_DPLL4 = Value;\r
+  fscanf(DataFile, "CM_CLKSEL2_PLL=0x%08x\n", &Value);\r
+  CHSETTINGSData->CM_CLKSEL2_PLL = Value;\r
+  fscanf(DataFile, "CM_CLKSEL3_PLL=0x%08x\n", &Value);\r
+  CHSETTINGSData->CM_CLKSEL3_PLL = Value;\r
+\r
+  //DPLL1 (MPU) settings\r
+  fscanf(DataFile, "CM_CLKEN_PLL_MPU=0x%08x\n", &Value);\r
+  CHSETTINGSData->CM_CLKEN_PLL_MPU = Value;\r
+  fscanf(DataFile, "CM_AUTOIDLE_PLL_MPU=0x%08x\n", &Value);\r
+  CHSETTINGSData->CM_AUTOIDLE_PLL_MPU = Value;\r
+  fscanf(DataFile, "CM_CLKSEL1_PLL_MPU=0x%08x\n", &Value);\r
+  CHSETTINGSData->CM_CLKSEL1_PLL_MPU = Value;\r
+  fscanf(DataFile, "CM_CLKSEL2_PLL_MPU=0x%08x\n", &Value);\r
+  CHSETTINGSData->CM_CLKSEL2_PLL_MPU = Value;\r
+  fscanf(DataFile, "CM_CLKSTCTRL_MPU=0x%08x\n", &Value);\r
+  CHSETTINGSData->CM_CLKSTCTRL_MPU = Value;\r
+}\r
+\r
+static\r
+void\r
+PopulateCHRAMData (\r
+  FILE       *DataFile,\r
+  CHRAM_DATA *CHRAMData\r
+  )\r
+{\r
+  unsigned int Value;\r
+  \r
+  CHRAMData->SectionKey         = 0xC0C0C0C2;\r
+  CHRAMData->Valid              = 0x1;\r
+  \r
+  fscanf(DataFile, "SDRC_SYSCONFIG_LSB=0x%04x\n", &Value);\r
+  CHRAMData->SDRC_SYSCONFIG_LSB = Value;\r
+  fscanf(DataFile, "SDRC_CS_CFG_LSB=0x%04x\n", &Value);\r
+  CHRAMData->SDRC_CS_CFG_LSB    = Value;\r
+  fscanf(DataFile, "SDRC_SHARING_LSB=0x%04x\n", &Value);\r
+  CHRAMData->SDRC_SHARING_LSB   = Value;\r
+  fscanf(DataFile, "SDRC_ERR_TYPE_LSB=0x%04x\n", &Value);\r
+  CHRAMData->SDRC_ERR_TYPE_LSB  = Value;\r
+  fscanf(DataFile, "SDRC_DLLA_CTRL=0x%08x\n", &Value);\r
+  CHRAMData->SDRC_DLLA_CTRL     = Value;\r
+  fscanf(DataFile, "SDRC_POWER=0x%08x\n", &Value);\r
+  CHRAMData->SDRC_POWER         = Value;\r
+  fscanf(DataFile, "MEMORY_TYPE_CS0=0x%04x\n", &Value);\r
+  CHRAMData->MEMORY_TYPE_CS0    = Value;\r
+  fscanf(DataFile, "SDRC_MCFG_0=0x%08x\n", &Value);\r
+  CHRAMData->SDRC_MCFG_0        = Value;\r
+  fscanf(DataFile, "SDRC_MR_0_LSB=0x%04x\n", &Value);\r
+  CHRAMData->SDRC_MR_0_LSB      = Value;\r
+  fscanf(DataFile, "SDRC_EMR1_0_LSB=0x%04x\n", &Value);\r
+  CHRAMData->SDRC_EMR1_0_LSB    = Value;\r
+  fscanf(DataFile, "SDRC_EMR2_0_LSB=0x%04x\n", &Value);\r
+  CHRAMData->SDRC_EMR2_0_LSB    = Value;\r
+  fscanf(DataFile, "SDRC_EMR3_0_LSB=0x%04x\n", &Value);\r
+  CHRAMData->SDRC_EMR3_0_LSB    = Value;\r
+  fscanf(DataFile, "SDRC_ACTIM_CTRLA_0=0x%08x\n", &Value);\r
+  CHRAMData->SDRC_ACTIM_CTRLA_0 = Value;\r
+  fscanf(DataFile, "SDRC_ACTIM_CTRLB_0=0x%08x\n", &Value);\r
+  CHRAMData->SDRC_ACTIM_CTRLB_0 = Value;\r
+  fscanf(DataFile, "SDRC_RFRCTRL_0=0x%08x\n", &Value);\r
+  CHRAMData->SDRC_RFRCTRL_0     = Value;\r
+  fscanf(DataFile, "MEMORY_TYPE_CS1=0x%04x\n", &Value);\r
+  CHRAMData->MEMORY_TYPE_CS1    = Value;\r
+  fscanf(DataFile, "SDRC_MCFG_1=0x%08x\n", &Value);\r
+  CHRAMData->SDRC_MCFG_1        = Value;\r
+  fscanf(DataFile, "SDRC_MR_1_LSB=0x%04x\n", &Value);\r
+  CHRAMData->SDRC_MR_1_LSB      = Value;\r
+  fscanf(DataFile, "SDRC_EMR1_1_LSB=0x%04x\n", &Value);\r
+  CHRAMData->SDRC_EMR1_1_LSB    = Value;\r
+  fscanf(DataFile, "SDRC_EMR2_1_LSB=0x%04x\n", &Value);\r
+  CHRAMData->SDRC_EMR2_1_LSB    = Value;\r
+  fscanf(DataFile, "SDRC_EMR3_1_LSB=0x%04x\n", &Value);\r
+  CHRAMData->SDRC_EMR3_1_LSB    = Value;\r
+  fscanf(DataFile, "SDRC_ACTIM_CTRLA_1=0x%08x\n", &Value);\r
+  CHRAMData->SDRC_ACTIM_CTRLA_1 = Value;\r
+  fscanf(DataFile, "SDRC_ACTIM_CTRLB_1=0x%08x\n", &Value);\r
+  CHRAMData->SDRC_ACTIM_CTRLB_1 = Value;\r
+  fscanf(DataFile, "SDRC_RFRCTRL_1=0x%08x\n", &Value);\r
+  CHRAMData->SDRC_RFRCTRL_1     = Value;\r
+\r
+  CHRAMData->Flags              = 0x0003;\r
+}\r
+\r
+static \r
+void \r
+PrepareConfigurationHeader (\r
+  void\r
+  )\r
+{\r
+  TOC_DATA        Toc;\r
+  CHSETTINGS_DATA CHSETTINGSData;\r
+  CHRAM_DATA      CHRAMData;\r
+  unsigned int    ConfigurationHdrOffset = 0;\r
+  FILE            *DataFile;\r
+  \r
+  // Open data file\r
+  DataFile = fopen(gDataFile, "rb");\r
+  if (DataFile == NULL) {\r
+    fprintf(stderr, "Can't open data file %s.\n", gDataFile);\r
+    exit(1);\r
+  }\r
+  \r
+  //Initialize configuration header.\r
+  memset(gConfigurationHeader, 0x00, sizeof(gConfigurationHeader));\r
+\r
+  //CHSETTINGS TOC\r
+  memset(&Toc, 0x00, sizeof(TOC_DATA));\r
+  Toc.Start = CHSETTINGS_START;\r
+  Toc.Size = CHSETTINGS_SIZE;\r
+  strcpy((char *)Toc.Filename, (const char *)"CHSETTINGS");\r
+  memcpy(gConfigurationHeader + ConfigurationHdrOffset, &Toc, sizeof(TOC_DATA));\r
+\r
+  //Populate CHSETTINGS Data\r
+  memset(&CHSETTINGSData, 0x00, sizeof(CHSETTINGS_DATA));\r
+  PopulateCHSETTINGSData(DataFile, &CHSETTINGSData);\r
+  memcpy(gConfigurationHeader + Toc.Start, &CHSETTINGSData, Toc.Size);\r
+\r
+  //Adjust ConfigurationHdrOffset to point to next TOC\r
+  ConfigurationHdrOffset += sizeof(TOC_DATA);\r
+\r
+  //CHRAM TOC\r
+  memset(&Toc, 0x00, sizeof(TOC_DATA));\r
+  Toc.Start = CHRAM_START;\r
+  Toc.Size = CHRAM_SIZE;\r
+  strcpy((char *)Toc.Filename, (const char *)"CHRAM");\r
+  memcpy(gConfigurationHeader + ConfigurationHdrOffset, &Toc, sizeof(TOC_DATA));\r
+\r
+  //Populate CHRAM Data\r
+  memset(&CHRAMData, 0x00, sizeof(CHRAM_DATA));\r
+  PopulateCHRAMData(DataFile, &CHRAMData);\r
+  memcpy(gConfigurationHeader + Toc.Start, &CHRAMData, Toc.Size);\r
+  \r
+  //Adjust ConfigurationHdrOffset to point to next TOC\r
+  ConfigurationHdrOffset += sizeof(TOC_DATA);\r
+\r
+  //Closing TOC item\r
+  memset(gConfigurationHeader + ConfigurationHdrOffset, 0xFF, CLOSING_TOC_ITEM_SIZE);\r
+  ConfigurationHdrOffset += CLOSING_TOC_ITEM_SIZE;\r
+  \r
+  // Close data file\r
+  fclose(DataFile);\r
+}\r
+\r
+static \r
+void\r
+ConstructImage (\r
+  void\r
+  )\r
+{\r
+  FILE         *InputFile;\r
+  FILE         *OutputFile;\r
+  unsigned int InputImageFileSize;\r
+  struct       stat FileStat;\r
+  char         Ch;\r
+  unsigned int i;\r
+\r
+  InputFile = fopen(gInputImageFile, "rb");\r
+  if (InputFile == NULL) {\r
+    fprintf(stderr, "Can't open input file.\n");\r
+    exit(0);\r
+  } \r
+\r
+  // Get the size of the input image.\r
+  fstat(fileno(InputFile), &FileStat);\r
+  InputImageFileSize = FileStat.st_size;\r
+  \r
+  OutputFile = fopen(gOutputImageFile, "wb");\r
+  if (OutputFile == NULL) {\r
+    fprintf(stderr, "Can't open output file %s.\n", gOutputImageFile);\r
+    exit(0);\r
+  }\r
+\r
+  // Write Configuration header \r
+  fwrite(gConfigurationHeader, 1, sizeof(gConfigurationHeader), OutputFile);\r
+\r
+  // Write image header (Input image size, execution address)\r
+  fwrite(&InputImageFileSize, 1, 4, OutputFile);\r
+  fwrite(&gImageExecutionAddress, 1, 4, OutputFile);\r
+\r
+  // Copy input image to the output file.\r
+  for (i = 0; i < InputImageFileSize; i++) {\r
+    fread(&Ch, 1, 1, InputFile);\r
+    fwrite(&Ch, 1, 1, OutputFile);\r
+  }\r
+\r
+  fclose(InputFile);\r
+  fclose(OutputFile);\r
+}\r
+\r
+\r
+int \r
+main (\r
+  int    argc, \r
+  char** argv\r
+  )\r
+{\r
+  char          Ch;\r
+  unsigned char *ptr;\r
+  int           i;\r
+  int           TwoArg;  \r
+\r
+  if (argc == 1) {\r
+    PrintUsage ();\r
+    exit(1);\r
+  }\r
+\r
+  for (i=1; i < argc; i++) {\r
+    if (argv[i][0] == '-') {\r
+      // TwoArg TRUE -E 0x123, FALSE -E0x1234\r
+      TwoArg = (argv[i][2] != ' ');\r
+      switch (argv[i][1]) {\r
+        case 'E': /* Image execution address */\r
+          gImageExecutionAddress = strtoul (TwoArg ? argv[i+1] : &argv[i][2], (char **)&ptr, 16);\r
+          break;\r
+        \r
+        case 'I': /* Input image file */\r
+          gInputImageFile = TwoArg ? argv[i+1] : &argv[i][2];\r
+          break;\r
+\r
+        case 'O': /* Output image file */\r
+          gOutputImageFile = TwoArg ? argv[i+1] : &argv[i][2];\r
+          break;\r
+        \r
+        case 'D': /* Data file */\r
+          gDataFile = TwoArg ? argv[i+1] : &argv[i][2];\r
+          break;\r
+\r
+        default:\r
+          abort ();\r
+      }\r
+    }\r
+  }\r
+\r
\r
+  //Prepare configuration header\r
+  PrepareConfigurationHeader ();\r
+\r
+  //Build image with configuration header + image header + image\r
+  ConstructImage ();\r
+\r
+  return 0;\r
+}\r