| /* |
| * Copyright (C) 2014 Andrew Duggan |
| * Copyright (C) 2014 Synaptics Inc |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #ifndef _RMI4UPDATE_H_ |
| #define _RMI4UPDATE_H_ |
| |
| #include "rmidevice.h" |
| #include "firmware_image.h" |
| |
| #define RMI_BOOTLOADER_ID_SIZE 2 |
| |
| // leon add |
| enum v7_status { |
| SUCCESS = 0x00, |
| DEVICE_NOT_IN_BOOTLOADER_MODE, |
| INVALID_PARTITION, |
| INVALID_COMMAND, |
| INVALID_BLOCK_OFFSET, |
| INVALID_TRANSFER, |
| NOT_ERASED, |
| FLASH_PROGRAMMING_KEY_INCORRECT, |
| BAD_PARTITION_TABLE, |
| CHECKSUM_FAILED, |
| FLASH_HARDWARE_FAILURE = 0x1f, |
| }; |
| |
| enum v7_partition_id { |
| NONE_PARTITION = 0x00, |
| BOOTLOADER_PARTITION = 0x01, |
| DEVICE_CONFIG_PARTITION, |
| FLASH_CONFIG_PARTITION, |
| MANUFACTURING_BLOCK_PARTITION, |
| GUEST_SERIALIZATION_PARTITION, |
| GLOBAL_PARAMETERS_PARTITION, |
| CORE_CODE_PARTITION, |
| CORE_CONFIG_PARTITION, |
| GUEST_CODE_PARTITION, |
| DISPLAY_CONFIG_PARTITION, |
| EXTERNAL_TOUCH_AFE_CONFIG_PARTITION, |
| UTILITY_PARAMETER_PARTITION, |
| }; |
| |
| enum v7_flash_command { |
| CMD_V7_IDLE = 0x00, |
| CMD_V7_ENTER_BL, |
| CMD_V7_READ, |
| CMD_V7_WRITE, |
| CMD_V7_ERASE, |
| CMD_V7_ERASE_AP, |
| CMD_V7_SENSOR_ID, |
| }; |
| |
| enum bl_version { |
| BL_V5 = 5, |
| BL_V6 = 6, |
| BL_V7 = 7, |
| BL_V8 = 8, |
| }; |
| |
| struct f34_v7_query_0 { |
| union { |
| struct { |
| unsigned char subpacket_1_size:3; |
| unsigned char has_config_id:1; |
| unsigned char f34_query0_b4:1; |
| unsigned char has_thqa:1; |
| unsigned char f34_query0_b6__7:2; |
| } __attribute__((packed));; |
| unsigned char data[1]; |
| }; |
| }; |
| |
| struct f34_v7_query_1_7 { |
| union { |
| struct { |
| /* query 1 */ |
| unsigned char bl_minor_revision; |
| unsigned char bl_major_revision; |
| |
| /* query 2 */ |
| unsigned char bl_fw_id_7_0; |
| unsigned char bl_fw_id_15_8; |
| unsigned char bl_fw_id_23_16; |
| unsigned char bl_fw_id_31_24; |
| |
| /* query 3 */ |
| unsigned char minimum_write_size; |
| unsigned char block_size_7_0; |
| unsigned char block_size_15_8; |
| unsigned char flash_page_size_7_0; |
| unsigned char flash_page_size_15_8; |
| |
| /* query 4 */ |
| unsigned char adjustable_partition_area_size_7_0; |
| unsigned char adjustable_partition_area_size_15_8; |
| |
| /* query 5 */ |
| unsigned char flash_config_length_7_0; |
| unsigned char flash_config_length_15_8; |
| |
| /* query 6 */ |
| unsigned char payload_length_7_0; |
| unsigned char payload_length_15_8; |
| |
| /* query 7 */ |
| unsigned char f34_query7_b0:1; |
| unsigned char has_bootloader:1; |
| unsigned char has_device_config:1; |
| unsigned char has_flash_config:1; |
| unsigned char has_manufacturing_block:1; |
| unsigned char has_guest_serialization:1; |
| unsigned char has_global_parameters:1; |
| unsigned char has_core_code:1; |
| unsigned char has_core_config:1; |
| unsigned char has_guest_code:1; |
| unsigned char has_display_config:1; |
| unsigned char f34_query7_b11__15:5; |
| unsigned char f34_query7_b16__23; |
| unsigned char f34_query7_b24__31; |
| } __attribute__((packed));; |
| unsigned char data[21]; |
| }; |
| }; |
| |
| struct partition_tbl |
| { |
| union { |
| struct { |
| unsigned short partition_id; |
| unsigned short partition_len; |
| unsigned short partition_addr; |
| unsigned short partition_prop; |
| } __attribute__((packed));; |
| unsigned char data[8]; |
| }; |
| }; |
| // leon end |
| |
| class RMI4Update |
| { |
| public: |
| RMI4Update(RMIDevice & device, FirmwareImage & firmwareImage) : m_device(device), |
| m_firmwareImage(firmwareImage), m_writeBlockWithCmd(true) |
| { |
| m_IsErased = false; |
| } |
| int UpdateFirmware(bool force = false, bool performLockdown = false); |
| |
| private: |
| int DisableNonessentialInterupts(); |
| int FindUpdateFunctions(); |
| int ReadFlashConfig(); |
| int rmi4update_poll(); |
| int ReadF34QueriesV7(); |
| int ReadF34Queries(); |
| int ReadF34Controls(); |
| int WriteBootloaderID(); |
| int EnterFlashProgrammingV7(); |
| int EraseFirmwareV7(); |
| int WriteFirmwareV7(); |
| int WriteCoreConfigV7(); |
| int WriteFlashConfigV7(); |
| int EnterFlashProgramming(); |
| int WriteBlocks(unsigned char *block, unsigned short count, unsigned char cmd); |
| int WaitForIdle(int timeout_ms, bool readF34OnSucess = true); |
| int GetFirmwareSize() { return m_blockSize * m_fwBlockCount; } |
| int GetConfigSize() { return m_blockSize * m_configBlockCount; } |
| |
| private: |
| RMIDevice & m_device; |
| FirmwareImage & m_firmwareImage; |
| |
| RMIFunction m_f01; |
| RMIFunction m_f34; |
| |
| unsigned char m_deviceStatus; |
| unsigned char m_bootloaderID[RMI_BOOTLOADER_ID_SIZE]; |
| bool m_writeBlockWithCmd; |
| |
| /* F34 Controls */ |
| unsigned char m_f34Command; |
| unsigned char m_f34Status; |
| bool m_programEnabled; |
| |
| /* F34 Query */ |
| bool m_hasNewRegmap; |
| bool m_unlocked; |
| bool m_hasConfigID; |
| unsigned short m_blockSize; |
| unsigned short m_fwBlockCount; |
| unsigned short m_configBlockCount; |
| /* for BL_V7 */ |
| unsigned short m_flashConfigLength; |
| unsigned short m_payloadLength; |
| unsigned short m_guestBlockCount; |
| struct partition_tbl *m_partitionCore; |
| struct partition_tbl *m_partitionConfig; |
| struct partition_tbl *m_partitionGuest; |
| unsigned char m_flashStatus; |
| unsigned char m_flashCmd; |
| unsigned char m_inBLmode; |
| unsigned long m_buildID; |
| unsigned char *m_guestData; |
| /* BL_V7 end */ |
| |
| unsigned short m_f34StatusAddr; |
| enum bl_version m_blVersion; |
| |
| bool m_IsErased; |
| }; |
| |
| #endif // _RMI4UPDATE_H_ |