diff options
author | Super Liu <supercjliu@google.com> | 2022-06-28 10:45:25 +0800 |
---|---|---|
committer | Super Liu <supercjliu@google.com> | 2022-06-28 14:18:49 +0800 |
commit | ed6f1478cc09f73cb2df0e295309f3b5bec09c74 (patch) | |
tree | aed503515000c92131c96612c3e72277dc84cf76 | |
parent | 187b2287ad5f6ee3af58fd701c93a1d202b75647 (diff) | |
download | sec_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.c | 62 | ||||
-rw-r--r-- | sec_ts.h | 15 | ||||
-rw-r--r-- | sec_ts_fn.c | 1 |
3 files changed, 78 insertions, 0 deletions
@@ -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); } @@ -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 { |