From bfb3cb813d1e539d432db04233bdc7cf82eefb1a Mon Sep 17 00:00:00 2001 From: David Chiu Date: Fri, 11 Jun 2021 16:41:54 +0800 Subject: Separate the touchscreen flow from touchpad flow about several wait attention. --- rmi4update/rmi4update.cpp | 75 +++++++++++++++++++++++++++-------------------- 1 file changed, 44 insertions(+), 31 deletions(-) diff --git a/rmi4update/rmi4update.cpp b/rmi4update/rmi4update.cpp index 19eadb5..ca05887 100755 --- a/rmi4update/rmi4update.cpp +++ b/rmi4update/rmi4update.cpp @@ -718,13 +718,16 @@ int RMI4Update::WriteFirmwareV7() free(data_temp); } while (left_bytes); - // Sleep 100 ms and wait for attention. - Sleep(100); - rc = WaitForIdle(RMI_F34_IDLE_WAIT_MS, false); - if (rc != UPDATE_SUCCESS) { - fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); - return UPDATE_FAIL_TIMEOUT_WAITING_FOR_ATTN; + if(m_device.GetDeviceType() == RMI_DEVICE_TYPE_TOUCHPAD) { + // Sleep 100 ms and wait for attention for touchpad only. + Sleep(100); + rc = WaitForIdle(RMI_F34_IDLE_WAIT_MS, false); + if (rc != UPDATE_SUCCESS) { + fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); + return UPDATE_FAIL_TIMEOUT_WAITING_FOR_ATTN; + } } + //Wait for completion do { @@ -829,11 +832,13 @@ int RMI4Update::WriteCoreConfigV7() free(data_temp); } while (left_bytes); - // Wait for attention. - rc = WaitForIdle(RMI_F34_IDLE_WAIT_MS, false); - if (rc != UPDATE_SUCCESS) { - fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); - return UPDATE_FAIL_TIMEOUT_WAITING_FOR_ATTN; + if(m_device.GetDeviceType() == RMI_DEVICE_TYPE_TOUCHPAD) { + // Wait for attention for touchpad only. + rc = WaitForIdle(RMI_F34_IDLE_WAIT_MS, false); + if (rc != UPDATE_SUCCESS) { + fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); + return UPDATE_FAIL_TIMEOUT_WAITING_FOR_ATTN; + } } //Wait for completion @@ -943,11 +948,13 @@ int RMI4Update::WriteFlashConfigV7() free(data_temp); } while (left_bytes); - // Wair for attention. - rc = WaitForIdle(RMI_F34_IDLE_WAIT_MS, false); - if (rc != UPDATE_SUCCESS) { - fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); - return UPDATE_FAIL_TIMEOUT_WAITING_FOR_ATTN; + if(m_device.GetDeviceType() == RMI_DEVICE_TYPE_TOUCHPAD) { + // Wair for attention for touchpad only. + rc = WaitForIdle(RMI_F34_IDLE_WAIT_MS, false); + if (rc != UPDATE_SUCCESS) { + fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); + return UPDATE_FAIL_TIMEOUT_WAITING_FOR_ATTN; + } } //Wait for completion @@ -1012,11 +1019,13 @@ int RMI4Update::EraseFirmwareV7() //Wait from ATTN if(m_bootloaderID[1] == 8){ - // Wait for attention for BL8 device. - rc = WaitForIdle(RMI_F34_ERASE_V8_WAIT_MS, false); - if (rc != UPDATE_SUCCESS) { - fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); - return UPDATE_FAIL_TIMEOUT_WAITING_FOR_ATTN; + if(m_device.GetDeviceType() == RMI_DEVICE_TYPE_TOUCHPAD) { + // Wait for attention for BL8 touchpad. + rc = WaitForIdle(RMI_F34_ERASE_V8_WAIT_MS, false); + if (rc != UPDATE_SUCCESS) { + fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); + return UPDATE_FAIL_TIMEOUT_WAITING_FOR_ATTN; + } } } do { @@ -1050,13 +1059,15 @@ int RMI4Update::EraseFirmwareV7() if (rc != sizeof(erase_cmd)) return UPDATE_FAIL_WRITE_F01_CONTROL_0; - //Wait from ATTN - Sleep(100); + if(m_device.GetDeviceType() == RMI_DEVICE_TYPE_TOUCHPAD) { + //Wait from ATTN for touchpad only. + Sleep(100); - rc = WaitForIdle(RMI_F34_ERASE_WAIT_MS, true); - if (rc != UPDATE_SUCCESS) { - fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); - return UPDATE_FAIL_TIMEOUT_WAITING_FOR_ATTN; + rc = WaitForIdle(RMI_F34_ERASE_WAIT_MS, true); + if (rc != UPDATE_SUCCESS) { + fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); + return UPDATE_FAIL_TIMEOUT_WAITING_FOR_ATTN; + } } @@ -1103,10 +1114,12 @@ int RMI4Update::EnterFlashProgrammingV7() if (rc != sizeof(EnterCmd)) return UPDATE_FAIL_WRITE_F01_CONTROL_0; - rc = WaitForIdle(RMI_F34_ENABLE_WAIT_MS, false); - if (rc != UPDATE_SUCCESS) { - fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); - return UPDATE_FAIL_TIMEOUT_WAITING_FOR_ATTN; + if(m_device.GetDeviceType() == RMI_DEVICE_TYPE_TOUCHPAD) { + rc = WaitForIdle(RMI_F34_ENABLE_WAIT_MS, false); + if (rc != UPDATE_SUCCESS) { + fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); + return UPDATE_FAIL_TIMEOUT_WAITING_FOR_ATTN; + } } //Wait from ATTN -- cgit v1.2.3 From 894fb799331cada9b23320ffb7325795e55ad066 Mon Sep 17 00:00:00 2001 From: Vincent Huang Date: Fri, 18 Jun 2021 15:06:54 +0800 Subject: Update version for v1.3.6 release --- rmi4update/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rmi4update/main.cpp b/rmi4update/main.cpp index a710764..8dcd6ec 100755 --- a/rmi4update/main.cpp +++ b/rmi4update/main.cpp @@ -33,7 +33,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 3 -#define VERSION_SUBMINOR 5 +#define VERSION_SUBMINOR 6 #define RMI4UPDATE_GETOPTS "hfd:t:pclv" -- cgit v1.2.3 From c0a94c67dc4d64cca7193ab0584d8496bc572d8f Mon Sep 17 00:00:00 2001 From: David Chiu Date: Thu, 9 Dec 2021 16:58:17 +0800 Subject: Add timeout 10 ms for select() and resend scheme in Read() to avoid indefinitely loop because of wrong report ID in return. --- rmi4update/main.cpp | 3 ++- rmidevice/hiddevice.cpp | 20 ++++++++++++++++++-- rmidevice/rmidevice.cpp | 3 +-- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/rmi4update/main.cpp b/rmi4update/main.cpp index 8dcd6ec..f10c532 100755 --- a/rmi4update/main.cpp +++ b/rmi4update/main.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include "hiddevice.h" #include "rmi4update.h" @@ -149,7 +150,7 @@ int main(int argc, char **argv) if (printFirmwareProps) { std::string props; - + if (!deviceName) { fprintf(stderr, "Specifiy which device to query\n"); return 1; diff --git a/rmidevice/hiddevice.cpp b/rmidevice/hiddevice.cpp index 709559d..a41e680 100755 --- a/rmidevice/hiddevice.cpp +++ b/rmidevice/hiddevice.cpp @@ -291,7 +291,12 @@ int HIDDevice::Read(unsigned short addr, unsigned char *buf, unsigned short len) size_t bytesToRequest; int reportId; int rc; + struct timeval tv; + int resendCount = 0; + tv.tv_sec = 10 / 1000; + tv.tv_usec = (10 % 1000) * 1000; + if (!m_deviceOpen) return -1; @@ -301,6 +306,11 @@ int HIDDevice::Read(unsigned short addr, unsigned char *buf, unsigned short len) bytesPerRequest = len; for (totalBytesRead = 0; totalBytesRead < len; totalBytesRead += bytesReadPerRequest) { +Resend: + if (resendCount == 3) { + fprintf(stderr, "resend count exceed, return as failure\n"); + return -1; + } count = 0; if ((len - totalBytesRead) < bytesPerRequest) bytesToRequest = len % bytesPerRequest; @@ -334,7 +344,8 @@ int HIDDevice::Read(unsigned short addr, unsigned char *buf, unsigned short len) bytesReadPerRequest = 0; while (bytesReadPerRequest < bytesToRequest) { - rc = GetReport(&reportId); + // Add timeout 10 ms for select() called in GetReport(). + rc = GetReport(&reportId, &tv); if (rc > 0 && reportId == RMI_READ_DATA_REPORT_ID) { if (static_cast(m_inputReportSize) < std::max(HID_RMI4_READ_INPUT_COUNT, @@ -350,6 +361,11 @@ int HIDDevice::Read(unsigned short addr, unsigned char *buf, unsigned short len) bytesInDataReport); bytesReadPerRequest += bytesInDataReport; m_dataBytesRead = 0; + resendCount = 0; + } else { + fprintf(stderr, "Some error with GetReport : rc(%d), reportID(0x%x)\n", rc, reportId); + resendCount += 1; + goto Resend; } } addr += bytesPerRequest; @@ -391,7 +407,7 @@ int HIDDevice::SetMode(int mode) { int rc; char buf[2]; - + if (!m_deviceOpen) return -1; diff --git a/rmidevice/rmidevice.cpp b/rmidevice/rmidevice.cpp index 15335f9..029e614 100644 --- a/rmidevice/rmidevice.cpp +++ b/rmidevice/rmidevice.cpp @@ -62,7 +62,6 @@ int RMIDevice::SetRMIPage(unsigned char page) if (m_page == page) return 0; - m_page = page; rc = Write(RMI_DEVICE_PAGE_SELECT_REGISTER, &page, 1); if (rc < 0 || rc < 1) { @@ -327,7 +326,7 @@ int RMIDevice::ScanPDT(int endFunc, int endPage) } m_numInterruptRegs = (interruptCount + 7) / 8; - + return 0; } -- cgit v1.2.3 From b08492c1b59b77dc0f7d88089b36838331e867dd Mon Sep 17 00:00:00 2001 From: Vincent Huang Date: Fri, 10 Dec 2021 11:23:24 +0800 Subject: Update version for v1.3.7 release --- rmi4update/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rmi4update/main.cpp b/rmi4update/main.cpp index f10c532..58992a4 100755 --- a/rmi4update/main.cpp +++ b/rmi4update/main.cpp @@ -34,7 +34,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 3 -#define VERSION_SUBMINOR 6 +#define VERSION_SUBMINOR 7 #define RMI4UPDATE_GETOPTS "hfd:t:pclv" -- cgit v1.2.3 From 386d65d4887fbc7a1b940041673e44a43baa8af6 Mon Sep 17 00:00:00 2001 From: David Chiu Date: Tue, 21 Dec 2021 14:09:02 +0800 Subject: Read attention before read flash status. --- rmi4update/rmi4update.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/rmi4update/rmi4update.cpp b/rmi4update/rmi4update.cpp index ca05887..e05684e 100755 --- a/rmi4update/rmi4update.cpp +++ b/rmi4update/rmi4update.cpp @@ -384,6 +384,17 @@ int RMI4Update::ReadFlashConfig() if (rc != sizeof(cmd_buf)) return UPDATE_FAIL_WRITE_FLASH_COMMAND; + if(m_device.GetDeviceType() == RMI_DEVICE_TYPE_TOUCHPAD) { + // Sleep 20 ms and wait for attention for touchpad only. + Sleep(20); + rc = WaitForIdle(20, false); + if (rc != UPDATE_SUCCESS) { + fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); + return UPDATE_FAIL_TIMEOUT_WAITING_FOR_ATTN; + } + fprintf(stdout, "Got attention\n"); + } + //Wait for completion do { Sleep(20); -- cgit v1.2.3 From f28f77e264e25a15d87a9deffd8d693be0cb9dd6 Mon Sep 17 00:00:00 2001 From: David Chiu Date: Wed, 22 Dec 2021 10:34:45 +0800 Subject: Define the waiting time period for read partition. --- rmi4update/rmi4update.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rmi4update/rmi4update.cpp b/rmi4update/rmi4update.cpp index e05684e..282fb90 100755 --- a/rmi4update/rmi4update.cpp +++ b/rmi4update/rmi4update.cpp @@ -61,6 +61,7 @@ #define RMI_F34_ERASE_WAIT_MS (5 * 1000) #define RMI_F34_ERASE_V8_WAIT_MS (10000) #define RMI_F34_IDLE_WAIT_MS 500 +#define RMI_F34_PARTITION_READ_WAIT_MS 20 /* Most recent device status event */ #define RMI_F01_STATUS_CODE(status) ((status) & 0x0f) @@ -387,7 +388,7 @@ int RMI4Update::ReadFlashConfig() if(m_device.GetDeviceType() == RMI_DEVICE_TYPE_TOUCHPAD) { // Sleep 20 ms and wait for attention for touchpad only. Sleep(20); - rc = WaitForIdle(20, false); + rc = WaitForIdle(RMI_F34_PARTITION_READ_WAIT_MS, false); if (rc != UPDATE_SUCCESS) { fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); return UPDATE_FAIL_TIMEOUT_WAITING_FOR_ATTN; -- cgit v1.2.3 From 37259214c592bd9e73eaa0cb2945b9f6173bd7ed Mon Sep 17 00:00:00 2001 From: Vincent Huang Date: Wed, 22 Dec 2021 15:15:02 +0800 Subject: Update version for v1.3.8 release --- rmi4update/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rmi4update/main.cpp b/rmi4update/main.cpp index 58992a4..89c3e4c 100755 --- a/rmi4update/main.cpp +++ b/rmi4update/main.cpp @@ -34,7 +34,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 3 -#define VERSION_SUBMINOR 7 +#define VERSION_SUBMINOR 8 #define RMI4UPDATE_GETOPTS "hfd:t:pclv" -- cgit v1.2.3 From 84a72ab59d271e790029b67312163c16c3c073dc Mon Sep 17 00:00:00 2001 From: David Chiu Date: Mon, 10 Jan 2022 15:43:09 +0800 Subject: Support toggle interrupts mask by setting feature report --- rmi4update/main.cpp | 6 ++++++ rmi4update/rmi4update.cpp | 15 ++++++++++++--- rmidevice/hiddevice.cpp | 28 ++++++++++++++++++++++++++++ rmidevice/hiddevice.h | 1 + rmidevice/rmidevice.h | 1 + 5 files changed, 48 insertions(+), 3 deletions(-) diff --git a/rmi4update/main.cpp b/rmi4update/main.cpp index 89c3e4c..761954e 100755 --- a/rmi4update/main.cpp +++ b/rmi4update/main.cpp @@ -67,9 +67,15 @@ int GetFirmwareProps(const char * deviceFile, std::string &props, bool configid) if (rc) return rc; + // Clear all interrupts before parsing to avoid unexpected interrupts. + rmidevice.ToggleInterruptMask(false); + rmidevice.ScanPDT(0x1); rmidevice.QueryBasicProperties(); + // Restore the interrupts + rmidevice.ToggleInterruptMask(true); + if (configid) { ss << std::hex << rmidevice.GetConfigID(); } else { diff --git a/rmi4update/rmi4update.cpp b/rmi4update/rmi4update.cpp index 282fb90..cc27e22 100755 --- a/rmi4update/rmi4update.cpp +++ b/rmi4update/rmi4update.cpp @@ -97,13 +97,22 @@ int RMI4Update::UpdateFirmware(bool force, bool performLockdown) long long int duration_us = 0; int rc; const unsigned char eraseAll = RMI_F34_ERASE_ALL; + + // Clear all interrupts before parsing to avoid unexpected interrupts. + m_device.ToggleInterruptMask(false); rc = FindUpdateFunctions(); - if (rc != UPDATE_SUCCESS) + if (rc != UPDATE_SUCCESS) { + m_device.ToggleInterruptMask(true); return rc; + } rc = m_device.QueryBasicProperties(); - if (rc < 0) - return UPDATE_FAIL_QUERY_BASIC_PROPERTIES; + if (rc < 0) { + m_device.ToggleInterruptMask(true); + return UPDATE_FAIL_QUERY_BASIC_PROPERTIES; + } + // Restore the interrupts + m_device.ToggleInterruptMask(true); if (!force && m_firmwareImage.HasIO()) { if (m_firmwareImage.GetFirmwareID() <= m_device.GetFirmwareID()) { diff --git a/rmidevice/hiddevice.cpp b/rmidevice/hiddevice.cpp index a41e680..9adc952 100755 --- a/rmidevice/hiddevice.cpp +++ b/rmidevice/hiddevice.cpp @@ -422,6 +422,34 @@ int HIDDevice::SetMode(int mode) return 0; } +int HIDDevice::ToggleInterruptMask(bool enable) +{ + int rc; + char buf[2]; + + if (GetDeviceType() != RMI_DEVICE_TYPE_TOUCHPAD) { + fprintf(stdout, "Not TP, skip toggle interrupts mask\n"); + return 0; + } + + if (!m_deviceOpen) + return -1; + + buf[0] = 0xE; + if (enable) { + buf[1] = 0; + } else { + buf[1] = 8; + } + rc = ioctl(m_fd, HIDIOCSFEATURE(2), buf); + if (rc < 0) { + perror("HIDIOCSFEATURE"); + return rc; + } + Sleep(10); + return 0; +} + void HIDDevice::Close() { RMIDevice::Close(); diff --git a/rmidevice/hiddevice.h b/rmidevice/hiddevice.h index b947f62..5a01edb 100755 --- a/rmidevice/hiddevice.h +++ b/rmidevice/hiddevice.h @@ -49,6 +49,7 @@ public: virtual int Write(unsigned short addr, const unsigned char *buf, unsigned short len); virtual int SetMode(int mode); + virtual int ToggleInterruptMask(bool enable); virtual int WaitForAttention(struct timeval * timeout = NULL, unsigned int source_mask = RMI_INTERUPT_SOURCES_ALL_MASK); virtual int GetAttentionReport(struct timeval * timeout, unsigned int source_mask, diff --git a/rmidevice/rmidevice.h b/rmidevice/rmidevice.h index 9bfe849..a0249bc 100644 --- a/rmidevice/rmidevice.h +++ b/rmidevice/rmidevice.h @@ -46,6 +46,7 @@ public: virtual int Write(unsigned short addr, const unsigned char *data, unsigned short len) = 0; virtual int SetMode(int mode) { return -1; /* Unsupported */ } + virtual int ToggleInterruptMask(bool enable) = 0; virtual int WaitForAttention(struct timeval * timeout = NULL, unsigned int source_mask = RMI_INTERUPT_SOURCES_ALL_MASK) = 0; virtual int GetAttentionReport(struct timeval * timeout, unsigned int source_mask, -- cgit v1.2.3 From 19496e9ad1e9fcd7302e7fa26943fd103d69de3f Mon Sep 17 00:00:00 2001 From: David Chiu Date: Tue, 25 Jan 2022 15:54:54 +0800 Subject: Separate the code flow for TouchPad from TouchScreen. --- rmidevice/hiddevice.cpp | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/rmidevice/hiddevice.cpp b/rmidevice/hiddevice.cpp index 9adc952..8074f1c 100755 --- a/rmidevice/hiddevice.cpp +++ b/rmidevice/hiddevice.cpp @@ -307,9 +307,11 @@ int HIDDevice::Read(unsigned short addr, unsigned char *buf, unsigned short len) for (totalBytesRead = 0; totalBytesRead < len; totalBytesRead += bytesReadPerRequest) { Resend: - if (resendCount == 3) { - fprintf(stderr, "resend count exceed, return as failure\n"); - return -1; + if (GetDeviceType() == RMI_DEVICE_TYPE_TOUCHPAD) { + if (resendCount == 3) { + fprintf(stderr, "resend count exceed, return as failure\n"); + return -1; + } } count = 0; if ((len - totalBytesRead) < bytesPerRequest) @@ -344,8 +346,13 @@ Resend: bytesReadPerRequest = 0; while (bytesReadPerRequest < bytesToRequest) { - // Add timeout 10 ms for select() called in GetReport(). - rc = GetReport(&reportId, &tv); + if (GetDeviceType() == RMI_DEVICE_TYPE_TOUCHPAD) { + // Add timeout 10 ms for select() called in GetReport(). + rc = GetReport(&reportId, &tv); + } else { + // Touch Screen + rc = GetReport(&reportId); + } if (rc > 0 && reportId == RMI_READ_DATA_REPORT_ID) { if (static_cast(m_inputReportSize) < std::max(HID_RMI4_READ_INPUT_COUNT, @@ -361,8 +368,11 @@ Resend: bytesInDataReport); bytesReadPerRequest += bytesInDataReport; m_dataBytesRead = 0; - resendCount = 0; - } else { + if (GetDeviceType() == RMI_DEVICE_TYPE_TOUCHPAD) { + // Resend sheme is supported on TP only. + resendCount = 0; + } + } else if (GetDeviceType() == RMI_DEVICE_TYPE_TOUCHPAD) { fprintf(stderr, "Some error with GetReport : rc(%d), reportID(0x%x)\n", rc, reportId); resendCount += 1; goto Resend; -- cgit v1.2.3 From 8452c46fe27aae8150e32a52df811c545bdec82b Mon Sep 17 00:00:00 2001 From: David Chiu Date: Thu, 27 Jan 2022 16:41:58 +0800 Subject: Disable this feature until we can make sure device has this feature already. --- rmidevice/hiddevice.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/rmidevice/hiddevice.cpp b/rmidevice/hiddevice.cpp index 8074f1c..f55dc3a 100755 --- a/rmidevice/hiddevice.cpp +++ b/rmidevice/hiddevice.cpp @@ -437,6 +437,10 @@ int HIDDevice::ToggleInterruptMask(bool enable) int rc; char buf[2]; + // Not use this feature temporarily. Need more implementation to check whether it + // exists this feature in device. + return 0; + if (GetDeviceType() != RMI_DEVICE_TYPE_TOUCHPAD) { fprintf(stdout, "Not TP, skip toggle interrupts mask\n"); return 0; -- cgit v1.2.3 From 6dde81384619446d20c5eb872ff7cf921eac3f3a Mon Sep 17 00:00:00 2001 From: David Chiu Date: Fri, 18 Feb 2022 11:24:51 +0800 Subject: Read attention after enabling flashing for touchpad --- rmi4update/rmi4update.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/rmi4update/rmi4update.cpp b/rmi4update/rmi4update.cpp index cc27e22..83fa235 100755 --- a/rmi4update/rmi4update.cpp +++ b/rmi4update/rmi4update.cpp @@ -1208,14 +1208,20 @@ int RMI4Update::EnterFlashProgramming() if (rc != 1) return UPDATE_FAIL_ENABLE_FLASH_PROGRAMMING; - Sleep(RMI_F34_ENABLE_WAIT_MS); + if(m_device.GetDeviceType() != RMI_DEVICE_TYPE_TOUCHPAD) { fprintf(stdout, "not TouchPad, rebind driver here\n"); + Sleep(RMI_F34_ENABLE_WAIT_MS); m_device.RebindDriver(); + rc = WaitForIdle(0); + if (rc != UPDATE_SUCCESS) + return UPDATE_FAIL_NOT_IN_IDLE_STATE; + } else { + // For TouchPad + rc = WaitForIdle(RMI_F34_ENABLE_WAIT_MS); + if (rc != UPDATE_SUCCESS) + return UPDATE_FAIL_NOT_IN_IDLE_STATE; } - rc = WaitForIdle(0); - if (rc != UPDATE_SUCCESS) - return UPDATE_FAIL_NOT_IN_IDLE_STATE; if (!m_programEnabled) return UPDATE_FAIL_PROGRAMMING_NOT_ENABLED; -- cgit v1.2.3 From 209baef35cd959faf19f64157a1be18dd6c5af76 Mon Sep 17 00:00:00 2001 From: Vincent Huang Date: Mon, 21 Feb 2022 15:26:24 +0800 Subject: Update version for V1.3.9 release --- rmi4update/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rmi4update/main.cpp b/rmi4update/main.cpp index 761954e..38b1f77 100755 --- a/rmi4update/main.cpp +++ b/rmi4update/main.cpp @@ -34,7 +34,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 3 -#define VERSION_SUBMINOR 8 +#define VERSION_SUBMINOR 9 #define RMI4UPDATE_GETOPTS "hfd:t:pclv" -- cgit v1.2.3 From 1247098b0d36234b72c92faaca6588de9e790a08 Mon Sep 17 00:00:00 2001 From: David Chiu Date: Tue, 22 Feb 2022 16:25:07 +0800 Subject: Support checking product ID --- rmi4update/firmware_image.cpp | 11 +++++++++++ rmi4update/firmware_image.h | 2 ++ rmi4update/rmi4update.cpp | 3 +++ rmi4update/updateutil.cpp | 1 + rmi4update/updateutil.h | 1 + rmidevice/rmidevice.h | 1 + 6 files changed, 19 insertions(+) diff --git a/rmi4update/firmware_image.cpp b/rmi4update/firmware_image.cpp index 303eb88..bfbbc54 100755 --- a/rmi4update/firmware_image.cpp +++ b/rmi4update/firmware_image.cpp @@ -220,6 +220,17 @@ int FirmwareImage::VerifyImageMatchesDevice(unsigned long deviceFirmwareSize, return UPDATE_SUCCESS; } +int FirmwareImage::VerifyImageProductID(char* deviceProductID) +{ + if (strcmp(m_productID, deviceProductID) == 0) { + fprintf(stdout, "image matched\n"); + return UPDATE_SUCCESS; + } else { + fprintf (stdout, "image not match, terminated\n"); + return UPDATE_FAIL_VERIFY_IMAGE_PRODUCTID_NOT_MATCH; + } +} + FirmwareImage::~FirmwareImage() { delete [] m_memBlock; diff --git a/rmi4update/firmware_image.h b/rmi4update/firmware_image.h index 3ce1c59..b9dab84 100755 --- a/rmi4update/firmware_image.h +++ b/rmi4update/firmware_image.h @@ -108,6 +108,8 @@ public: unsigned long GetFlashConfigSize() { return m_flashConfigSize; } unsigned long GetLockdownSize() { return m_lockdownSize; } unsigned long GetFirmwareID() { return m_firmwareBuildID; } + int VerifyImageProductID(char* deviceProductID); + bool HasIO() { return m_io; } ~FirmwareImage(); diff --git a/rmi4update/rmi4update.cpp b/rmi4update/rmi4update.cpp index 83fa235..0dcd6ec 100755 --- a/rmi4update/rmi4update.cpp +++ b/rmi4update/rmi4update.cpp @@ -125,6 +125,9 @@ int RMI4Update::UpdateFirmware(bool force, bool performLockdown) fprintf(stdout, "Device Properties:\n"); m_device.PrintProperties(); + rc = m_firmwareImage.VerifyImageProductID(m_device.GetProductID()); + if (rc != UPDATE_SUCCESS) + return rc; rc = DisableNonessentialInterupts(); if (rc != UPDATE_SUCCESS) diff --git a/rmi4update/updateutil.cpp b/rmi4update/updateutil.cpp index 1d654cd..52245d3 100644 --- a/rmi4update/updateutil.cpp +++ b/rmi4update/updateutil.cpp @@ -27,6 +27,7 @@ const char *update_error_str[] = { "checksum does not match image", // UPDATE_FAIL_VERIFY_CHECKSUM "image firmware size does not match device", // UPDATE_FAIL_VERIFY_FIRMWARE_SIZE "image config size does not match device", // UPDATE_FAIL_VERIFY_CONFIG_SIZE + "image product ID does not match device", // UPDATE_FAIL_VERIFY_IMAGE_PRODUCTID_NOT_MATCH "image version is unsupported", // UPDATE_FAIL_UNSUPPORTED_IMAGE_VERSION "failed to find F01 on device", // UPDATE_FAIL_NO_FUNCTION_01 "failed to find F34 on device", // UPDATE_FAIL_NO_FUNCTION_34 diff --git a/rmi4update/updateutil.h b/rmi4update/updateutil.h index 59f1a08..c65c53a 100644 --- a/rmi4update/updateutil.h +++ b/rmi4update/updateutil.h @@ -26,6 +26,7 @@ enum update_error { UPDATE_FAIL_VERIFY_CHECKSUM, UPDATE_FAIL_VERIFY_FIRMWARE_SIZE, UPDATE_FAIL_VERIFY_CONFIG_SIZE, + UPDATE_FAIL_VERIFY_IMAGE_PRODUCTID_NOT_MATCH, UPDATE_FAIL_UNSUPPORTED_IMAGE_VERSION, UPDATE_FAIL_NO_FUNCTION_01, UPDATE_FAIL_NO_FUNCTION_34, diff --git a/rmidevice/rmidevice.h b/rmidevice/rmidevice.h index a0249bc..e40c653 100644 --- a/rmidevice/rmidevice.h +++ b/rmidevice/rmidevice.h @@ -62,6 +62,7 @@ public: int GetFirmwareVersionMajor() { return m_firmwareVersionMajor; } int GetFirmwareVersionMinor() { return m_firmwareVersionMinor; } virtual int QueryBasicProperties(); + char *GetProductID() { return (char *)m_productID; } int SetRMIPage(unsigned char page); -- cgit v1.2.3 From 8809cf56b01cf3c613bd631986945aba80a6aca1 Mon Sep 17 00:00:00 2001 From: David Chiu Date: Tue, 22 Feb 2022 16:31:48 +0800 Subject: Separate the product ID checking from touchscreen's flow --- rmi4update/rmi4update.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/rmi4update/rmi4update.cpp b/rmi4update/rmi4update.cpp index 0dcd6ec..fb34953 100755 --- a/rmi4update/rmi4update.cpp +++ b/rmi4update/rmi4update.cpp @@ -125,9 +125,14 @@ int RMI4Update::UpdateFirmware(bool force, bool performLockdown) fprintf(stdout, "Device Properties:\n"); m_device.PrintProperties(); - rc = m_firmwareImage.VerifyImageProductID(m_device.GetProductID()); - if (rc != UPDATE_SUCCESS) - return rc; + if (m_device.GetDeviceType() == RMI_DEVICE_TYPE_TOUCHPAD) { + rc = m_firmwareImage.VerifyImageProductID(m_device.GetProductID()); + if (rc != UPDATE_SUCCESS) + return rc; + } else { + fprintf(stdout, "not touchpad, skip checking product ID\n"); + } + rc = DisableNonessentialInterupts(); if (rc != UPDATE_SUCCESS) -- cgit v1.2.3 From 115762374d337c515587a02a387a845a4d6bdb6b Mon Sep 17 00:00:00 2001 From: David Chiu Date: Wed, 23 Feb 2022 15:33:10 +0800 Subject: Use the feature of toggling interrupts if it exists this feature report. --- rmidevice/hiddevice.cpp | 22 ++++++++++++++++------ rmidevice/hiddevice.h | 5 ++++- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/rmidevice/hiddevice.cpp b/rmidevice/hiddevice.cpp index f55dc3a..d5e5176 100755 --- a/rmidevice/hiddevice.cpp +++ b/rmidevice/hiddevice.cpp @@ -40,6 +40,8 @@ #define RMI_READ_DATA_REPORT_ID 0xb // Input Report #define RMI_ATTN_REPORT_ID 0xc // Input Report #define RMI_SET_RMI_MODE_REPORT_ID 0xf // Feature Report +#define RMI_SET_LID_MODE_REPORT_ID 0xe // Feature Report + enum hid_report_type { HID_REPORT_TYPE_UNKNOWN = 0x0, @@ -218,6 +220,10 @@ void HIDDevice::ParseReportDescriptor() continue; } + if (m_rptDesc.value[i] == RMI_SET_LID_MODE_REPORT_ID) { + hasVendorDefineLIDMode = true; + } + if (m_rptDesc.value[i] == HID_REPORT_TYPE_INPUT) hidReportType = HID_REPORT_TYPE_INPUT; @@ -421,7 +427,7 @@ int HIDDevice::SetMode(int mode) if (!m_deviceOpen) return -1; - buf[0] = 0xF; + buf[0] = RMI_SET_RMI_MODE_REPORT_ID; buf[1] = mode; rc = ioctl(m_fd, HIDIOCSFEATURE(2), buf); if (rc < 0) { @@ -437,19 +443,23 @@ int HIDDevice::ToggleInterruptMask(bool enable) int rc; char buf[2]; - // Not use this feature temporarily. Need more implementation to check whether it - // exists this feature in device. - return 0; - if (GetDeviceType() != RMI_DEVICE_TYPE_TOUCHPAD) { fprintf(stdout, "Not TP, skip toggle interrupts mask\n"); return 0; } + + // We can have information to see whether it exists this feature report currentlt. + // However, it might have no action even we set this feature with specific value. + // Need FW team's help to query more information about the existence of functions. + if (!hasVendorDefineLIDMode) { + fprintf(stdout, "no LID mode feature, return\n"); + return 0; + } if (!m_deviceOpen) return -1; - buf[0] = 0xE; + buf[0] = RMI_SET_LID_MODE_REPORT_ID; if (enable) { buf[1] = 0; } else { diff --git a/rmidevice/hiddevice.h b/rmidevice/hiddevice.h index 5a01edb..7ee5e1b 100755 --- a/rmidevice/hiddevice.h +++ b/rmidevice/hiddevice.h @@ -41,7 +41,8 @@ public: m_mode(HID_RMI4_MODE_ATTN_REPORTS), m_initialMode(HID_RMI4_MODE_MOUSE), m_transportDeviceName(""), - m_driverPath("") + m_driverPath(""), + hasVendorDefineLIDMode(false) {} virtual int Open(const char * filename); virtual int Read(unsigned short addr, unsigned char *buf, @@ -88,6 +89,8 @@ private: std::string m_transportDeviceName; std::string m_driverPath; + bool hasVendorDefineLIDMode; + int GetReport(int *reportId, struct timeval * timeout = NULL); void PrintReport(const unsigned char *report); void ParseReportDescriptor(); -- cgit v1.2.3 From e9115fa74a72e9a267ec6c08b8df8cd05d4f9085 Mon Sep 17 00:00:00 2001 From: David Chiu Date: Thu, 24 Feb 2022 16:34:23 +0800 Subject: Parsing driver name instead of assigning one --- rmidevice/hiddevice.cpp | 30 ++++++++++++++++++++---------- rmidevice/hiddevice.h | 1 + 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/rmidevice/hiddevice.cpp b/rmidevice/hiddevice.cpp index d5e5176..00067e0 100755 --- a/rmidevice/hiddevice.cpp +++ b/rmidevice/hiddevice.cpp @@ -861,15 +861,8 @@ bool HIDDevice::FindTransportDevice(uint32_t bus, std::string & hidDeviceName, if (bus == BUS_I2C) { devicePrefix += "i2c/"; - // From new patch released on 2020/11, i2c_hid would be renamed as i2c_hid_acpi, - // and also need backward compatible. - std::string driverPathTemp = devicePrefix + "drivers/i2c_hid/"; - DIR *driverPathtest = opendir(driverPathTemp.c_str()); - if(!driverPathtest) { - driverPath = devicePrefix + "drivers/i2c_hid_acpi/"; - } else { - driverPath = devicePrefix + "drivers/i2c_hid/"; - } + // The i2c driver module installed on system is vary (i2c_hid, i2c_hid_acpi, i2c_hid_of), + // so we will assign driver path until we get device name later. } else { devicePrefix += "usb/"; driverPath = devicePrefix + "drivers/usbhid/"; @@ -908,8 +901,25 @@ bool HIDDevice::FindTransportDevice(uint32_t bus, std::string & hidDeviceName, } closedir(devDir); - if (deviceFound) + if (deviceFound) { + if (bus == BUS_I2C) { + std::fstream ueventfile; + std::string ueventfilepath = fullLinkPath + "/uevent"; + std::string uevent; + std::string modulename; + ueventfile.open(ueventfilepath.c_str(), std::ios::in); + if(ueventfile.is_open()) { + getline(ueventfile, uevent); + modulename = uevent.substr(uevent.find("=") + 1, std::string::npos); + driverPath = devicePrefix + "drivers/"; + driverPath += modulename; + driverPath += "/"; + } + ueventfile.close(); + } break; + } + } closedir(devicesDir); diff --git a/rmidevice/hiddevice.h b/rmidevice/hiddevice.h index 7ee5e1b..93b1ed8 100755 --- a/rmidevice/hiddevice.h +++ b/rmidevice/hiddevice.h @@ -20,6 +20,7 @@ #include #include +#include #include #include "rmidevice.h" -- cgit v1.2.3 From 2b62809429a73bad716e8d86fc483bc94e6f2a76 Mon Sep 17 00:00:00 2001 From: David Chiu Date: Wed, 9 Mar 2022 12:02:33 +0800 Subject: Support writing signature --- rmi4update/firmware_image.cpp | 26 ++++++++++ rmi4update/firmware_image.h | 26 ++++++++-- rmi4update/rmi4update.cpp | 117 ++++++++++++++++++++++++++++++++++++++++++ rmi4update/rmi4update.h | 2 + 4 files changed, 166 insertions(+), 5 deletions(-) diff --git a/rmi4update/firmware_image.cpp b/rmi4update/firmware_image.cpp index bfbbc54..d6c0f16 100755 --- a/rmi4update/firmware_image.cpp +++ b/rmi4update/firmware_image.cpp @@ -54,6 +54,15 @@ void FirmwareImage::ParseHierarchicalImg() unsigned int length; unsigned char *content; unsigned short container_id; + unsigned int sigature_size; + + if (m_bootloaderVersion == RMI_IMG_V10_SIGNATURE_VERSION_NUMBER) { + fprintf (stdout, "has signature\n"); + for (ii = 0; ii < BLv7_MAX; ii++) { + m_signatureInfo[ii].bExisted = false; + m_signatureInfo[ii].size = 0; + } + } m_cntrAddr = extract_long(&m_memBlock[RMI_IMG_V10_CNTR_ADDR_OFFSET]); descriptor = (struct container_descriptor *)(m_memBlock + m_cntrAddr); @@ -68,21 +77,37 @@ void FirmwareImage::ParseHierarchicalImg() descriptor->container_id[1] << 8; content = m_memBlock + extract_long(descriptor->content_address); length = extract_long(descriptor->content_length); + sigature_size = extract_long(descriptor->signature_size); switch (container_id) { case BL_CONTAINER: m_bootloaderVersion = *content; break; case UI_CONTAINER: case CORE_CODE_CONTAINER: + if (sigature_size != 0) { + fprintf(stdout, "CORE CODE signature size : 0x%x\n", sigature_size); + m_signatureInfo[BLv7_CORE_CODE].bExisted = true; + m_signatureInfo[BLv7_CORE_CODE].size = sigature_size; + } m_firmwareData = content; m_firmwareSize = length; break; case FLASH_CONFIG_CONTAINER: + if (sigature_size != 0) { + fprintf(stdout, "FLASH CONFIG signature size : 0x%x\n", sigature_size); + m_signatureInfo[BLv7_FLASH_CONFIG].bExisted = true; + m_signatureInfo[BLv7_FLASH_CONFIG].size = sigature_size; + } m_flashConfigData = content; m_flashConfigSize = length; break; case UI_CONFIG_CONTAINER: case CORE_CONFIG_CONTAINER: + if (sigature_size != 0) { + fprintf(stdout, "CORE CONFIG signature size : 0x%x\n", sigature_size); + m_signatureInfo[BLv7_CORE_CONFIG].bExisted = true; + m_signatureInfo[BLv7_CORE_CONFIG].size = sigature_size; + } m_configData = content; m_configSize = length; break; @@ -176,6 +201,7 @@ int FirmwareImage::Initialize(const char * filename) m_lockdownData = &m_memBlock[RMI_IMG_LOCKDOWN_V5_OFFSET]; break; case 16: + case RMI_IMG_V10_SIGNATURE_VERSION_NUMBER: ParseHierarchicalImg(); break; default: diff --git a/rmi4update/firmware_image.h b/rmi4update/firmware_image.h index b9dab84..c2ce512 100755 --- a/rmi4update/firmware_image.h +++ b/rmi4update/firmware_image.h @@ -45,16 +45,16 @@ // Leon add for BL_V7 #define RMI_IMG_V10_CNTR_ADDR_OFFSET 0x0C +#define RMI_IMG_V10_SIGNATURE_VERSION_NUMBER 0x11 +#define RMI_IMG_V10_SIGNATURE_LENGTH_OFFSET 0x8 +#define RMI_IMG_V10_SIGNATURE_LENGTH_SIZE 4 struct container_descriptor { unsigned char content_checksum[4]; unsigned char container_id[2]; unsigned char minor_version; unsigned char major_version; - unsigned char reserved_08; - unsigned char reserved_09; - unsigned char reserved_0a; - unsigned char reserved_0b; + unsigned char signature_size[4]; unsigned char container_option_flags[4]; unsigned char content_options_length[4]; unsigned char content_options_address[4]; @@ -88,13 +88,25 @@ enum container_id { UTILITY_CONTAINER, UTILITY_PARAMETER_CONTAINER, }; + +enum signature_BLv7 { + BLv7_CORE_CODE = 0, + BLv7_CORE_CONFIG, + BLv7_FLASH_CONFIG, + BLv7_MAX +}; + +struct signature_info { + bool bExisted; + unsigned short size; +}; // BL_V7 end class FirmwareImage { public: FirmwareImage() : m_firmwareBuildID(0), m_packageID(0), m_firmwareData(NULL), m_configData(NULL), m_lockdownData(NULL), - m_memBlock(NULL) + m_memBlock(NULL), m_hasSignature(false) {} int Initialize(const char * filename); int VerifyImageMatchesDevice(unsigned long deviceFirmwareSize, @@ -108,6 +120,7 @@ public: unsigned long GetFlashConfigSize() { return m_flashConfigSize; } unsigned long GetLockdownSize() { return m_lockdownSize; } unsigned long GetFirmwareID() { return m_firmwareBuildID; } + signature_info *GetSignatureInfo() { return m_signatureInfo; } int VerifyImageProductID(char* deviceProductID); bool HasIO() { return m_io; } @@ -138,6 +151,9 @@ private: unsigned char * m_lockdownData; unsigned char * m_memBlock; unsigned long m_cntrAddr; // BL_V7 + bool m_hasSignature; + + signature_info m_signatureInfo[BLv7_MAX]; }; #endif // _FIRMWAREIMAGE_H_ diff --git a/rmi4update/rmi4update.cpp b/rmi4update/rmi4update.cpp index fb34953..1995222 100755 --- a/rmi4update/rmi4update.cpp +++ b/rmi4update/rmi4update.cpp @@ -775,6 +775,16 @@ int RMI4Update::WriteFirmwareV7() } } + + if(m_device.GetDeviceType() == RMI_DEVICE_TYPE_TOUCHPAD) { + // Write signature. + rc = WriteSignatureV7(BLv7_CORE_CODE, m_firmwareImage.GetFirmwareData(), offset); + if (rc != UPDATE_SUCCESS) { + fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); + return rc; + } + } + return UPDATE_SUCCESS; } @@ -886,6 +896,16 @@ int RMI4Update::WriteCoreConfigV7() } } + + if(m_device.GetDeviceType() == RMI_DEVICE_TYPE_TOUCHPAD) { + // Write signature. + rc = WriteSignatureV7(BLv7_CORE_CONFIG, m_firmwareImage.GetConfigData(), offset); + if (rc != UPDATE_SUCCESS) { + fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); + return rc; + } + } + return UPDATE_SUCCESS; } @@ -1002,6 +1022,16 @@ int RMI4Update::WriteFlashConfigV7() } } + + if(m_device.GetDeviceType() == RMI_DEVICE_TYPE_TOUCHPAD) { + // Write signature. + rc = WriteSignatureV7(BLv7_FLASH_CONFIG, m_firmwareImage.GetFlashConfigData(), offset); + if (rc != UPDATE_SUCCESS) { + fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); + return rc; + } + } + return UPDATE_SUCCESS; } @@ -1324,6 +1354,93 @@ int RMI4Update::WriteBlocks(unsigned char *block, unsigned short count, unsigned return UPDATE_SUCCESS; } +int RMI4Update::WriteSignatureV7(enum signature_BLv7 signature_partition, unsigned char* data, int offset) +{ + fprintf(stdout, "Write Signature...\n"); + int rc; + unsigned char off[2] = {0, 0}; + unsigned char cmd_buf[1]; + unsigned short dataAddr = m_f34.GetDataBase(); + int transfer_leng = 0; + signature_info signature = m_firmwareImage.GetSignatureInfo()[signature_partition]; + unsigned char trans_leng_buf[2]; + unsigned short left_bytes; + unsigned short write_size; + unsigned short max_write_size; + unsigned char *data_temp; + int retry = 0; + rc = m_device.Write(dataAddr + 2, off, sizeof(off)); + if (rc != sizeof(off)) + return UPDATE_FAIL_WRITE_INITIAL_ZEROS; + + // Set Transfer Length + transfer_leng = signature.size / m_blockSize; + trans_leng_buf[0] = (unsigned char)(transfer_leng & 0xFF); + trans_leng_buf[1] = (unsigned char)((transfer_leng & 0xFF00) >> 8); + + rc = m_device.Write(dataAddr + 3, trans_leng_buf, sizeof(trans_leng_buf)); + if (rc != sizeof(trans_leng_buf)) + return UPDATE_FAIL_WRITE_FLASH_COMMAND; + + // Set Command to Signature + cmd_buf[0] = (unsigned char)CMD_V7_SIGNATURE; + rc = m_device.Write(dataAddr + 4, cmd_buf, sizeof(cmd_buf)); + if (rc != sizeof(cmd_buf)) + return UPDATE_FAIL_WRITE_FLASH_COMMAND; + + max_write_size = 16; + if (max_write_size >= transfer_leng * m_blockSize) + max_write_size = transfer_leng * m_blockSize; + else if (max_write_size > m_blockSize) + max_write_size -= max_write_size % m_blockSize; + else + max_write_size = m_blockSize; + + left_bytes = transfer_leng * m_blockSize; + + do { + if (left_bytes / max_write_size) + write_size = max_write_size; + else + write_size = left_bytes; + + data_temp = (unsigned char *) malloc(sizeof(unsigned char) * write_size); + memcpy(data_temp, data + offset, sizeof(char) * write_size); + rc = m_device.Write(dataAddr + 5, data_temp, sizeof(char) * write_size); + if (rc != ((ssize_t)sizeof(char) * write_size)) { + fprintf(stdout, "err write_size = %d; rc = %d\n", write_size, rc); + return UPDATE_FAIL_WRITE_BLOCK; + } + + offset += write_size; + left_bytes -= write_size; + free(data_temp); + } while (left_bytes); + + // Wair for attention for touchpad only. + rc = WaitForIdle(RMI_F34_IDLE_WAIT_MS, false); + if (rc != UPDATE_SUCCESS) { + fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); + return UPDATE_FAIL_TIMEOUT_WAITING_FOR_ATTN; + } + + //Wait for completion + do { + Sleep(20); + rmi4update_poll(); + if (m_flashStatus == SUCCESS){ + break; + } + retry++; + } while(retry < 20); + + if (m_flashStatus != SUCCESS) { + fprintf(stdout, "err flash_status = %d\n", m_flashStatus); + return UPDATE_FAIL_WRITE_F01_CONTROL_0; + } + return UPDATE_SUCCESS; +} + /* * This is a limited implementation of WaitForIdle which assumes WaitForAttention is supported * this will be true for HID, but other protocols will need to revert polling. Polling diff --git a/rmi4update/rmi4update.h b/rmi4update/rmi4update.h index b9de4ec..ee77228 100755 --- a/rmi4update/rmi4update.h +++ b/rmi4update/rmi4update.h @@ -62,6 +62,7 @@ enum v7_flash_command { CMD_V7_ERASE, CMD_V7_ERASE_AP, CMD_V7_SENSOR_ID, + CMD_V7_SIGNATURE, }; enum bl_version { @@ -179,6 +180,7 @@ private: int WaitForIdle(int timeout_ms, bool readF34OnSucess = true); int GetFirmwareSize() { return m_blockSize * m_fwBlockCount; } int GetConfigSize() { return m_blockSize * m_configBlockCount; } + int WriteSignatureV7(enum signature_BLv7 signature_partition, unsigned char* data, int offset); private: RMIDevice & m_device; -- cgit v1.2.3 From d438ada7599dc28848196ca42df144fb371db711 Mon Sep 17 00:00:00 2001 From: David Chiu Date: Wed, 9 Mar 2022 12:21:38 +0800 Subject: Fix warnings --- f54test/f54test.cpp | 2 +- rmidevice/hiddevice.cpp | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/f54test/f54test.cpp b/f54test/f54test.cpp index 4b4f6b1..c6b351e 100644 --- a/f54test/f54test.cpp +++ b/f54test/f54test.cpp @@ -695,7 +695,7 @@ int F54Test::ReadF54Queries() sizeof(m_f54Query_61.data)); if (retval < 0) return retval; - offset += 1; + offset += 1; } /* query 62 63 */ diff --git a/rmidevice/hiddevice.cpp b/rmidevice/hiddevice.cpp index 00067e0..0720304 100755 --- a/rmidevice/hiddevice.cpp +++ b/rmidevice/hiddevice.cpp @@ -723,11 +723,9 @@ bool HIDDevice::CheckABSEvent() int fd=-1; unsigned int type; int abs[6] = {0}; - int k; struct dirent **namelist; - int i, ndev, devnum, match; - char *filename; - int max_device = 0; + int i, ndev; + char input_event_name[PATH_MAX]; unsigned long bit[EV_MAX][NBITS(KEY_MAX)]; -- cgit v1.2.3 From fff8689fbccaa22d4c826d41cb6e5b7dee3cefa8 Mon Sep 17 00:00:00 2001 From: David Chiu Date: Fri, 11 Mar 2022 14:11:24 +0800 Subject: Support writing FLD and GlobalParameters for bootlodare v10, and updating flow for bootloader v10 as well. --- rmi4update/firmware_image.cpp | 13 ++ rmi4update/firmware_image.h | 14 +- rmi4update/rmi4update.cpp | 525 +++++++++++++++++++++++++++++++++++++++--- rmi4update/rmi4update.h | 23 +- rmidevice/hiddevice.cpp | 14 ++ 5 files changed, 560 insertions(+), 29 deletions(-) diff --git a/rmi4update/firmware_image.cpp b/rmi4update/firmware_image.cpp index d6c0f16..e4813c5 100755 --- a/rmi4update/firmware_image.cpp +++ b/rmi4update/firmware_image.cpp @@ -123,6 +123,19 @@ void FirmwareImage::ParseHierarchicalImg() memcpy(m_productID, (content + 0x18), RMI_PRODUCT_ID_LENGTH); m_productID[RMI_PRODUCT_ID_LENGTH] = 0; break; + case FIXED_LOCATION_DATA_CONTAINER: + if (sigature_size != 0) { + fprintf(stdout, "FLD signature size : 0x%x\n", sigature_size); + m_signatureInfo[BLv7_FLD].bExisted = true; + m_signatureInfo[BLv7_FLD].size = sigature_size; + } + m_fldData = content; + m_fldSize = length; + break; + case GLOBAL_PARAMETERS_CONTAINER: + m_globalparaData = content; + m_globalparaSize = length; + break; default: break; } diff --git a/rmi4update/firmware_image.h b/rmi4update/firmware_image.h index c2ce512..e4279d5 100755 --- a/rmi4update/firmware_image.h +++ b/rmi4update/firmware_image.h @@ -87,12 +87,16 @@ enum container_id { EXTERNAL_TOUCH_AFE_CONFIG_CONTAINER, UTILITY_CONTAINER, UTILITY_PARAMETER_CONTAINER, + // Reserved : 24 ~ 26 + // V10 above + FIXED_LOCATION_DATA_CONTAINER = 27, }; enum signature_BLv7 { BLv7_CORE_CODE = 0, BLv7_CORE_CONFIG, BLv7_FLASH_CONFIG, + BLv7_FLD, BLv7_MAX }; @@ -106,7 +110,7 @@ class FirmwareImage { public: FirmwareImage() : m_firmwareBuildID(0), m_packageID(0), m_firmwareData(NULL), m_configData(NULL), m_lockdownData(NULL), - m_memBlock(NULL), m_hasSignature(false) + m_memBlock(NULL), m_hasSignature(false), m_fldData(NULL), m_fldSize(0), m_globalparaData(NULL), m_globalparaSize(0) {} int Initialize(const char * filename); int VerifyImageMatchesDevice(unsigned long deviceFirmwareSize, @@ -115,11 +119,15 @@ public: unsigned char * GetConfigData() { return m_configData; } unsigned char * GetFlashConfigData() { return m_flashConfigData; } unsigned char * GetLockdownData() { return m_lockdownData; } + unsigned char * GetFLDData() { return m_fldData; } + unsigned char * GetGlobalParametersData() { return m_globalparaData; } unsigned long GetFirmwareSize() { return m_firmwareSize; } unsigned long GetConfigSize() { return m_configSize; } unsigned long GetFlashConfigSize() { return m_flashConfigSize; } unsigned long GetLockdownSize() { return m_lockdownSize; } unsigned long GetFirmwareID() { return m_firmwareBuildID; } + unsigned long GetFLDSize() { return m_fldSize; } + unsigned long GetGlobalParametersSize() { return m_globalparaSize; } signature_info *GetSignatureInfo() { return m_signatureInfo; } int VerifyImageProductID(char* deviceProductID); @@ -152,6 +160,10 @@ private: unsigned char * m_memBlock; unsigned long m_cntrAddr; // BL_V7 bool m_hasSignature; + unsigned char * m_fldData; + unsigned long m_fldSize; + unsigned char * m_globalparaData; + unsigned long m_globalparaSize; signature_info m_signatureInfo[BLv7_MAX]; }; diff --git a/rmi4update/rmi4update.cpp b/rmi4update/rmi4update.cpp index 1995222..75e1712 100755 --- a/rmi4update/rmi4update.cpp +++ b/rmi4update/rmi4update.cpp @@ -139,12 +139,16 @@ int RMI4Update::UpdateFirmware(bool force, bool performLockdown) return rc; rc = ReadF34Queries(); - if (rc != UPDATE_SUCCESS) - return rc; - rc = m_firmwareImage.VerifyImageMatchesDevice(GetFirmwareSize(), GetConfigSize()); if (rc != UPDATE_SUCCESS) return rc; + if (m_bootloaderID[1] < 10) { + // Checking size alignment for the device prior to BL v10. + rc = m_firmwareImage.VerifyImageMatchesDevice(GetFirmwareSize(), GetConfigSize()); + if (rc != UPDATE_SUCCESS) + return rc; + } + if (m_f34.GetFunctionVersion() == 0x02) { fprintf(stdout, "Enable Flash V7+...\n"); rc = EnterFlashProgrammingV7(); @@ -154,46 +158,117 @@ int RMI4Update::UpdateFirmware(bool force, bool performLockdown) } fprintf(stdout, "Enable Flash done V7+...\n"); - if (!m_IsErased){ - fprintf(stdout, "Erasing FW V7+...\n"); - rc = EraseFirmwareV7(); + if (m_bootloaderID[1] >= 10) { + fprintf(stdout, "Writing FLD V10...\n"); + rc = WriteFLDV7(); if (rc != UPDATE_SUCCESS) { fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); goto reset; } - fprintf(stdout, "Erasing FW done V7+...\n"); - } - if(m_bootloaderID[1] == 8){ + fprintf(stdout, "Writing FLD done V10...\n"); + + fprintf(stdout, "Erasing Flash Config V10...\n"); + rc = EraseFlashConfigV10(); + if (rc != UPDATE_SUCCESS) { + fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); + goto reset; + } + fprintf(stdout, "Erasing Flash Config done V10...\n"); + if (m_firmwareImage.GetFlashConfigData()) { - fprintf(stdout, "Writing flash configuration V8...\n"); + fprintf(stdout, "Writing flash configuration V10...\n"); rc = WriteFlashConfigV7(); if (rc != UPDATE_SUCCESS) { fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); goto reset; } - fprintf(stdout, "Writing flash config done V8...\n"); + fprintf(stdout, "Writing flash config done V10...\n"); } - } - if (m_firmwareImage.GetFirmwareData()) { - fprintf(stdout, "Writing firmware V7+...\n"); - rc = WriteFirmwareV7(); + + fprintf(stdout, "Erasing Core Code V10...\n"); + rc = EraseCoreCodeV10(); if (rc != UPDATE_SUCCESS) { fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); goto reset; } - fprintf(stdout, "Writing firmware done V7+...\n"); - } - if (m_firmwareImage.GetConfigData()) { - fprintf(stdout, "Writing core configuration V7+...\n"); - rc = WriteCoreConfigV7(); - if (rc != UPDATE_SUCCESS) { - fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); + fprintf(stdout, "Erasing Core Code done V10...\n"); + + if (m_firmwareImage.GetFirmwareData()) { + fprintf(stdout, "Writing Core Code V10...\n"); + rc = WriteFirmwareV7(); + if (rc != UPDATE_SUCCESS) { + fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); + goto reset; + } + fprintf(stdout, "Writing Core Code done V10...\n"); + } + + if (m_firmwareImage.GetConfigData()) { + fprintf(stdout, "Writing Core Config V10...\n"); + rc = WriteCoreConfigV7(); + if (rc != UPDATE_SUCCESS) { + fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); + goto reset; + } + fprintf(stdout, "Writing Core Config done V10...\n"); + goto reset; + } + + if (m_firmwareImage.GetGlobalParametersSize() && m_hasGlobalParameters) { + fprintf(stdout, "Writing Global Parameters V10...\n"); + rc = WriteGlobalParametersV7(); + if (rc != UPDATE_SUCCESS) { + fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); + goto reset; + } + fprintf(stdout, "Writing Global Parameters done V10...\n"); + goto reset; + } + + + } else { + if (!m_IsErased){ + fprintf(stdout, "Erasing FW V7+...\n"); + rc = EraseFirmwareV7(); + if (rc != UPDATE_SUCCESS) { + fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); + goto reset; + } + fprintf(stdout, "Erasing FW done V7+...\n"); + } + if(m_bootloaderID[1] == 8){ + if (m_firmwareImage.GetFlashConfigData()) { + fprintf(stdout, "Writing flash configuration V8...\n"); + rc = WriteFlashConfigV7(); + if (rc != UPDATE_SUCCESS) { + fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); + goto reset; + } + fprintf(stdout, "Writing flash config done V8...\n"); + } + } + if (m_firmwareImage.GetFirmwareData()) { + fprintf(stdout, "Writing firmware V7+...\n"); + rc = WriteFirmwareV7(); + if (rc != UPDATE_SUCCESS) { + fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); + goto reset; + } + fprintf(stdout, "Writing firmware done V7+...\n"); + } + if (m_firmwareImage.GetConfigData()) { + fprintf(stdout, "Writing core configuration V7+...\n"); + rc = WriteCoreConfigV7(); + if (rc != UPDATE_SUCCESS) { + fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); + goto reset; + } + fprintf(stdout, "Writing core config done V7+...\n"); goto reset; } - fprintf(stdout, "Writing core config done V7+...\n"); - goto reset; } + } else { rc = EnterFlashProgramming(); if (rc != UPDATE_SUCCESS) { @@ -524,6 +599,17 @@ int RMI4Update::ReadF34QueriesV7() idStr[1] = m_bootloaderID[1]; idStr[2] = 0; + m_hasCoreCode = query_1_7.has_core_code; + m_hasCoreConfig = query_1_7.has_core_config; + m_hasFlashConfig = query_1_7.has_flash_config; + m_hasFLD = query_1_7.has_fld; + m_hasGlobalParameters = query_1_7.has_global_parameters; + + fprintf(stdout, "F34 has CoreCode: %d\n", m_hasCoreCode); + fprintf(stdout, "F34 has CoreConfig: %d\n", m_hasCoreConfig); + fprintf(stdout, "F34 has FlashConfig: %d\n", m_hasFlashConfig); + fprintf(stdout, "F34 has FLD: %d\n", m_hasFLD); + fprintf(stdout, "F34 bootloader id: %s (%#04x %#04x)\n", idStr, m_bootloaderID[0], m_bootloaderID[1]); fprintf(stdout, "F34 has config id: %d\n", m_hasConfigID); @@ -533,7 +619,12 @@ int RMI4Update::ReadF34QueriesV7() fprintf(stdout, "F34 payload length:%d\n", m_payloadLength); fprintf(stdout, "F34 build id: %lu\n", m_buildID); - return ReadFlashConfig(); + if ((m_device.GetDeviceType() == RMI_DEVICE_TYPE_TOUCHPAD) && (m_bootloaderID[1] == 10)) { + // FW size would be different from the one in image file in bootloader v10, + // we use size parsing in image file instead. + return UPDATE_SUCCESS; + } else + return ReadFlashConfig(); } int RMI4Update::ReadF34Queries() @@ -682,10 +773,19 @@ int RMI4Update::WriteFirmwareV7() unsigned short max_write_size; unsigned short dataAddr = m_f34.GetDataBase(); + if (m_bootloaderID[1] == 10) { + m_fwBlockCount = m_firmwareImage.GetFirmwareSize() / m_blockSize; + } + /* calculate the count */ partition_id = CORE_CODE_PARTITION; - remain_block = (m_fwBlockCount % m_payloadLength); - transaction_count = (m_fwBlockCount / m_payloadLength); + if (m_bootloaderID[1] == 10) { + // define block count + } else { + remain_block = (m_fwBlockCount % m_payloadLength); + transaction_count = (m_fwBlockCount / m_payloadLength); + } + if (remain_block > 0) transaction_count++; @@ -805,11 +905,16 @@ int RMI4Update::WriteCoreConfigV7() int i; int retry = 0; unsigned char *data_temp; + if (m_bootloaderID[1] == 10) { + m_configBlockCount = m_firmwareImage.GetConfigSize() / m_blockSize; + } /* calculate the count */ partition_id = CORE_CONFIG_PARTITION; + remain_block = (m_configBlockCount % m_payloadLength); transaction_count = (m_configBlockCount / m_payloadLength); + if (remain_block > 0) transaction_count++; @@ -1035,6 +1140,372 @@ int RMI4Update::WriteFlashConfigV7() return UPDATE_SUCCESS; } +int RMI4Update::WriteFLDV7() +{ + int transaction_count, remain_block; + int transfer_leng = 0; + int offset = 0; + unsigned char trans_leng_buf[2]; + unsigned char cmd_buf[1]; + unsigned char off[2] = {0, 0}; + unsigned char partition_id; + int i; + int retry = 0; + unsigned char *data_temp; + int rc; + unsigned short left_bytes; + unsigned short write_size; + unsigned short max_write_size; + unsigned short dataAddr = m_f34.GetDataBase(); + unsigned short fldBlockCount = m_firmwareImage.GetFLDSize() / m_blockSize; + + if (m_bootloaderID[1] < 10) { + // Not support writing FLD before bootloader v10 + return UPDATE_SUCCESS; + } + + /* calculate the count */ + partition_id = FIXED_LOCATION_DATA_PARTITION; + + remain_block = (fldBlockCount % m_payloadLength); + transaction_count = (fldBlockCount / m_payloadLength); + + if (remain_block > 0) + transaction_count++; + + /* set partition id for bootloader 7 */ + rc = m_device.Write(dataAddr + 1, &partition_id, sizeof(partition_id)); + if (rc != sizeof(partition_id)) + return UPDATE_FAIL_WRITE_FLASH_COMMAND; + + rc = m_device.Write(dataAddr + 2, off, sizeof(off)); + if (rc != sizeof(off)) + return UPDATE_FAIL_WRITE_INITIAL_ZEROS; + + for (i = 0; i < transaction_count; i++) + { + if ((i == (transaction_count -1)) && (remain_block > 0)) + transfer_leng = remain_block; + else + transfer_leng = m_payloadLength; + + // Set Transfer Length + trans_leng_buf[0] = (unsigned char)(transfer_leng & 0xFF); + trans_leng_buf[1] = (unsigned char)((transfer_leng & 0xFF00) >> 8); + + rc = m_device.Write(dataAddr + 3, trans_leng_buf, sizeof(trans_leng_buf)); + if (rc != sizeof(trans_leng_buf)) + return UPDATE_FAIL_WRITE_FLASH_COMMAND; + + // Set Command to Write + cmd_buf[0] = (unsigned char)CMD_V7_WRITE; + rc = m_device.Write(dataAddr + 4, cmd_buf, sizeof(cmd_buf)); + if (rc != sizeof(cmd_buf)) + return UPDATE_FAIL_WRITE_FLASH_COMMAND; + + max_write_size = 16; + if (max_write_size >= transfer_leng * m_blockSize) + max_write_size = transfer_leng * m_blockSize; + else if (max_write_size > m_blockSize) + max_write_size -= max_write_size % m_blockSize; + else + max_write_size = m_blockSize; + + left_bytes = transfer_leng * m_blockSize; + do { + if (left_bytes / max_write_size) + write_size = max_write_size; + else + write_size = left_bytes; + + data_temp = (unsigned char *) malloc(sizeof(unsigned char) * write_size); + memcpy(data_temp, m_firmwareImage.GetFLDData() + offset, sizeof(char) * write_size); + rc = m_device.Write(dataAddr + 5, data_temp, sizeof(char) * write_size); + if (rc != ((ssize_t)sizeof(char) * write_size)) { + fprintf(stdout, "err write_size = %d; rc = %d\n", write_size, rc); + return UPDATE_FAIL_READ_F34_QUERIES; + } + + offset += write_size; + left_bytes -= write_size; + free(data_temp); + } while (left_bytes); + + if(m_device.GetDeviceType() == RMI_DEVICE_TYPE_TOUCHPAD) { + // Sleep 100 ms and wait for attention for touchpad only. + Sleep(100); + rc = WaitForIdle(RMI_F34_IDLE_WAIT_MS, false); + if (rc != UPDATE_SUCCESS) { + fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); + return UPDATE_FAIL_TIMEOUT_WAITING_FOR_ATTN; + } + } + + + //Wait for completion + do { + Sleep(20); + rmi4update_poll(); + if (m_flashStatus == SUCCESS){ + break; + + } + retry++; + } while(retry < 20); + + if (m_flashStatus != SUCCESS) { + fprintf(stdout, "err flash_status = %d\n", m_flashStatus); + return UPDATE_FAIL_WRITE_F01_CONTROL_0; + } + + } + + if(m_device.GetDeviceType() == RMI_DEVICE_TYPE_TOUCHPAD) { + // Write signature. + rc = WriteSignatureV7(BLv7_FLD, m_firmwareImage.GetFLDData(), offset); + if (rc != UPDATE_SUCCESS) { + fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); + return rc; + } + } + + return UPDATE_SUCCESS; +} + +int RMI4Update::WriteGlobalParametersV7() +{ + int transaction_count, remain_block; + int transfer_leng = 0; + int offset = 0; + unsigned char trans_leng_buf[2]; + unsigned char cmd_buf[1]; + unsigned char off[2] = {0, 0}; + unsigned char partition_id; + int i; + int retry = 0; + unsigned char *data_temp; + int rc; + unsigned short left_bytes; + unsigned short write_size; + unsigned short max_write_size; + unsigned short dataAddr = m_f34.GetDataBase(); + unsigned short glpBlockCount = m_firmwareImage.GetGlobalParametersSize() / m_blockSize; + + /* calculate the count */ + partition_id = GLOBAL_PARAMETERS_PARTITION; + + remain_block = (glpBlockCount % m_payloadLength); + transaction_count = (glpBlockCount / m_payloadLength); + + if (remain_block > 0) + transaction_count++; + + /* set partition id for bootloader 7 */ + rc = m_device.Write(dataAddr + 1, &partition_id, sizeof(partition_id)); + if (rc != sizeof(partition_id)) + return UPDATE_FAIL_WRITE_FLASH_COMMAND; + + rc = m_device.Write(dataAddr + 2, off, sizeof(off)); + if (rc != sizeof(off)) + return UPDATE_FAIL_WRITE_INITIAL_ZEROS; + + for (i = 0; i < transaction_count; i++) + { + if ((i == (transaction_count -1)) && (remain_block > 0)) + transfer_leng = remain_block; + else + transfer_leng = m_payloadLength; + + // Set Transfer Length + trans_leng_buf[0] = (unsigned char)(transfer_leng & 0xFF); + trans_leng_buf[1] = (unsigned char)((transfer_leng & 0xFF00) >> 8); + + rc = m_device.Write(dataAddr + 3, trans_leng_buf, sizeof(trans_leng_buf)); + if (rc != sizeof(trans_leng_buf)) + return UPDATE_FAIL_WRITE_FLASH_COMMAND; + + // Set Command to Write + cmd_buf[0] = (unsigned char)CMD_V7_WRITE; + rc = m_device.Write(dataAddr + 4, cmd_buf, sizeof(cmd_buf)); + if (rc != sizeof(cmd_buf)) + return UPDATE_FAIL_WRITE_FLASH_COMMAND; + + max_write_size = 16; + if (max_write_size >= transfer_leng * m_blockSize) + max_write_size = transfer_leng * m_blockSize; + else if (max_write_size > m_blockSize) + max_write_size -= max_write_size % m_blockSize; + else + max_write_size = m_blockSize; + + left_bytes = transfer_leng * m_blockSize; + do { + if (left_bytes / max_write_size) + write_size = max_write_size; + else + write_size = left_bytes; + + data_temp = (unsigned char *) malloc(sizeof(unsigned char) * write_size); + memcpy(data_temp, m_firmwareImage.GetFLDData() + offset, sizeof(char) * write_size); + rc = m_device.Write(dataAddr + 5, data_temp, sizeof(char) * write_size); + if (rc != ((ssize_t)sizeof(char) * write_size)) { + fprintf(stdout, "err write_size = %d; rc = %d\n", write_size, rc); + return UPDATE_FAIL_READ_F34_QUERIES; + } + + offset += write_size; + left_bytes -= write_size; + free(data_temp); + } while (left_bytes); + + if(m_device.GetDeviceType() == RMI_DEVICE_TYPE_TOUCHPAD) { + // Sleep 100 ms and wait for attention for touchpad only. + Sleep(100); + rc = WaitForIdle(RMI_F34_IDLE_WAIT_MS, false); + if (rc != UPDATE_SUCCESS) { + fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); + return UPDATE_FAIL_TIMEOUT_WAITING_FOR_ATTN; + } + } + + + //Wait for completion + do { + Sleep(20); + rmi4update_poll(); + if (m_flashStatus == SUCCESS){ + break; + + } + retry++; + } while(retry < 20); + + if (m_flashStatus != SUCCESS) { + fprintf(stdout, "err flash_status = %d\n", m_flashStatus); + return UPDATE_FAIL_WRITE_F01_CONTROL_0; + } + + } + + return UPDATE_SUCCESS; +} + +int RMI4Update::EraseFlashConfigV10() +{ + unsigned char erase_cmd[8] = {0, 0, 0, 0, 0, 0, 0, 0}; + int retry = 0; + int rc; + + /* set partition id for bootloader 10 */ + erase_cmd[0] = FLASH_CONFIG_PARTITION; + /* write bootloader id */ + erase_cmd[6] = m_bootloaderID[0]; + erase_cmd[7] = m_bootloaderID[1]; + erase_cmd[5] = (unsigned char)CMD_V7_ERASE; + + fprintf(stdout, "Erase command : "); + for(int i = 0 ;i<8;i++){ + fprintf(stdout, "%d ", erase_cmd[i]); + } + fprintf(stdout, "\n"); + + rmi4update_poll(); + if (!m_inBLmode) + return UPDATE_FAIL_DEVICE_NOT_IN_BOOTLOADER; + + // For BL8 device, we need hold 1 seconds after querying + // F34 status to avoid not get attention by following giving + // erase command. + Sleep(1000); + + rc = m_device.Write(m_f34.GetDataBase() + 1, erase_cmd, sizeof(erase_cmd)); + if (rc != sizeof(erase_cmd)) + return UPDATE_FAIL_WRITE_F01_CONTROL_0; + + Sleep(100); + + //Wait from ATTN + rc = WaitForIdle(RMI_F34_ERASE_V8_WAIT_MS, false); + if (rc != UPDATE_SUCCESS) { + fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); + return UPDATE_FAIL_TIMEOUT_WAITING_FOR_ATTN; + } + + do { + Sleep(20); + rmi4update_poll(); + if (m_flashStatus == SUCCESS){ + break; + } + retry++; + } while(retry < 20); + + if (m_flashStatus != SUCCESS) { + fprintf(stdout, "err flash_status = %d\n", m_flashStatus); + return UPDATE_FAIL_WRITE_F01_CONTROL_0; + } + + return UPDATE_SUCCESS; +} + +int RMI4Update::EraseCoreCodeV10() +{ + unsigned char erase_cmd[8] = {0, 0, 0, 0, 0, 0, 0, 0}; + int retry = 0; + int rc; + + /* set partition id for bootloader 10 */ + erase_cmd[0] = CORE_CODE_PARTITION; + /* write bootloader id */ + erase_cmd[6] = m_bootloaderID[0]; + erase_cmd[7] = m_bootloaderID[1]; + erase_cmd[5] = (unsigned char)CMD_V7_ERASE_AP; + + fprintf(stdout, "Erase command : "); + for(int i = 0 ;i<8;i++){ + fprintf(stdout, "%d ", erase_cmd[i]); + } + fprintf(stdout, "\n"); + + rmi4update_poll(); + if (!m_inBLmode) + return UPDATE_FAIL_DEVICE_NOT_IN_BOOTLOADER; + + // For BL8 device, we need hold 1 seconds after querying + // F34 status to avoid not get attention by following giving + // erase command. + Sleep(1000); + + rc = m_device.Write(m_f34.GetDataBase() + 1, erase_cmd, sizeof(erase_cmd)); + if (rc != sizeof(erase_cmd)) + return UPDATE_FAIL_WRITE_F01_CONTROL_0; + + Sleep(100); + + //Wait from ATTN + rc = WaitForIdle(RMI_F34_ERASE_V8_WAIT_MS, false); + if (rc != UPDATE_SUCCESS) { + fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); + return UPDATE_FAIL_TIMEOUT_WAITING_FOR_ATTN; + } + + do { + Sleep(20); + rmi4update_poll(); + if (m_flashStatus == SUCCESS){ + break; + } + retry++; + } while(retry < 20); + + if (m_flashStatus != SUCCESS) { + fprintf(stdout, "err flash_status = %d\n", m_flashStatus); + return UPDATE_FAIL_WRITE_F01_CONTROL_0; + } + + return UPDATE_SUCCESS; +} + int RMI4Update::EraseFirmwareV7() { unsigned char erase_cmd[8] = {0, 0, 0, 0, 0, 0, 0, 0}; diff --git a/rmi4update/rmi4update.h b/rmi4update/rmi4update.h index ee77228..928e07b 100755 --- a/rmi4update/rmi4update.h +++ b/rmi4update/rmi4update.h @@ -52,6 +52,7 @@ enum v7_partition_id { DISPLAY_CONFIG_PARTITION, EXTERNAL_TOUCH_AFE_CONFIG_PARTITION, UTILITY_PARAMETER_PARTITION, + FIXED_LOCATION_DATA_PARTITION = 0x0E, }; enum v7_flash_command { @@ -70,6 +71,7 @@ enum bl_version { BL_V6 = 6, BL_V7 = 7, BL_V8 = 8, + BL_V10 = 10, }; struct f34_v7_query_0 { @@ -129,7 +131,9 @@ struct f34_v7_query_1_7 { 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_b11_13:3; + unsigned char has_fld:1; + unsigned char f34_query7_b15:1; unsigned char f34_query7_b16__23; unsigned char f34_query7_b24__31; } __attribute__((packed));; @@ -158,6 +162,11 @@ public: m_firmwareImage(firmwareImage), m_writeBlockWithCmd(true) { m_IsErased = false; + m_hasCoreCode = false; + m_hasCoreConfig = false; + m_hasFlashConfig = false; + m_hasFLD = false; + m_hasGlobalParameters = false; } int UpdateFirmware(bool force = false, bool performLockdown = false); @@ -172,9 +181,13 @@ private: int WriteBootloaderID(); int EnterFlashProgrammingV7(); int EraseFirmwareV7(); + int EraseFlashConfigV10(); + int EraseCoreCodeV10(); int WriteFirmwareV7(); int WriteCoreConfigV7(); int WriteFlashConfigV7(); + int WriteFLDV7(); + int WriteGlobalParametersV7(); int EnterFlashProgramming(); int WriteBlocks(unsigned char *block, unsigned short count, unsigned char cmd); int WaitForIdle(int timeout_ms, bool readF34OnSucess = true); @@ -217,6 +230,14 @@ private: unsigned char m_inBLmode; unsigned long m_buildID; unsigned char *m_guestData; + bool m_hasCoreCode; + bool m_hasCoreConfig; + bool m_hasFlashConfig; + bool m_hasGlobalParameters; + /* BL_V7 end */ + + /* for BL V10 */ + bool m_hasFLD; /* BL_V7 end */ unsigned short m_f34StatusAddr; diff --git a/rmidevice/hiddevice.cpp b/rmidevice/hiddevice.cpp index 0720304..df0c6ba 100755 --- a/rmidevice/hiddevice.cpp +++ b/rmidevice/hiddevice.cpp @@ -302,6 +302,8 @@ int HIDDevice::Read(unsigned short addr, unsigned char *buf, unsigned short len) tv.tv_sec = 10 / 1000; tv.tv_usec = (10 % 1000) * 1000; + + fprintf(stdout, "R %02x : ", addr); if (!m_deviceOpen) return -1; @@ -387,6 +389,12 @@ Resend: addr += bytesPerRequest; } + for (int i=0 ; i> 8) & 0xFF; memcpy(&m_outputReport[HID_RMI4_WRITE_OUTPUT_DATA], buf, len); + fprintf(stdout, "W %02x : ", addr); + for (int i=0 ; i Date: Fri, 11 Mar 2022 15:19:47 +0800 Subject: Fix wrong assignment for BL v10 --- rmi4update/rmi4update.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/rmi4update/rmi4update.cpp b/rmi4update/rmi4update.cpp index 75e1712..ec6e84b 100755 --- a/rmi4update/rmi4update.cpp +++ b/rmi4update/rmi4update.cpp @@ -779,12 +779,9 @@ int RMI4Update::WriteFirmwareV7() /* calculate the count */ partition_id = CORE_CODE_PARTITION; - if (m_bootloaderID[1] == 10) { - // define block count - } else { - remain_block = (m_fwBlockCount % m_payloadLength); - transaction_count = (m_fwBlockCount / m_payloadLength); - } + + remain_block = (m_fwBlockCount % m_payloadLength); + transaction_count = (m_fwBlockCount / m_payloadLength); if (remain_block > 0) transaction_count++; -- cgit v1.2.3 From 7f553ab32a9f7096c8d041bc8cf79533a4cb3ff2 Mon Sep 17 00:00:00 2001 From: David Chiu Date: Wed, 2 Mar 2022 15:47:31 +0800 Subject: Support debugging message in read/write --- rmi4update/main.cpp | 14 +++++++++++++- rmidevice/hiddevice.cpp | 18 ++++++++++++++++++ rmidevice/rmidevice.h | 4 +++- 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/rmi4update/main.cpp b/rmi4update/main.cpp index 38b1f77..386930f 100755 --- a/rmi4update/main.cpp +++ b/rmi4update/main.cpp @@ -36,7 +36,9 @@ #define VERSION_MINOR 3 #define VERSION_SUBMINOR 9 -#define RMI4UPDATE_GETOPTS "hfd:t:pclv" +#define RMI4UPDATE_GETOPTS "hfd:t:pclvm" + +bool needDebugMessage; void printHelp(const char *prog_name) { @@ -66,6 +68,9 @@ int GetFirmwareProps(const char * deviceFile, std::string &props, bool configid) rc = rmidevice.Open(deviceFile); if (rc) return rc; + + if (needDebugMessage) + rmidevice.m_hasDebug = true; // Clear all interrupts before parsing to avoid unexpected interrupts. rmidevice.ToggleInterruptMask(false); @@ -115,6 +120,7 @@ int main(int argc, char **argv) bool printFirmwareProps = false; bool printConfigid = false; bool performLockdown = false; + needDebugMessage = false; HIDDevice device; enum RMIDeviceType deviceType = RMI_DEVICE_TYPE_ANY; @@ -148,6 +154,9 @@ int main(int argc, char **argv) case 'v': printVersion(); return 0; + case 'm': + needDebugMessage = true; + break; default: break; @@ -195,6 +204,9 @@ int main(int argc, char **argv) return 1; } + if (needDebugMessage) { + device.m_hasDebug = true; + } RMI4Update update(device, image); rc = update.UpdateFirmware(force, performLockdown); diff --git a/rmidevice/hiddevice.cpp b/rmidevice/hiddevice.cpp index 00067e0..b727cb5 100755 --- a/rmidevice/hiddevice.cpp +++ b/rmidevice/hiddevice.cpp @@ -306,6 +306,10 @@ int HIDDevice::Read(unsigned short addr, unsigned char *buf, unsigned short len) if (!m_deviceOpen) return -1; + if (m_hasDebug) { + fprintf(stdout, "R %02x : ", addr); + } + if (m_bytesPerReadRequest) bytesPerRequest = m_bytesPerReadRequest; else @@ -386,6 +390,12 @@ Resend: } addr += bytesPerRequest; } + if (m_hasDebug) { + for (int i=0 ; i> 8) & 0xFF; memcpy(&m_outputReport[HID_RMI4_WRITE_OUTPUT_DATA], buf, len); + if (m_hasDebug) { + fprintf(stdout, "W %02x : ", addr); + for (int i=0 ; i m_functionList; unsigned char m_manufacturerID; -- cgit v1.2.3 From 0c81a558280f9f2b9e414c4908c699ac4ec6aa29 Mon Sep 17 00:00:00 2001 From: David Chiu Date: Mon, 14 Mar 2022 17:35:37 +0800 Subject: Remove duplicated debugging message --- rmidevice/hiddevice.cpp | 8 -------- 1 file changed, 8 deletions(-) diff --git a/rmidevice/hiddevice.cpp b/rmidevice/hiddevice.cpp index 5bc7c99..1cef2e5 100755 --- a/rmidevice/hiddevice.cpp +++ b/rmidevice/hiddevice.cpp @@ -302,8 +302,6 @@ int HIDDevice::Read(unsigned short addr, unsigned char *buf, unsigned short len) tv.tv_sec = 10 / 1000; tv.tv_usec = (10 % 1000) * 1000; - - fprintf(stdout, "R %02x : ", addr); if (!m_deviceOpen) return -1; @@ -399,12 +397,6 @@ Resend: fprintf(stdout, "\n"); } - for (int i=0 ; i Date: Fri, 15 Apr 2022 16:47:25 +0800 Subject: Write signature if we can confirm its existence. --- rmi4update/firmware_image.cpp | 11 +++++----- rmi4update/rmi4update.cpp | 51 ++++++++++++++++++++++++++----------------- 2 files changed, 37 insertions(+), 25 deletions(-) diff --git a/rmi4update/firmware_image.cpp b/rmi4update/firmware_image.cpp index e4813c5..6b0323e 100755 --- a/rmi4update/firmware_image.cpp +++ b/rmi4update/firmware_image.cpp @@ -55,13 +55,14 @@ void FirmwareImage::ParseHierarchicalImg() unsigned char *content; unsigned short container_id; unsigned int sigature_size; + + for (ii = 0; ii < BLv7_MAX; ii++) { + m_signatureInfo[ii].bExisted = false; + m_signatureInfo[ii].size = 0; + } if (m_bootloaderVersion == RMI_IMG_V10_SIGNATURE_VERSION_NUMBER) { - fprintf (stdout, "has signature\n"); - for (ii = 0; ii < BLv7_MAX; ii++) { - m_signatureInfo[ii].bExisted = false; - m_signatureInfo[ii].size = 0; - } + fprintf (stdout, "has signature\n"); } m_cntrAddr = extract_long(&m_memBlock[RMI_IMG_V10_CNTR_ADDR_OFFSET]); diff --git a/rmi4update/rmi4update.cpp b/rmi4update/rmi4update.cpp index ec6e84b..5e1d924 100755 --- a/rmi4update/rmi4update.cpp +++ b/rmi4update/rmi4update.cpp @@ -355,6 +355,9 @@ int RMI4Update::UpdateFirmware(bool force, bool performLockdown) reset: m_device.Reset(); rebind: + if (m_bootloaderID[1] >= 10) { + Sleep(5000); + } m_device.RebindDriver(); if(!m_device.CheckABSEvent()) { @@ -874,11 +877,13 @@ int RMI4Update::WriteFirmwareV7() } if(m_device.GetDeviceType() == RMI_DEVICE_TYPE_TOUCHPAD) { - // Write signature. - rc = WriteSignatureV7(BLv7_CORE_CODE, m_firmwareImage.GetFirmwareData(), offset); - if (rc != UPDATE_SUCCESS) { - fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); - return rc; + if (m_firmwareImage.GetSignatureInfo()[BLv7_CORE_CODE].bExisted) { + // Write signature. + rc = WriteSignatureV7(BLv7_CORE_CODE, m_firmwareImage.GetFirmwareData(), offset); + if (rc != UPDATE_SUCCESS) { + fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); + return rc; + } } } @@ -1000,11 +1005,13 @@ int RMI4Update::WriteCoreConfigV7() } if(m_device.GetDeviceType() == RMI_DEVICE_TYPE_TOUCHPAD) { - // Write signature. - rc = WriteSignatureV7(BLv7_CORE_CONFIG, m_firmwareImage.GetConfigData(), offset); - if (rc != UPDATE_SUCCESS) { - fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); - return rc; + if (m_firmwareImage.GetSignatureInfo()[BLv7_CORE_CONFIG].bExisted) { + // Write signature. + rc = WriteSignatureV7(BLv7_CORE_CONFIG, m_firmwareImage.GetConfigData(), offset); + if (rc != UPDATE_SUCCESS) { + fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); + return rc; + } } } @@ -1126,11 +1133,13 @@ int RMI4Update::WriteFlashConfigV7() } if(m_device.GetDeviceType() == RMI_DEVICE_TYPE_TOUCHPAD) { - // Write signature. - rc = WriteSignatureV7(BLv7_FLASH_CONFIG, m_firmwareImage.GetFlashConfigData(), offset); - if (rc != UPDATE_SUCCESS) { - fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); - return rc; + if (m_firmwareImage.GetSignatureInfo()[BLv7_FLASH_CONFIG].bExisted) { + // Write signature. + rc = WriteSignatureV7(BLv7_FLASH_CONFIG, m_firmwareImage.GetFlashConfigData(), offset); + if (rc != UPDATE_SUCCESS) { + fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); + return rc; + } } } @@ -1258,11 +1267,13 @@ int RMI4Update::WriteFLDV7() } if(m_device.GetDeviceType() == RMI_DEVICE_TYPE_TOUCHPAD) { - // Write signature. - rc = WriteSignatureV7(BLv7_FLD, m_firmwareImage.GetFLDData(), offset); - if (rc != UPDATE_SUCCESS) { - fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); - return rc; + if (m_firmwareImage.GetSignatureInfo()[BLv7_FLD].bExisted) { + // Write signature. + rc = WriteSignatureV7(BLv7_FLD, m_firmwareImage.GetFLDData(), offset); + if (rc != UPDATE_SUCCESS) { + fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); + return rc; + } } } -- cgit v1.2.3 From b081422856340e9a95880edf8621a172797410b8 Mon Sep 17 00:00:00 2001 From: David Chiu Date: Mon, 25 Apr 2022 16:33:47 +0800 Subject: Support write protection --- rmi4update/rmi4update.cpp | 27 ++++++++++++++++++++++++++- rmi4update/rmi4update.h | 2 ++ rmi4update/updateutil.cpp | 1 + rmi4update/updateutil.h | 1 + 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/rmi4update/rmi4update.cpp b/rmi4update/rmi4update.cpp index 5e1d924..6a21c38 100755 --- a/rmi4update/rmi4update.cpp +++ b/rmi4update/rmi4update.cpp @@ -1119,6 +1119,10 @@ int RMI4Update::WriteFlashConfigV7() do { Sleep(20); rmi4update_poll(); + if (CheckWriteProtectionActivated()) { + if (m_flashStatus == WRITE_PROTECTION) + return UPDATE_FAIL_WRITE_PROTECTED; + } if (m_flashStatus == SUCCESS){ break; } @@ -1252,6 +1256,10 @@ int RMI4Update::WriteFLDV7() do { Sleep(20); rmi4update_poll(); + if (CheckWriteProtectionActivated()) { + if (m_flashStatus == WRITE_PROTECTION) + return UPDATE_FAIL_WRITE_PROTECTED; + } if (m_flashStatus == SUCCESS){ break; @@ -1442,6 +1450,10 @@ int RMI4Update::EraseFlashConfigV10() do { Sleep(20); rmi4update_poll(); + if (CheckWriteProtectionActivated()) { + if (m_flashStatus == WRITE_PROTECTION) + return UPDATE_FAIL_WRITE_PROTECTED; + } if (m_flashStatus == SUCCESS){ break; } @@ -1569,6 +1581,10 @@ int RMI4Update::EraseFirmwareV7() do { Sleep(20); rmi4update_poll(); + if (CheckWriteProtectionActivated()) { + if (m_flashStatus == WRITE_PROTECTION) + return UPDATE_FAIL_WRITE_PROTECTED; + } if (m_flashStatus == SUCCESS){ break; } @@ -1681,7 +1697,7 @@ int RMI4Update::EnterFlashProgrammingV7() rmi4update_poll(); if (!m_inBLmode) return UPDATE_FAIL_DEVICE_NOT_IN_BOOTLOADER; - + } else fprintf(stdout, "Already in BL mode, skip...\n"); @@ -1972,3 +1988,12 @@ int RMI4Update::WaitForIdle(int timeout_ms, bool readF34OnSucess) return UPDATE_SUCCESS; } + +bool RMI4Update::CheckWriteProtectionActivated() +{ + if ((m_bootloaderID[1] >= 10) || + ((m_bootloaderID[1] == 8) && (m_bootloaderID[0] >= 7))){ + return true; + } else + return false; +} diff --git a/rmi4update/rmi4update.h b/rmi4update/rmi4update.h index 928e07b..80923dd 100755 --- a/rmi4update/rmi4update.h +++ b/rmi4update/rmi4update.h @@ -35,6 +35,7 @@ enum v7_status { FLASH_PROGRAMMING_KEY_INCORRECT, BAD_PARTITION_TABLE, CHECKSUM_FAILED, + WRITE_PROTECTION = 0x0E, FLASH_HARDWARE_FAILURE = 0x1f, }; @@ -194,6 +195,7 @@ private: int GetFirmwareSize() { return m_blockSize * m_fwBlockCount; } int GetConfigSize() { return m_blockSize * m_configBlockCount; } int WriteSignatureV7(enum signature_BLv7 signature_partition, unsigned char* data, int offset); + bool CheckWriteProtectionActivated(); private: RMIDevice & m_device; diff --git a/rmi4update/updateutil.cpp b/rmi4update/updateutil.cpp index 52245d3..cc607d2 100644 --- a/rmi4update/updateutil.cpp +++ b/rmi4update/updateutil.cpp @@ -52,6 +52,7 @@ const char *update_error_str[] = { "the firmware image is older then the firmware on the device", // UPDATE_FAIL_FIRMWARE_IMAGE_IS_OLDER "invalid parameter", // UPDATE_FAIL_INVALID_PARAMETER "failed to open firmware image file", // UPDATE_FAIL_OPEN_FIRMWARE_IMAGE + "write protection is activated", // UPDATE_FAIL_WRITE_PROTECTED }; const char * update_err_to_string(int err) diff --git a/rmi4update/updateutil.h b/rmi4update/updateutil.h index c65c53a..8667086 100644 --- a/rmi4update/updateutil.h +++ b/rmi4update/updateutil.h @@ -51,6 +51,7 @@ enum update_error { UPDATE_FAIL_FIRMWARE_IMAGE_IS_OLDER, UPDATE_FAIL_INVALID_PARAMETER, UPDATE_FAIL_OPEN_FIRMWARE_IMAGE, + UPDATE_FAIL_WRITE_PROTECTED, }; const char * update_err_to_string(int err); -- cgit v1.2.3 From 833d55ac8895265d756ccde3f5255320e213dad9 Mon Sep 17 00:00:00 2001 From: David Chiu Date: Fri, 29 Apr 2022 11:04:46 +0800 Subject: Rename function --- rmi4update/rmi4update.cpp | 10 +++++----- rmi4update/rmi4update.h | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/rmi4update/rmi4update.cpp b/rmi4update/rmi4update.cpp index 6a21c38..5338234 100755 --- a/rmi4update/rmi4update.cpp +++ b/rmi4update/rmi4update.cpp @@ -1119,7 +1119,7 @@ int RMI4Update::WriteFlashConfigV7() do { Sleep(20); rmi4update_poll(); - if (CheckWriteProtectionActivated()) { + if (IsWriteProtectionSupported()) { if (m_flashStatus == WRITE_PROTECTION) return UPDATE_FAIL_WRITE_PROTECTED; } @@ -1256,7 +1256,7 @@ int RMI4Update::WriteFLDV7() do { Sleep(20); rmi4update_poll(); - if (CheckWriteProtectionActivated()) { + if (IsWriteProtectionSupported()) { if (m_flashStatus == WRITE_PROTECTION) return UPDATE_FAIL_WRITE_PROTECTED; } @@ -1450,7 +1450,7 @@ int RMI4Update::EraseFlashConfigV10() do { Sleep(20); rmi4update_poll(); - if (CheckWriteProtectionActivated()) { + if (IsWriteProtectionSupported()) { if (m_flashStatus == WRITE_PROTECTION) return UPDATE_FAIL_WRITE_PROTECTED; } @@ -1581,7 +1581,7 @@ int RMI4Update::EraseFirmwareV7() do { Sleep(20); rmi4update_poll(); - if (CheckWriteProtectionActivated()) { + if (IsWriteProtectionSupported()) { if (m_flashStatus == WRITE_PROTECTION) return UPDATE_FAIL_WRITE_PROTECTED; } @@ -1989,7 +1989,7 @@ int RMI4Update::WaitForIdle(int timeout_ms, bool readF34OnSucess) return UPDATE_SUCCESS; } -bool RMI4Update::CheckWriteProtectionActivated() +bool RMI4Update::IsWriteProtectionSupported() { if ((m_bootloaderID[1] >= 10) || ((m_bootloaderID[1] == 8) && (m_bootloaderID[0] >= 7))){ diff --git a/rmi4update/rmi4update.h b/rmi4update/rmi4update.h index 80923dd..cfc5d21 100755 --- a/rmi4update/rmi4update.h +++ b/rmi4update/rmi4update.h @@ -195,7 +195,7 @@ private: int GetFirmwareSize() { return m_blockSize * m_fwBlockCount; } int GetConfigSize() { return m_blockSize * m_configBlockCount; } int WriteSignatureV7(enum signature_BLv7 signature_partition, unsigned char* data, int offset); - bool CheckWriteProtectionActivated(); + bool IsWriteProtectionSupported(); private: RMIDevice & m_device; -- cgit v1.2.3 From 492fabbe22dd584a6f8056fc70a7ac3b569d8749 Mon Sep 17 00:00:00 2001 From: David Chiu Date: Wed, 18 May 2022 16:24:50 +0800 Subject: Support checking MSL --- rmi4update/firmware_image.cpp | 7 +++++++ rmi4update/firmware_image.h | 7 ++++++- rmi4update/rmi4update.cpp | 41 ++++++++++++++++++++++++++++++++++++----- rmi4update/rmi4update.h | 7 ++++++- rmi4update/updateutil.h | 1 + 5 files changed, 56 insertions(+), 7 deletions(-) diff --git a/rmi4update/firmware_image.cpp b/rmi4update/firmware_image.cpp index 6b0323e..ecc2af4 100755 --- a/rmi4update/firmware_image.cpp +++ b/rmi4update/firmware_image.cpp @@ -123,6 +123,13 @@ void FirmwareImage::ParseHierarchicalImg() m_firmwareBuildID = extract_long(content + 4); memcpy(m_productID, (content + 0x18), RMI_PRODUCT_ID_LENGTH); m_productID[RMI_PRODUCT_ID_LENGTH] = 0; + if ((descriptor->major_version == 0) && + (descriptor->minor_version > 0)) { + m_hasFirmwareVersion = true; + fprintf(stdout, "General Information version : %d.%d\n", descriptor->major_version, descriptor->minor_version); + m_firmwareVersion = *(content + 0x26) << 8 | *(content + 0x27); + fprintf(stdout, "Firmware version : 0x%x\n", m_firmwareVersion); + } break; case FIXED_LOCATION_DATA_CONTAINER: if (sigature_size != 0) { diff --git a/rmi4update/firmware_image.h b/rmi4update/firmware_image.h index e4279d5..3558b07 100755 --- a/rmi4update/firmware_image.h +++ b/rmi4update/firmware_image.h @@ -110,7 +110,8 @@ class FirmwareImage { public: FirmwareImage() : m_firmwareBuildID(0), m_packageID(0), m_firmwareData(NULL), m_configData(NULL), m_lockdownData(NULL), - m_memBlock(NULL), m_hasSignature(false), m_fldData(NULL), m_fldSize(0), m_globalparaData(NULL), m_globalparaSize(0) + m_memBlock(NULL), m_hasSignature(false), m_fldData(NULL), m_fldSize(0), m_globalparaData(NULL), m_globalparaSize(0), + m_firmwareVersion(0), m_hasFirmwareVersion(false) {} int Initialize(const char * filename); int VerifyImageMatchesDevice(unsigned long deviceFirmwareSize, @@ -128,8 +129,10 @@ public: unsigned long GetFirmwareID() { return m_firmwareBuildID; } unsigned long GetFLDSize() { return m_fldSize; } unsigned long GetGlobalParametersSize() { return m_globalparaSize; } + unsigned short GetFirmwareVersion() { return m_firmwareVersion; } signature_info *GetSignatureInfo() { return m_signatureInfo; } int VerifyImageProductID(char* deviceProductID); + bool IsImageHasFirmwareVersion() { return m_hasFirmwareVersion; } bool HasIO() { return m_io; } ~FirmwareImage(); @@ -164,6 +167,8 @@ private: unsigned long m_fldSize; unsigned char * m_globalparaData; unsigned long m_globalparaSize; + unsigned short m_firmwareVersion; + bool m_hasFirmwareVersion; signature_info m_signatureInfo[BLv7_MAX]; }; diff --git a/rmi4update/rmi4update.cpp b/rmi4update/rmi4update.cpp index 5338234..6091842 100755 --- a/rmi4update/rmi4update.cpp +++ b/rmi4update/rmi4update.cpp @@ -158,6 +158,21 @@ int RMI4Update::UpdateFirmware(bool force, bool performLockdown) } fprintf(stdout, "Enable Flash done V7+...\n"); + if (IsBLv87()) { + if (m_firmwareImage.IsImageHasFirmwareVersion()) { + rc = ReadMSL(); + fprintf(stdout, "MSL : 0x%x\n", m_MSL); + if (m_MSL > m_firmwareImage.GetFirmwareVersion()) { + fprintf(stdout, "MSL checking failed. device(0x%x) > image(0x%x)\n", + m_MSL, m_firmwareImage.GetFirmwareVersion()); + rc = UPDATE_FAIL_MSL_CHECKING; + goto reset; + } else { + fprintf(stdout, "Passing MSL checking\n"); + } + } + } + if (m_bootloaderID[1] >= 10) { fprintf(stdout, "Writing FLD V10...\n"); rc = WriteFLDV7(); @@ -1119,7 +1134,7 @@ int RMI4Update::WriteFlashConfigV7() do { Sleep(20); rmi4update_poll(); - if (IsWriteProtectionSupported()) { + if (IsBLv87()) { if (m_flashStatus == WRITE_PROTECTION) return UPDATE_FAIL_WRITE_PROTECTED; } @@ -1256,7 +1271,7 @@ int RMI4Update::WriteFLDV7() do { Sleep(20); rmi4update_poll(); - if (IsWriteProtectionSupported()) { + if (IsBLv87()) { if (m_flashStatus == WRITE_PROTECTION) return UPDATE_FAIL_WRITE_PROTECTED; } @@ -1450,7 +1465,7 @@ int RMI4Update::EraseFlashConfigV10() do { Sleep(20); rmi4update_poll(); - if (IsWriteProtectionSupported()) { + if (IsBLv87()) { if (m_flashStatus == WRITE_PROTECTION) return UPDATE_FAIL_WRITE_PROTECTED; } @@ -1581,7 +1596,7 @@ int RMI4Update::EraseFirmwareV7() do { Sleep(20); rmi4update_poll(); - if (IsWriteProtectionSupported()) { + if (IsBLv87()) { if (m_flashStatus == WRITE_PROTECTION) return UPDATE_FAIL_WRITE_PROTECTED; } @@ -1989,7 +2004,7 @@ int RMI4Update::WaitForIdle(int timeout_ms, bool readF34OnSucess) return UPDATE_SUCCESS; } -bool RMI4Update::IsWriteProtectionSupported() +bool RMI4Update::IsBLv87() { if ((m_bootloaderID[1] >= 10) || ((m_bootloaderID[1] == 8) && (m_bootloaderID[0] >= 7))){ @@ -1997,3 +2012,19 @@ bool RMI4Update::IsWriteProtectionSupported() } else return false; } + +int RMI4Update::ReadMSL() +{ + int rc; + unsigned char idStr[3]; + unsigned short query9Addr = m_f34.GetQueryBase() + 9; + unsigned char offset; + unsigned char MSL[2]; + + rc = m_device.Read(query9Addr, MSL, sizeof(MSL)); + if (rc != sizeof(MSL)) + return UPDATE_FAIL_READ_F34_QUERIES; + + m_MSL = MSL[0] << 8 | MSL[1]; + return UPDATE_SUCCESS; +} diff --git a/rmi4update/rmi4update.h b/rmi4update/rmi4update.h index cfc5d21..ea87653 100755 --- a/rmi4update/rmi4update.h +++ b/rmi4update/rmi4update.h @@ -195,7 +195,8 @@ private: int GetFirmwareSize() { return m_blockSize * m_fwBlockCount; } int GetConfigSize() { return m_blockSize * m_configBlockCount; } int WriteSignatureV7(enum signature_BLv7 signature_partition, unsigned char* data, int offset); - bool IsWriteProtectionSupported(); + bool IsBLv87(); + int ReadMSL(); private: RMIDevice & m_device; @@ -238,6 +239,10 @@ private: bool m_hasGlobalParameters; /* BL_V7 end */ + /* BL v8.7 */ + unsigned short m_MSL; + /* BL v8.7 end */ + /* for BL V10 */ bool m_hasFLD; /* BL_V7 end */ diff --git a/rmi4update/updateutil.h b/rmi4update/updateutil.h index 8667086..e59d690 100644 --- a/rmi4update/updateutil.h +++ b/rmi4update/updateutil.h @@ -52,6 +52,7 @@ enum update_error { UPDATE_FAIL_INVALID_PARAMETER, UPDATE_FAIL_OPEN_FIRMWARE_IMAGE, UPDATE_FAIL_WRITE_PROTECTED, + UPDATE_FAIL_MSL_CHECKING, }; const char * update_err_to_string(int err); -- cgit v1.2.3 From 1ed13a9ac1c367893f9e2a96909aa57cd3e8d7ff Mon Sep 17 00:00:00 2001 From: David Chiu Date: Fri, 20 May 2022 21:41:19 +0800 Subject: Add error handling --- rmi4update/rmi4update.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/rmi4update/rmi4update.cpp b/rmi4update/rmi4update.cpp index 6091842..cec3a84 100755 --- a/rmi4update/rmi4update.cpp +++ b/rmi4update/rmi4update.cpp @@ -161,6 +161,10 @@ int RMI4Update::UpdateFirmware(bool force, bool performLockdown) if (IsBLv87()) { if (m_firmwareImage.IsImageHasFirmwareVersion()) { rc = ReadMSL(); + if (rc != UPDATE_SUCCESS) { + fprintf(stderr, "%s: %s\n", __func__, update_err_to_string(rc)); + goto reset; + } fprintf(stdout, "MSL : 0x%x\n", m_MSL); if (m_MSL > m_firmwareImage.GetFirmwareVersion()) { fprintf(stdout, "MSL checking failed. device(0x%x) > image(0x%x)\n", -- cgit v1.2.3 From 7522f2609b24bd5e184f944126e65e9521fcd399 Mon Sep 17 00:00:00 2001 From: Vincent Huang Date: Wed, 26 Oct 2022 18:56:01 +0800 Subject: Update version for v1.3.10 release --- rmi4update/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rmi4update/main.cpp b/rmi4update/main.cpp index 386930f..85e9c96 100755 --- a/rmi4update/main.cpp +++ b/rmi4update/main.cpp @@ -34,7 +34,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 3 -#define VERSION_SUBMINOR 9 +#define VERSION_SUBMINOR 10 #define RMI4UPDATE_GETOPTS "hfd:t:pclvm" -- cgit v1.2.3 From bd63cd1a4c7a9b16eebca51b00e7d95a546a2589 Mon Sep 17 00:00:00 2001 From: Vincent Huang Date: Thu, 27 Oct 2022 17:44:05 +0800 Subject: Hide unnecessary debug message in normal mode --- rmidevice/hiddevice.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/rmidevice/hiddevice.cpp b/rmidevice/hiddevice.cpp index 1cef2e5..b81d70a 100755 --- a/rmidevice/hiddevice.cpp +++ b/rmidevice/hiddevice.cpp @@ -470,7 +470,9 @@ int HIDDevice::ToggleInterruptMask(bool enable) // However, it might have no action even we set this feature with specific value. // Need FW team's help to query more information about the existence of functions. if (!hasVendorDefineLIDMode) { - fprintf(stdout, "no LID mode feature, return\n"); + if (m_hasDebug) { + fprintf(stdout, "no LID mode feature, return\n"); + } return 0; } -- cgit v1.2.3 From e75dd6d14a056248a416edf86148546303decbd8 Mon Sep 17 00:00:00 2001 From: Vincent Huang Date: Thu, 27 Oct 2022 17:51:49 +0800 Subject: Update version for v1.3.11 release --- rmi4update/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rmi4update/main.cpp b/rmi4update/main.cpp index 85e9c96..a5eb752 100755 --- a/rmi4update/main.cpp +++ b/rmi4update/main.cpp @@ -34,7 +34,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 3 -#define VERSION_SUBMINOR 10 +#define VERSION_SUBMINOR 11 #define RMI4UPDATE_GETOPTS "hfd:t:pclvm" -- cgit v1.2.3 From 537827ba4d26eb7ed1c25a31b82657771ed16eb1 Mon Sep 17 00:00:00 2001 From: myangsynapticscom <116875207+myangsynapticscom@users.noreply.github.com> Date: Fri, 28 Oct 2022 18:28:26 +0800 Subject: Enable LFS feature Enable LFS feature while building relevant packages. --- f54test/Makefile | 1 + rmi4update/Makefile | 1 + rmidevice/Makefile | 1 + rmihidtool/Makefile | 1 + 4 files changed, 4 insertions(+) diff --git a/f54test/Makefile b/f54test/Makefile index e0f1b64..272646c 100644 --- a/f54test/Makefile +++ b/f54test/Makefile @@ -1,5 +1,6 @@ CXX ?= g++ CPPFLAGS += -I../include -I./include -I../rmidevice +CPPFLAGS += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE CXXFLAGS += -Wall LDFLAGS += -L. LIBS = -lrmidevice -lrt diff --git a/rmi4update/Makefile b/rmi4update/Makefile index b8ce096..c8fe3cc 100644 --- a/rmi4update/Makefile +++ b/rmi4update/Makefile @@ -1,5 +1,6 @@ CXX ?= g++ CPPFLAGS += -I../include -I./include -I../rmidevice +CPPFLAGS += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE CXXFLAGS += -Wall LDFLAGS += -L. LIBS = -lrmidevice -lrt diff --git a/rmidevice/Makefile b/rmidevice/Makefile index d9f32cc..4ce6b39 100644 --- a/rmidevice/Makefile +++ b/rmidevice/Makefile @@ -2,6 +2,7 @@ CXX ?= g++ AR ?= ar RANLIB ?= ranlib CPPFLAGS += -I../include -I./include +CPPFLAGS += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE CXXFLAGS += -fPIC -Wall RMIDEVICESRC = rmifunction.cpp rmidevice.cpp hiddevice.cpp util.cpp RMIDEVICEOBJ = $(RMIDEVICESRC:.cpp=.o) diff --git a/rmihidtool/Makefile b/rmihidtool/Makefile index 3553c99..e03fe92 100644 --- a/rmihidtool/Makefile +++ b/rmihidtool/Makefile @@ -1,5 +1,6 @@ CXX ?= g++ CPPFLAGS += -I../include -I./include -I../rmidevice +CPPFLAGS += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE CXXFLAGS += -Wall LDFLAGS += -L. LIBS = -lrmidevice -- cgit v1.2.3 From f1387312b45de0e3524dc27ccaf806366506f7bb Mon Sep 17 00:00:00 2001 From: Vincent Huang Date: Fri, 28 Oct 2022 19:03:56 +0800 Subject: Update version for v1.3.12 release --- rmi4update/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rmi4update/main.cpp b/rmi4update/main.cpp index a5eb752..56871ed 100755 --- a/rmi4update/main.cpp +++ b/rmi4update/main.cpp @@ -34,7 +34,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 3 -#define VERSION_SUBMINOR 11 +#define VERSION_SUBMINOR 12 #define RMI4UPDATE_GETOPTS "hfd:t:pclvm" -- cgit v1.2.3