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 From acae70240d5d8f4b662cdf450dd395c19d91999d Mon Sep 17 00:00:00 2001 From: Christopher Ferris Date: Tue, 13 Dec 2022 03:44:26 +0000 Subject: Fix code to compile with new kernel 6.1 headers. The new kernel headers conflict with some of the names used in the hiddevice.cpp file. Change all of those so they are unique to that file and will not conflict in the future. Test: Builds. Test: Boots on panther. Change-Id: I46010a4c3b1914fa0c51ec840663cb75aadfd6a2 --- rmidevice/hiddevice.cpp | 40 +++++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/rmidevice/hiddevice.cpp b/rmidevice/hiddevice.cpp index b81d70a..4cedc5a 100755 --- a/rmidevice/hiddevice.cpp +++ b/rmidevice/hiddevice.cpp @@ -43,13 +43,19 @@ #define RMI_SET_LID_MODE_REPORT_ID 0xe // Feature Report -enum hid_report_type { - HID_REPORT_TYPE_UNKNOWN = 0x0, - HID_REPORT_TYPE_INPUT = 0x81, - HID_REPORT_TYPE_OUTPUT = 0x91, - HID_REPORT_TYPE_FEATURE = 0xb1, +// Make sure that none of the enums/macros conflict with possible +// kernel definition/names. +enum hid_rmi4_report_type { + HID_RMI4_REPORT_UNKNOWN = 0, + HID_RMI4_REPORT_INPUT = 1, + HID_RMI4_REPORT_OUTPUT = 2, + HID_RMI4_REPORT_FEATURE = 3, }; +#define HID_RMI4_REPORT_TYPE_INPUT 0x81 +#define HID_RMI4_REPORT_TYPE_OUTPUT 0x91 +#define HID_RMI4_REPORT_TYPE_FEATURE 0xb1 + #define HID_RMI4_REPORT_ID 0 #define HID_RMI4_READ_INPUT_COUNT 1 #define HID_RMI4_READ_INPUT_DATA 2 @@ -163,7 +169,7 @@ void HIDDevice::ParseReportDescriptor() int totalReportSize = 0; int reportSize = 0; int reportCount = 0; - enum hid_report_type hidReportType = HID_REPORT_TYPE_UNKNOWN; + enum hid_rmi4_report_type hidReportType = HID_RMI4_REPORT_UNKNOWN; bool inCollection = false; for (unsigned int i = 0; i < m_rptDesc.size; ++i) { @@ -181,16 +187,16 @@ void HIDDevice::ParseReportDescriptor() totalReportSize = (reportSize * reportCount) >> 3; switch (hidReportType) { - case HID_REPORT_TYPE_INPUT: + case HID_RMI4_REPORT_INPUT: m_inputReportSize = totalReportSize + 1; break; - case HID_REPORT_TYPE_OUTPUT: + case HID_RMI4_REPORT_OUTPUT: m_outputReportSize = totalReportSize + 1; break; - case HID_REPORT_TYPE_FEATURE: + case HID_RMI4_REPORT_FEATURE: m_featureReportSize = totalReportSize + 1; break; - case HID_REPORT_TYPE_UNKNOWN: + case HID_RMI4_REPORT_UNKNOWN: default: break; } @@ -200,7 +206,7 @@ void HIDDevice::ParseReportDescriptor() totalReportSize = 0; reportSize = 0; reportCount = 0; - hidReportType = HID_REPORT_TYPE_UNKNOWN; + hidReportType = HID_RMI4_REPORT_UNKNOWN; isReport = true; } @@ -224,14 +230,14 @@ void HIDDevice::ParseReportDescriptor() hasVendorDefineLIDMode = true; } - if (m_rptDesc.value[i] == HID_REPORT_TYPE_INPUT) - hidReportType = HID_REPORT_TYPE_INPUT; + if (m_rptDesc.value[i] == HID_RMI4_REPORT_TYPE_INPUT) + hidReportType = HID_RMI4_REPORT_INPUT; - if (m_rptDesc.value[i] == HID_REPORT_TYPE_OUTPUT) - hidReportType = HID_REPORT_TYPE_OUTPUT; + if (m_rptDesc.value[i] == HID_RMI4_REPORT_TYPE_OUTPUT) + hidReportType = HID_RMI4_REPORT_OUTPUT; - if (m_rptDesc.value[i] == HID_REPORT_TYPE_FEATURE) { - hidReportType = HID_REPORT_TYPE_FEATURE; + if (m_rptDesc.value[i] == HID_RMI4_REPORT_TYPE_FEATURE) { + hidReportType = HID_RMI4_REPORT_FEATURE; } } } -- cgit v1.2.3