diff options
Diffstat (limited to 'rmi4update/firmware_image.cpp')
-rwxr-xr-x[-rw-r--r--] | rmi4update/firmware_image.cpp | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/rmi4update/firmware_image.cpp b/rmi4update/firmware_image.cpp index babce56..6cc18c0 100644..100755 --- a/rmi4update/firmware_image.cpp +++ b/rmi4update/firmware_image.cpp @@ -21,6 +21,7 @@ #include <stdint.h> #include <stdlib.h> +#include "rmidevice.h" #include "firmware_image.h" using namespace std; @@ -43,6 +44,66 @@ unsigned long FirmwareImage::Checksum(unsigned short * data, unsigned long len) return checksum; } +void FirmwareImage::ParseHierarchicalImg() +{ + struct container_descriptor *descriptor; + int numOfCntrs; + int ii; + unsigned int addr; + unsigned int offset; + unsigned int length; + unsigned char *content; + unsigned short container_id; + + m_cntrAddr = extract_long(&m_memBlock[RMI_IMG_V10_CNTR_ADDR_OFFSET]); + descriptor = (struct container_descriptor *)(m_memBlock + m_cntrAddr); + offset = extract_long(descriptor->content_address); + numOfCntrs = extract_long(descriptor->content_length) / 4; + + for (ii = 0; ii < numOfCntrs; ii++) { + addr = extract_long(m_memBlock + offset); + offset += 4; + descriptor = (struct container_descriptor *)(m_memBlock + addr); + container_id = descriptor->container_id[0] | + descriptor->container_id[1] << 8; + content = m_memBlock + extract_long(descriptor->content_address); + length = extract_long(descriptor->content_length); + switch (container_id) { + case BL_CONTAINER: + m_bootloaderVersion = *content; + break; + case UI_CONTAINER: + case CORE_CODE_CONTAINER: + m_firmwareData = content; + m_firmwareSize = length; + break; + case FLASH_CONFIG_CONTAINER: + m_flashConfigData = content; + m_flashConfigSize = length; + break; + case UI_CONFIG_CONTAINER: + case CORE_CONFIG_CONTAINER: + m_configData = content; + m_configSize = length; + break; + case PERMANENT_CONFIG_CONTAINER: + case GUEST_SERIALIZATION_CONTAINER: + m_lockdownData = content; + m_lockdownSize = length; + break; + case GENERAL_INFORMATION_CONTAINER: + m_io = true; + m_packageID = extract_long(content); + m_firmwareBuildID = extract_long(content + 4); + memcpy(m_productID, (content + 0x18), RMI_PRODUCT_ID_LENGTH); + m_productID[RMI_PRODUCT_ID_LENGTH] = 0; + break; + default: + break; + } + } +} + int FirmwareImage::Initialize(const char * filename) { if (!filename) @@ -120,6 +181,9 @@ int FirmwareImage::Initialize(const char * filename) m_lockdownSize = RMI_IMG_LOCKDOWN_V5_SIZE; m_lockdownData = &m_memBlock[RMI_IMG_LOCKDOWN_V5_OFFSET]; break; + case 16: + ParseHierarchicalImg(); + break; default: return UPDATE_FAIL_UNSUPPORTED_IMAGE_VERSION; } |