1 /* 2 * Copyright (C) 2012 - 2014 Andrew Duggan 3 * Copyright (C) 2012 - 2014 Synaptics Inc 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 #ifndef _FIRMWAREIMAGE_H_ 19 #define _FIRMWAREIMAGE_H_ 20 21 #include "rmidevice.h" 22 #include "updateutil.h" 23 24 #define RMI_IMG_CHECKSUM_OFFSET 0 25 #define RMI_IMG_IO_OFFSET 0x06 26 #define RMI_IMG_BOOTLOADER_VERSION_OFFSET 0x07 27 #define RMI_IMG_IMAGE_SIZE_OFFSET 0x08 28 #define RMI_IMG_CONFIG_SIZE_OFFSET 0x0C 29 #define RMI_IMG_PACKAGE_ID_OFFSET 0x1A 30 #define RMI_IMG_FW_BUILD_ID_OFFSET 0x50 31 32 #define RMI_IMG_PRODUCT_ID_OFFSET 0x10 33 #define RMI_IMG_PRODUCT_INFO_OFFSET 0x1E 34 35 #define RMI_IMG_FW_OFFSET 0x100 36 37 #define RMI_IMG_LOCKDOWN_V2_OFFSET 0xD0 38 #define RMI_IMG_LOCKDOWN_V2_SIZE 0x30 39 40 #define RMI_IMG_LOCKDOWN_V3_OFFSET 0xC0 41 #define RMI_IMG_LOCKDOWN_V3_SIZE 0x40 42 43 #define RMI_IMG_LOCKDOWN_V5_OFFSET 0xB0 44 #define RMI_IMG_LOCKDOWN_V5_SIZE 0x50 45 46 // Leon add for BL_V7 47 #define RMI_IMG_V10_CNTR_ADDR_OFFSET 0x0C 48 #define RMI_IMG_V10_SIGNATURE_VERSION_NUMBER 0x11 49 #define RMI_IMG_V10_SIGNATURE_LENGTH_OFFSET 0x8 50 #define RMI_IMG_V10_SIGNATURE_LENGTH_SIZE 4 51 52 struct container_descriptor { 53 unsigned char content_checksum[4]; 54 unsigned char container_id[2]; 55 unsigned char minor_version; 56 unsigned char major_version; 57 unsigned char signature_size[4]; 58 unsigned char container_option_flags[4]; 59 unsigned char content_options_length[4]; 60 unsigned char content_options_address[4]; 61 unsigned char content_length[4]; 62 unsigned char content_address[4]; 63 }; 64 65 enum container_id { 66 TOP_LEVEL_CONTAINER = 0, 67 UI_CONTAINER, 68 UI_CONFIG_CONTAINER, 69 BL_CONTAINER, 70 BL_IMAGE_CONTAINER, 71 BL_CONFIG_CONTAINER, 72 BL_LOCKDOWN_INFO_CONTAINER, 73 PERMANENT_CONFIG_CONTAINER, 74 GUEST_CODE_CONTAINER, 75 BL_PROTOCOL_DESCRIPTOR_CONTAINER, 76 UI_PROTOCOL_DESCRIPTOR_CONTAINER, 77 RMI_SELF_DISCOVERY_CONTAINER, 78 RMI_PAGE_CONTENT_CONTAINER, 79 GENERAL_INFORMATION_CONTAINER, 80 DEVICE_CONFIG_CONTAINER, 81 FLASH_CONFIG_CONTAINER, 82 GUEST_SERIALIZATION_CONTAINER, 83 GLOBAL_PARAMETERS_CONTAINER, 84 CORE_CODE_CONTAINER, 85 CORE_CONFIG_CONTAINER, 86 DISPLAY_CONFIG_CONTAINER, 87 EXTERNAL_TOUCH_AFE_CONFIG_CONTAINER, 88 UTILITY_CONTAINER, 89 UTILITY_PARAMETER_CONTAINER, 90 // Reserved : 24 ~ 26 91 // V10 above 92 FIXED_LOCATION_DATA_CONTAINER = 27, 93 }; 94 95 enum signature_BLv7 { 96 BLv7_CORE_CODE = 0, 97 BLv7_CORE_CONFIG, 98 BLv7_FLASH_CONFIG, 99 BLv7_FLD, 100 BLv7_MAX 101 }; 102 103 struct signature_info { 104 bool bExisted; 105 unsigned short size; 106 }; 107 // BL_V7 end 108 109 class FirmwareImage 110 { 111 public: FirmwareImage()112 FirmwareImage() : m_firmwareBuildID(0), m_packageID(0), m_firmwareData(NULL), m_configData(NULL), m_lockdownData(NULL), 113 m_memBlock(NULL), m_hasSignature(false), m_fldData(NULL), m_fldSize(0), m_globalparaData(NULL), m_globalparaSize(0), 114 m_firmwareVersion(0), m_hasFirmwareVersion(false) 115 {} 116 int Initialize(const char * filename); 117 int VerifyImageMatchesDevice(unsigned long deviceFirmwareSize, 118 unsigned long deviceConfigSize); GetFirmwareData()119 unsigned char * GetFirmwareData() { return m_firmwareData; } GetConfigData()120 unsigned char * GetConfigData() { return m_configData; } GetFlashConfigData()121 unsigned char * GetFlashConfigData() { return m_flashConfigData; } GetLockdownData()122 unsigned char * GetLockdownData() { return m_lockdownData; } GetFLDData()123 unsigned char * GetFLDData() { return m_fldData; } GetGlobalParametersData()124 unsigned char * GetGlobalParametersData() { return m_globalparaData; } GetFirmwareSize()125 unsigned long GetFirmwareSize() { return m_firmwareSize; } GetConfigSize()126 unsigned long GetConfigSize() { return m_configSize; } GetFlashConfigSize()127 unsigned long GetFlashConfigSize() { return m_flashConfigSize; } GetLockdownSize()128 unsigned long GetLockdownSize() { return m_lockdownSize; } GetFirmwareID()129 unsigned long GetFirmwareID() { return m_firmwareBuildID; } GetFLDSize()130 unsigned long GetFLDSize() { return m_fldSize; } GetGlobalParametersSize()131 unsigned long GetGlobalParametersSize() { return m_globalparaSize; } GetFirmwareVersion()132 unsigned short GetFirmwareVersion() { return m_firmwareVersion; } GetSignatureInfo()133 signature_info *GetSignatureInfo() { return m_signatureInfo; } 134 int VerifyImageProductID(char* deviceProductID); IsImageHasFirmwareVersion()135 bool IsImageHasFirmwareVersion() { return m_hasFirmwareVersion; } 136 HasIO()137 bool HasIO() { return m_io; } 138 ~FirmwareImage(); 139 140 private: 141 unsigned long Checksum(unsigned short * data, unsigned long len); 142 void PrintHeaderInfo(); 143 void ParseHierarchicalImg(); // BL_V7 144 145 private: 146 unsigned long m_checksum; 147 unsigned long m_firmwareSize; 148 unsigned long m_configSize; 149 unsigned long m_flashConfigSize; 150 unsigned long m_lockdownSize; 151 long m_imageSize; 152 unsigned long m_firmwareBuildID; 153 unsigned short m_packageID; 154 unsigned char m_bootloaderVersion; 155 unsigned char m_io; 156 char m_productID[RMI_PRODUCT_ID_LENGTH + 1]; 157 unsigned short m_productInfo; 158 159 unsigned char * m_firmwareData; 160 unsigned char * m_configData; 161 unsigned char * m_flashConfigData; 162 unsigned char * m_lockdownData; 163 unsigned char * m_memBlock; 164 unsigned long m_cntrAddr; // BL_V7 165 bool m_hasSignature; 166 unsigned char * m_fldData; 167 unsigned long m_fldSize; 168 unsigned char * m_globalparaData; 169 unsigned long m_globalparaSize; 170 unsigned short m_firmwareVersion; 171 bool m_hasFirmwareVersion; 172 173 signature_info m_signatureInfo[BLv7_MAX]; 174 }; 175 176 #endif // _FIRMWAREIMAGE_H_ 177