+++ /dev/null
-/** @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
- SPDX-License-Identifier: BSD-2-Clause-Patent\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