From dc9c7fd95c86884d591421da01081ce1bd761150 Mon Sep 17 00:00:00 2001 From: CTCaer Date: Wed, 25 Mar 2020 01:38:16 +0200 Subject: [PATCH] touch: Do a panel HW test before calibration In case the panel or the panel connection has issues, abort the calibration. --- nyx/nyx_gui/input/touch.c | 53 ++++++++++++++++++++++++++++++++++++--- nyx/nyx_gui/input/touch.h | 26 ++++++++++++++++++- 2 files changed, 74 insertions(+), 5 deletions(-) diff --git a/nyx/nyx_gui/input/touch.c b/nyx/nyx_gui/input/touch.c index 4c9de6e..cfa6e2f 100644 --- a/nyx/nyx_gui/input/touch.c +++ b/nyx/nyx_gui/input/touch.c @@ -1,5 +1,5 @@ /* - * Touch driver for Nintendo Switch's STM FingerTip S (4cd60d) touch controller + * Touch driver for Nintendo Switch's STM FingerTip S (4CD60D) touch controller * * Copyright (c) 2018 langerhans * Copyright (c) 2018-2020 CTCaer @@ -236,6 +236,46 @@ int touch_sys_reset() return 1; } +int touch_panel_ito_test(u8 *err) +{ + int res = 0; + + // Reset touchscreen module. + if (touch_sys_reset()) + return res; + + // Do ITO Production test. + u8 cmd[2] = { 1, 0 }; + if (touch_command(STMFTS_ITO_CHECK, cmd, 2)) + return res; + + u32 timer = get_tmr_ms() + 2000; + while (true) + { + u8 tmp[8] = {0}; + i2c_recv_buf_small(tmp, 8, I2C_3, STMFTS_I2C_ADDR, STMFTS_READ_ONE_EVENT); + if (tmp[1] == 0xF && tmp[2] == 0x5) + { + if (err) + { + err[0] = tmp[3]; + err[1] = tmp[4]; + } + + res = 1; + break; + } + + if (get_tmr_ms() > timer) + break; + } + + // Reset touchscreen module. + touch_sys_reset(); + + return res; +} + int touch_sense_enable() { // Enable auto tuning calibration and multi-touch sensing. @@ -326,9 +366,14 @@ int touch_power_on() u32 btn = btn_wait_timeout(0, BTN_VOL_DOWN | BTN_VOL_UP); if ((btn & BTN_VOL_DOWN) && (btn & BTN_VOL_UP)) - return touch_execute_autotune(); - else - return touch_init(); + { + u8 err[2]; + if (touch_panel_ito_test(err)) + if (!err[0] && !err[1]) + return touch_execute_autotune(); + } + + return touch_init(); } void touch_power_off() diff --git a/nyx/nyx_gui/input/touch.h b/nyx/nyx_gui/input/touch.h index c5513bf..87b6fb2 100644 --- a/nyx/nyx_gui/input/touch.h +++ b/nyx/nyx_gui/input/touch.h @@ -1,5 +1,5 @@ /* - * Touch driver for Nintendo Switch's STM FingerTip S (4cd60d) touch controller + * Touch driver for Nintendo Switch's STM FingerTip S (4CD60D) touch controller * * Copyright (c) 2018 langerhans * Copyright (c) 2018-2020 CTCaer @@ -44,6 +44,7 @@ #define STMFTS_FULL_FORCE_CALIBRATION 0xA2 #define STMFTS_MS_CX_TUNING 0xA3 #define STMFTS_SS_CX_TUNING 0xA4 +#define STMFTS_ITO_CHECK 0xA7 #define STMFTS_RELEASEINFO 0xAA #define STMFTS_WRITE_REG 0xB6 #define STMFTS_AUTO_CALIBRATION 0xC3 @@ -99,6 +100,27 @@ #define STMFTS_DATA_MAX_SIZE (STMFTS_EVENT_SIZE * STMFTS_STACK_DEPTH) #define STMFTS_MAX_FINGERS 10 +typedef enum _touch_ito_error { + ITO_NO_ERROR = 0, + ITO_FORCE_OPEN, + ITO_SENSE_OPEN, + ITO_FORCE_SHRT_GND, + ITO_SENSE_SHRT_GND, + ITO_FORCE_SHRT_VCM, + ITO_SENSE_SHRT_VCM, + ITO_FORCE_SHRT_FORCE, + ITO_SENSE_SHRT_SENSE, + ITO_F2E_SENSE, + ITO_FPC_FORCE_OPEN, + ITO_FPC_SENSE_OPEN, + ITO_KEY_FORCE_OPEN, + ITO_KEY_SENSE_OPEN, + ITO_RESERVED0, + ITO_RESERVED1, + ITO_RESERVED2, + ITO_MAX_ERR_REACHED = 0xFF +} touch_ito_error; + typedef struct _touch_event { u8 raw[8]; u16 type; // Event type. @@ -126,7 +148,9 @@ void touch_poll(touch_event *event); touch_event touch_poll_wait(); int touch_get_fw_info(touch_fw_info_t *fw); touch_info touch_get_info(); +int touch_panel_ito_test(u8 *err); int touch_execute_autotune(); +int touch_sense_enable(); int touch_power_on(); void touch_power_off();