From 04c18e1e82ecfeded615ac8cee3b6b57184d9e23 Mon Sep 17 00:00:00 2001 From: Vic Yang Date: Wed, 28 May 2014 10:25:11 -0700 Subject: Keyborg: handle ADC overflow Previously we assumed the ADC reading wouldn't overflow, which is apparently wrong. This CL handles the overflow case. BUG=None TEST=Touch the keyboard. Still see sane heat map. BRANCH=None Change-Id: Iab5372915319d6a0ef76799f9b5fe821af5a9ca5 Signed-off-by: Vic Yang Reviewed-on: https://chromium-review.googlesource.com/201804 Reviewed-by: Vincent Palatin --- board/keyborg/touch_scan.c | 24 ++++++++++++++---------- board/keyborg/touch_scan.h | 1 - 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/board/keyborg/touch_scan.c b/board/keyborg/touch_scan.c index 2a953258ae..5e4044215b 100644 --- a/board/keyborg/touch_scan.c +++ b/board/keyborg/touch_scan.c @@ -98,17 +98,21 @@ static void start_adc_sample(int id, int wait_cycle) " bne 1b\n" :: "r"(wait_cycle / 3)); } -#if ADC_SMPL_CYCLE_2 < ADC_QUNTZ_CYCLE_2 -static uint16_t flush_adc(int id) +static inline uint8_t flush_adc(int id) { + uint16_t v; + +#if ADC_SMPL_CYCLE_2 < ADC_QUNTZ_CYCLE_2 while (!(STM32_ADC_SR(id) & (1 << 1))) ; - return STM32_ADC_DR(id); -} -#else -#define flush_adc(x) STM32_ADC_DR(x) #endif + v = STM32_ADC_DR(id) >> ADC_WINDOW_POS; + if (v > 255) + v = 255; + return v; +} + static void enable_col(int idx, int enabled) { if (enabled) { @@ -151,7 +155,7 @@ int fast_scan(uint32_t *data) start_adc_sample(0, ADC_SMPL_CPU_CYCLE); while (!(STM32_ADC_SR(0) & (1 << 1))) ; - if (ADC_DATA_WINDOW(flush_adc(0)) >= COL_THRESHOLD) + if (flush_adc(0) >= COL_THRESHOLD) set_scan_needed(col); if (master_slave_sync(5) != EC_SUCCESS) @@ -176,17 +180,17 @@ void scan_column(uint8_t *data) start_adc_sample(1, ADC_SMPL_CPU_CYCLE); for (i = 2; i < ROW_COUNT; ++i) { - data[i - 2] = ADC_DATA_WINDOW(flush_adc(i & 1)); + data[i - 2] = flush_adc(i & 1); STM32_PMSE_MRCR = mrcr_list[i]; start_adc_sample(i & 1, ADC_SMPL_CPU_CYCLE); } while (!(STM32_ADC_SR(ROW_COUNT & 1) & (1 << 1))) ; - data[ROW_COUNT - 2] = ADC_DATA_WINDOW(flush_adc(ROW_COUNT & 1)); + data[ROW_COUNT - 2] = flush_adc(ROW_COUNT & 1); while (!(STM32_ADC_SR((ROW_COUNT & 1) ^ 1) & (1 << 1))) ; - data[ROW_COUNT - 1] = ADC_DATA_WINDOW(flush_adc((ROW_COUNT & 1) ^ 1)); + data[ROW_COUNT - 1] = flush_adc((ROW_COUNT & 1) ^ 1); } void touch_scan_slave_start(void) diff --git a/board/keyborg/touch_scan.h b/board/keyborg/touch_scan.h index 2d05ce486b..b2d23023fa 100644 --- a/board/keyborg/touch_scan.h +++ b/board/keyborg/touch_scan.h @@ -16,7 +16,6 @@ enum pin_type { /* 8-bit window */ #define ADC_WINDOW_POS 2 -#define ADC_DATA_WINDOW(x) ((x) >> ADC_WINDOW_POS) /* Threshold for each cell */ #define THRESHOLD 35 -- cgit v1.2.1