summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVic Yang <victoryang@chromium.org>2014-05-28 10:25:11 -0700
committerchrome-internal-fetch <chrome-internal-fetch@google.com>2014-05-28 21:19:35 +0000
commit04c18e1e82ecfeded615ac8cee3b6b57184d9e23 (patch)
treea7683da8721d8a984bf0caa243704c34d45e744b
parent56e0e67abe77d161d0b90dbecf7d42ecafdfb43b (diff)
downloadchrome-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.c24
-rw-r--r--board/keyborg/touch_scan.h1
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