summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVic (Chun-Ju) Yang <victoryang@chromium.org>2013-12-19 14:44:24 +0800
committerchrome-internal-fetch <chrome-internal-fetch@google.com>2013-12-20 05:07:58 +0000
commitc455d255076f50b217f35115f2591bc5ce5f0c69 (patch)
tree37706a3e649cd9dd1bc23110b5b4ed21f6149cb1
parent9a11fab20e1e55fadcdcb748db02b84f938a68d1 (diff)
downloadchrome-ec-c455d255076f50b217f35115f2591bc5ce5f0c69.tar.gz
Move ADC console command to common
We have three duplicated ADC read console command, and we are about to have the fourth. Let's consolidate them to a single implementation in common/. Note that we have to add a simple implementation of adc_read_all_channels() for LM4. BUG=chrome-os-partner:18343 TEST=Build all boards TEST=Read single channel TEST=Read all channels BRANCH=None Change-Id: I079c0b33ab6b81a188f309cf99875eb02e9d78a4 Signed-off-by: Vic (Chun-Ju) Yang <victoryang@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/180831
-rw-r--r--chip/lm4/adc.c27
-rw-r--r--chip/stm32/adc-stm32f.c18
-rw-r--r--chip/stm32/adc-stm32l.c18
-rw-r--r--common/adc.c57
-rw-r--r--common/build.mk1
5 files changed, 70 insertions, 51 deletions
diff --git a/chip/lm4/adc.c b/chip/lm4/adc.c
index 1e4fdf16c5..19548b12bd 100644
--- a/chip/lm4/adc.c
+++ b/chip/lm4/adc.c
@@ -162,6 +162,18 @@ int adc_read_channel(enum adc_channel ch)
return rv * adc->factor_mul / adc->factor_div + adc->shift;
}
+int adc_read_all_channels(int *data)
+{
+ int i;
+
+ for (i = 0; i < ADC_CH_COUNT; ++i) {
+ data[i] = adc_read_channel(i);
+ if (data[i] == ADC_READ_ERROR)
+ return EC_ERROR_UNKNOWN;
+ }
+ return EC_SUCCESS;
+}
+
/*****************************************************************************/
/* Interrupt handlers */
@@ -206,21 +218,6 @@ DECLARE_CONSOLE_COMMAND(ectemp, command_ectemp,
NULL);
#endif
-static int command_adc(int argc, char **argv)
-{
- int i;
-
- for (i = 0; i < ADC_CH_COUNT; ++i)
- ccprintf("ADC channel \"%s\" = %d\n",
- adc_channels[i].name, adc_read_channel(i));
-
- return EC_SUCCESS;
-}
-DECLARE_CONSOLE_COMMAND(adc, command_adc,
- NULL,
- "Print ADC channels",
- NULL);
-
/*****************************************************************************/
/* Initialization */
diff --git a/chip/stm32/adc-stm32f.c b/chip/stm32/adc-stm32f.c
index 22d909a339..e2053e331b 100644
--- a/chip/stm32/adc-stm32f.c
+++ b/chip/stm32/adc-stm32f.c
@@ -289,21 +289,3 @@ static void adc_init(void)
STM32_ADC_SMPR2 = 0x12492492;
}
DECLARE_HOOK(HOOK_INIT, adc_init, HOOK_PRIO_DEFAULT);
-
-static int command_adc(int argc, char **argv)
-{
- int i;
- int data[ADC_CH_COUNT];
-
- if (adc_read_all_channels(data))
- return EC_ERROR_UNKNOWN;
- for (i = 0; i < ADC_CH_COUNT; ++i)
- ccprintf("ADC channel \"%s\" = %d\n",
- adc_channels[i].name, data[i]);
-
- return EC_SUCCESS;
-}
-DECLARE_CONSOLE_COMMAND(adc, command_adc,
- NULL,
- "Print ADC channels",
- NULL);
diff --git a/chip/stm32/adc-stm32l.c b/chip/stm32/adc-stm32l.c
index 75b640fde1..3e8edde278 100644
--- a/chip/stm32/adc-stm32l.c
+++ b/chip/stm32/adc-stm32l.c
@@ -211,21 +211,3 @@ exit_all_channels:
return ret;
}
-
-static int command_adc(int argc, char **argv)
-{
- int i;
- int data[ADC_CH_COUNT];
-
- if (adc_read_all_channels(data))
- return EC_ERROR_UNKNOWN;
- for (i = 0; i < ADC_CH_COUNT; ++i)
- ccprintf("ADC channel \"%s\" = %d\n",
- adc_channels[i].name, data[i]);
-
- return EC_SUCCESS;
-}
-DECLARE_CONSOLE_COMMAND(adc, command_adc,
- NULL,
- "Print ADC channels",
- NULL);
diff --git a/common/adc.c b/common/adc.c
new file mode 100644
index 0000000000..696b017788
--- /dev/null
+++ b/common/adc.c
@@ -0,0 +1,57 @@
+/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+/* ADC module for Chrome EC */
+
+#include "adc.h"
+#include "adc_chip.h"
+#include "common.h"
+#include "console.h"
+#include "util.h"
+
+static enum adc_channel find_adc_channel_by_name(const char *name)
+{
+ const struct adc_t *ch = adc_channels;
+ int i;
+
+ if (!name || !*name)
+ return ADC_CH_COUNT;
+
+ for (i = 0; i < ADC_CH_COUNT; i++, ch++) {
+ if (!strcasecmp(name, ch->name))
+ return i;
+ }
+
+ return ADC_CH_COUNT;
+}
+
+static int command_adc(int argc, char **argv)
+{
+ int i, v;
+ int data[ADC_CH_COUNT];
+
+ /* If a channel is specified, read only that one */
+ if (argc == 2) {
+ i = find_adc_channel_by_name(argv[1]);
+ if (i == ADC_CH_COUNT)
+ return EC_ERROR_PARAM1;
+ v = adc_read_channel(i);
+ if (v == ADC_READ_ERROR)
+ return EC_ERROR_UNKNOWN;
+ ccprintf(" %s = %d\n", adc_channels[i].name, v);
+ return EC_SUCCESS;
+ } else {
+ /* Otherwise print them all */
+ if (adc_read_all_channels(data))
+ return EC_ERROR_UNKNOWN;
+ for (i = 0; i < ADC_CH_COUNT; ++i)
+ ccprintf(" %s = %d\n", adc_channels[i].name, data[i]);
+ return EC_SUCCESS;
+ }
+}
+DECLARE_CONSOLE_COMMAND(adc, command_adc,
+ "[name]",
+ "Print ADC channel(s)",
+ NULL);
diff --git a/common/build.mk b/common/build.mk
index 9e4b6c7fa3..b1ac341891 100644
--- a/common/build.mk
+++ b/common/build.mk
@@ -10,6 +10,7 @@ common-y=main.o util.o console_output.o uart_buffering.o
common-y+=memory_commands.o shared_mem.o system.o hooks.o
common-y+=gpio.o version.o printf.o queue.o
+common-$(CONFIG_ADC)+=adc.o
common-$(CONFIG_ALS)+=als.o
common-$(CONFIG_AP_HANG_DETECT)+=ap_hang_detect.o
common-$(CONFIG_BACKLIGHT_LID)+=backlight_lid.o