diff options
author | Vic Yang <victoryang@chromium.org> | 2014-05-28 10:25:11 -0700 |
---|---|---|
committer | chrome-internal-fetch <chrome-internal-fetch@google.com> | 2014-05-28 21:19:35 +0000 |
commit | 04c18e1e82ecfeded615ac8cee3b6b57184d9e23 (patch) | |
tree | a7683da8721d8a984bf0caa243704c34d45e744b | |
parent | 56e0e67abe77d161d0b90dbecf7d42ecafdfb43b (diff) | |
download | chrome-ec-04c18e1e82ecfeded615ac8cee3b6b57184d9e23.tar.gz |
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 <victoryang@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/201804
Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
-rw-r--r-- | board/keyborg/touch_scan.c | 24 | ||||
-rw-r--r-- | 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 |