summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSuper Liu <supercjliu@google.com>2022-06-28 10:45:25 +0800
committerSuper Liu <supercjliu@google.com>2022-06-28 14:18:49 +0800
commited6f1478cc09f73cb2df0e295309f3b5bec09c74 (patch)
treeaed503515000c92131c96612c3e72277dc84cf76
parent187b2287ad5f6ee3af58fd701c93a1d202b75647 (diff)
downloadsec_touch-ed6f1478cc09f73cb2df0e295309f3b5bec09c74.tar.gz
touch/sec: add debug logs for interrupt, coords and status.android-t-qpr1-beta-1_r0.4android-gs-bluejay-5.10-android13-qpr1-beta
Test: check the touch logs. [sec_input] dump-int: #265(6.130): S#21(+) C#249(0x1). [sec_input] dump-int: #266(6.129): S#21 C#250(0x1)(+). [sec_input] dump-int: #267(6.121): S#21 C#251(0x0)(+). [sec_input] dump-int: #268(5.187): S#22(+) C#251(0x0). [sec_input] dump: #0: 20.284(0.37) D(0, 0). [sec_input] dump: #0: 18.897(0.124) D(0, 0). [sec_input] dump: #0: 7.302(0.389) D(-27, 148). [sec_input] dump: #0: 6.142(0.21) D(0, 0). [sec_input] dump: i/o 0, comm 0, reset 0, longest 0.389. [sec_input] dump: cnt 2, active 0, wet 0, palm 1. Bug: 228079210 Signed-off-by: Super Liu <supercjliu@google.com> Change-Id: I542b0b65033a98474262b4601f841ec43ef7ea35
-rw-r--r--sec_ts.c62
-rw-r--r--sec_ts.h15
-rw-r--r--sec_ts_fn.c1
3 files changed, 78 insertions, 0 deletions
diff --git a/sec_ts.c b/sec_ts.c
index 3a2157a..6e7e1ab 100644
--- a/sec_ts.c
+++ b/sec_ts.c
@@ -15,6 +15,10 @@ struct sec_ts_data *tsp_info;
#include "sec_ts.h"
#include <samsung/exynos_drm_connector.h>
+/* init the kfifo for health check. */
+#define SEC_TS_HC_KFIFO_LEN 4 /* must be power of 2. */
+DEFINE_KFIFO(hc_fifo, struct sec_ts_health_check, SEC_TS_HC_KFIFO_LEN);
+
/* init the kfifo for debug used. */
#define SEC_TS_DEBUG_KFIFO_LEN 4 /* must be power of 2. */
DEFINE_KFIFO(debug_fifo, struct sec_ts_coordinate, SEC_TS_DEBUG_KFIFO_LEN);
@@ -1856,6 +1860,55 @@ static void sec_ts_handle_lib_status_event(struct sec_ts_data *ts,
}
#endif
+
+#ifdef SEC_TS_HC_KFIFO_LEN
+inline void sec_ts_hc_update_and_push(struct sec_ts_data *ts, struct sec_ts_health_check *hc)
+{
+ hc->int_ktime = ts->timestamp;
+ hc->int_idx = ts->int_cnt;
+ hc->coord_idx = ts->coord_event_cnt;
+ hc->status_idx = ts->status_event_cnt;
+ hc->active_bit = ts->tid_touch_state;
+
+ if (kfifo_is_full(&hc_fifo))
+ kfifo_skip(&hc_fifo);
+ kfifo_in(&hc_fifo, hc, 1);
+}
+
+inline void sec_ts_hc_dump(struct sec_ts_data *ts)
+{
+ int i;
+ s64 delta;
+ s64 sec_delta;
+ u32 ms_delta;
+ ktime_t current_time = ktime_get();
+ struct sec_ts_health_check last_hc[SEC_TS_HC_KFIFO_LEN];
+
+ kfifo_out_peek(&hc_fifo, last_hc, kfifo_size(&hc_fifo));
+ for (i = 0 ; i < ARRAY_SIZE(last_hc) ; i++) {
+ sec_delta = 0;
+ ms_delta = 0;
+ delta = ktime_ms_delta(current_time, last_hc[i].int_ktime);
+ if (delta > 0)
+ sec_delta = div_u64_rem(delta, MSEC_PER_SEC, &ms_delta);
+
+ input_info(true, &ts->client->dev,
+ "dump-int: #%llu(%llu.%u): S#%llu%s C#%llu(0x%lx)%s.\n",
+ last_hc[i].int_idx,
+ sec_delta, ms_delta,
+ last_hc[i].status_idx,
+ (last_hc[i].status_updated) ? "(+)" : " ",
+ last_hc[i].coord_idx,
+ last_hc[i].active_bit,
+ (last_hc[i].coord_updated) ? "(+)" : ""
+ );
+ }
+}
+#else
+#define sec_ts_hc_update_and_push(ts, hc) do {} while (0)
+#define sec_ts_hc_dump(ts) do {} while (0)
+#endif /* #ifdef SEC_TS_HC_KFIFO_LEN */
+
#ifdef SEC_TS_DEBUG_KFIFO_LEN
inline void sec_ts_kfifo_push_coord(struct sec_ts_data *ts, u8 slot)
{
@@ -3032,6 +3085,7 @@ static void sec_ts_read_event(struct sec_ts_data *ts)
#if IS_ENABLED(CONFIG_TOUCHSCREEN_OFFLOAD)
struct touch_offload_frame *frame = NULL;
#endif
+ struct sec_ts_health_check hc[1] = {0};
if (ts->power_status == SEC_TS_STATE_LPM) {
@@ -3127,6 +3181,8 @@ static void sec_ts_read_event(struct sec_ts_data *ts)
switch (event_id) {
case SEC_TS_STATUS_EVENT:
+ hc->status_updated = true;
+ ts->status_event_cnt++;
p_event_status =
(struct sec_ts_event_status *)event_buff;
@@ -3216,6 +3272,8 @@ static void sec_ts_read_event(struct sec_ts_data *ts)
break;
case SEC_TS_COORDINATE_EVENT:
+ hc->coord_updated = true;
+ ts->coord_event_cnt++;
processed_pointer_event = true;
mutex_lock(&ts->eventlock);
sec_ts_handle_coord_event(ts,
@@ -3336,6 +3394,9 @@ static void sec_ts_read_event(struct sec_ts_data *ts)
if (!ts->offload.offload_running)
update_motion_filter(ts, ts->tid_touch_state);
#endif
+
+ /* Update the health check info. */
+ sec_ts_hc_update_and_push(ts, hc);
}
static irqreturn_t sec_ts_isr(int irq, void *handle)
@@ -5700,6 +5761,7 @@ static void sec_ts_suspend_work(struct work_struct *work)
#endif
mutex_unlock(&ts->device_mutex);
+ sec_ts_hc_dump(ts);
sec_ts_debug_dump(ts);
}
diff --git a/sec_ts.h b/sec_ts.h
index ced1fba..fe2efe8 100644
--- a/sec_ts.h
+++ b/sec_ts.h
@@ -883,6 +883,18 @@ struct sec_ts_coordinate {
ktime_t ktime_released;
};
+struct sec_ts_health_check {
+ ktime_t int_ktime;
+ u64 int_idx;
+ u64 coord_idx;
+ u64 status_idx;
+ /* Slot active bit from FW. */
+ unsigned long active_bit;
+ /* Check whether have coord, status or unknown event. */
+ bool coord_updated;
+ bool status_updated;
+};
+
struct sec_ts_data {
u32 isr_pin;
@@ -1137,6 +1149,8 @@ struct sec_ts_data {
ktime_t bugreport_ktime_start;
ktime_t ktime_resume;
u64 int_cnt;
+ u64 coord_event_cnt;
+ u64 status_event_cnt;
int (*sec_ts_write)(struct sec_ts_data *ts, u8 reg,
u8 *data, int len);
@@ -1224,6 +1238,7 @@ struct sec_ts_plat_data {
u8 mm2px;
};
+void sec_ts_hc_dump(struct sec_ts_data *ts);
void sec_ts_debug_dump(struct sec_ts_data *ts);
int sec_ts_stop_device(struct sec_ts_data *ts);
int sec_ts_start_device(struct sec_ts_data *ts);
diff --git a/sec_ts_fn.c b/sec_ts_fn.c
index 1a07174..b7818c1 100644
--- a/sec_ts_fn.c
+++ b/sec_ts_fn.c
@@ -8109,6 +8109,7 @@ static void force_touch_active(void *device_data)
bus_ref = SEC_TS_BUS_REF_BUGREPORT;
active = (sec->cmd_param[1]) ? true : false;
if (active) {
+ sec_ts_hc_dump(ts);
sec_ts_debug_dump(ts);
ts->bugreport_ktime_start = ktime_get();
} else {