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 49 struct container_descriptor { 50 unsigned char content_checksum[4]; 51 unsigned char container_id[2]; 52 unsigned char minor_version; 53 unsigned char major_version; 54 unsigned char reserved_08; 55 unsigned char reserved_09; 56 unsigned char reserved_0a; 57 unsigned char reserved_0b; 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 }; 91 // BL_V7 end 92 93 class FirmwareImage 94 { 95 public: FirmwareImage()96 FirmwareImage() : m_firmwareBuildID(0), m_packageID(0), m_firmwareData(NULL), m_configData(NULL), m_lockdownData(NULL), 97 m_memBlock(NULL) 98 {} 99 int Initialize(const char * filename); 100 int VerifyImageMatchesDevice(unsigned long deviceFirmwareSize, 101 unsigned long deviceConfigSize); GetFirmwareData()102 unsigned char * GetFirmwareData() { return m_firmwareData; } GetConfigData()103 unsigned char * GetConfigData() { return m_configData; } GetFlashConfigData()104 unsigned char * GetFlashConfigData() { return m_flashConfigData; } GetLockdownData()105 unsigned char * GetLockdownData() { return m_lockdownData; } GetFirmwareSize()106 unsigned long GetFirmwareSize() { return m_firmwareSize; } GetConfigSize()107 unsigned long GetConfigSize() { return m_configSize; } GetFlashConfigSize()108 unsigned long GetFlashConfigSize() { return m_flashConfigSize; } GetLockdownSize()109 unsigned long GetLockdownSize() { return m_lockdownSize; } GetFirmwareID()110 unsigned long GetFirmwareID() { return m_firmwareBuildID; } HasIO()111 bool HasIO() { return m_io; } 112 ~FirmwareImage(); 113 114 private: 115 unsigned long Checksum(unsigned short * data, unsigned long len); 116 void PrintHeaderInfo(); 117 void ParseHierarchicalImg(); // BL_V7 118 119 private: 120 unsigned long m_checksum; 121 unsigned long m_firmwareSize; 122 unsigned long m_configSize; 123 unsigned long m_flashConfigSize; 124 unsigned long m_lockdownSize; 125 long m_imageSize; 126 unsigned long m_firmwareBuildID; 127 unsigned short m_packageID; 128 unsigned char m_bootloaderVersion; 129 unsigned char m_io; 130 char m_productID[RMI_PRODUCT_ID_LENGTH + 1]; 131 unsigned short m_productInfo; 132 133 unsigned char * m_firmwareData; 134 unsigned char * m_configData; 135 unsigned char * m_flashConfigData; 136 unsigned char * m_lockdownData; 137 unsigned char * m_memBlock; 138 unsigned long m_cntrAddr; // BL_V7 139 }; 140 141 #endif // _FIRMWAREIMAGE_H_ 142