summaryrefslogtreecommitdiff
path: root/driver/touchpad_st.c
diff options
context:
space:
mode:
Diffstat (limited to 'driver/touchpad_st.c')
-rw-r--r--driver/touchpad_st.c60
1 files changed, 31 insertions, 29 deletions
diff --git a/driver/touchpad_st.c b/driver/touchpad_st.c
index 9cfb461d47..d4c7aaa22b 100644
--- a/driver/touchpad_st.c
+++ b/driver/touchpad_st.c
@@ -898,12 +898,15 @@ static int wait_for_flash_ready(uint8_t type)
return retry >= 0 ? ret : EC_ERROR_TIMEOUT;
}
-static int erase_flash(void)
+static int erase_flash(int full_init_required)
{
int ret;
- /* Erase everything, except CX */
- ret = write_hwreg_cmd32(0x20000128, 0xFFFFFF83);
+ if (full_init_required)
+ ret = write_hwreg_cmd32(0x20000128, 0xFFFFFFFF);
+ else
+ /* Erase everything, except CX */
+ ret = write_hwreg_cmd32(0x20000128, 0xFFFFFF83);
if (ret)
return ret;
ret = write_hwreg_cmd8(0x2000006B, 0x00);
@@ -915,7 +918,7 @@ static int erase_flash(void)
return wait_for_flash_ready(0x6A);
}
-static int st_tp_prepare_for_update(void)
+static int st_tp_prepare_for_update(int full_init_required)
{
/* hold m3 */
write_hwreg_cmd8(0x20000024, 0x01);
@@ -923,7 +926,7 @@ static int st_tp_prepare_for_update(void)
write_hwreg_cmd8(0x20000025, 0x20);
/* unlock flash erase */
write_hwreg_cmd8(0x200000DE, 0x03);
- erase_flash();
+ erase_flash(full_init_required);
return EC_SUCCESS;
}
@@ -1079,32 +1082,15 @@ static int st_tp_panel_init(int full)
ST_TP_CMD_WRITE_SYSTEM_COMMAND, 0x00, 0x02
};
int ret, retry;
- uint8_t old_cx_version;
- uint8_t new_cx_version;
if (tp_control & (TP_CONTROL_INIT | TP_CONTROL_INIT_FULL))
return EC_ERROR_BUSY;
- if (full == -1) /* not specified */
- old_cx_version = get_cx_version(
- system_info.release_info & 0xFF);
-
st_tp_stop_scan();
ret = st_tp_reset();
if (ret)
return ret;
- if (full == -1) { /* not specified */
- /*
- * On boot, ST firmware will load system info to host data
- * memory, So we don't need to reload it.
- */
- st_tp_read_system_info(0);
- new_cx_version = get_cx_version(
- system_info.release_info & 0xFF);
- full = old_cx_version != new_cx_version;
- }
-
if (full) { /* should perform full panel initialization */
tx_buf[2] = 0x3;
tp_control = TP_CONTROL_INIT_FULL;
@@ -1144,34 +1130,50 @@ static int st_tp_panel_init(int full)
*/
int touchpad_update_write(int offset, int size, const uint8_t *data)
{
- int ret;
+ static int full_init_required;
+ int ret, flash_offset;
CPRINTS("%s %08x %d", __func__, offset, size);
if (offset == 0) {
+ const struct st_tp_fw_header_t *header;
+ uint8_t old_cx_version;
+ uint8_t new_cx_version;
+
+ header = (const struct st_tp_fw_header_t *)data;
+ if (header->signature != 0xAA55AA55)
+ return EC_ERROR_INVAL;
+
+ old_cx_version = get_cx_version(system_info.release_info);
+ new_cx_version = get_cx_version(header->release_info);
+
+ full_init_required = old_cx_version != new_cx_version;
+
/* stop scanning, interrupt, etc... */
st_tp_stop_scan();
- ret = st_tp_prepare_for_update();
+ ret = st_tp_prepare_for_update(full_init_required);
if (ret)
return ret;
+ return EC_SUCCESS;
}
- if (offset % ST_TP_DMA_CHUNK_SIZE)
+ flash_offset = offset - CONFIG_UPDATE_PDU_SIZE;
+ if (flash_offset % ST_TP_DMA_CHUNK_SIZE)
return EC_ERROR_INVAL;
- if (offset >= ST_TP_FLASH_OFFSET_CX &&
- offset < ST_TP_FLASH_OFFSET_CONFIG)
+ if (flash_offset >= ST_TP_FLASH_OFFSET_CX &&
+ flash_offset < ST_TP_FLASH_OFFSET_CONFIG)
/* don't update CX section */
return EC_SUCCESS;
- ret = st_tp_write_flash(offset, size, data);
+ ret = st_tp_write_flash(flash_offset, size, data);
if (ret)
return ret;
if (offset + size == CONFIG_TOUCHPAD_VIRTUAL_SIZE) {
CPRINTS("%s: End update, wait for reset.", __func__);
- return st_tp_panel_init(-1);
+ return st_tp_panel_init(full_init_required);
}
return EC_SUCCESS;