xref: /aosp_15_r20/external/rmi4utils/rmi4update/firmware_image.h (revision a248dafd7653b99fc45f9d29e5f139b04f2f28bc)
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