summaryrefslogtreecommitdiff
path: root/chip/it83xx/dac.c
diff options
context:
space:
mode:
Diffstat (limited to 'chip/it83xx/dac.c')
-rw-r--r--chip/it83xx/dac.c90
1 files changed, 90 insertions, 0 deletions
diff --git a/chip/it83xx/dac.c b/chip/it83xx/dac.c
new file mode 100644
index 0000000000..695d1cbc68
--- /dev/null
+++ b/chip/it83xx/dac.c
@@ -0,0 +1,90 @@
+/* Copyright 2020 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.
+ */
+
+/* IT83xx DAC module for Chrome EC */
+
+#include "console.h"
+#include "dac_chip.h"
+#include "gpio.h"
+#include "hooks.h"
+#include "registers.h"
+#include "util.h"
+
+/* DAC module enable */
+void dac_enable_channel(enum chip_dac_channel ch)
+{
+ IT83XX_DAC_DACPDREG &= ~IT83XX_DAC_POWDN(ch);
+}
+
+/* DAC module disable */
+void dac_disable_channel(enum chip_dac_channel ch)
+{
+ IT83XX_DAC_DACPDREG |= IT83XX_DAC_POWDN(ch);
+}
+
+/* Set DAC output voltage */
+void dac_set_output_voltage(enum chip_dac_channel ch, int mv)
+{
+ IT83XX_DAC_DACDAT(ch) = mv * DAC_RAW_DATA / DAC_AVCC;
+}
+
+/* Get DAC output voltage */
+int dac_get_output_voltage(enum chip_dac_channel ch)
+{
+ return IT83XX_DAC_DACDAT(ch) * DAC_AVCC / DAC_RAW_DATA;
+}
+
+/* DAC module Initialization */
+static void dac_init(void)
+{
+ /* Configure GPIOs */
+ gpio_config_module(MODULE_DAC, 1);
+}
+DECLARE_HOOK(HOOK_INIT, dac_init, HOOK_PRIO_INIT_DAC);
+
+static int command_dac(int argc, char **argv)
+{
+ char *e;
+ int ch, mv, rv;
+
+ if (argc < 2)
+ return EC_ERROR_PARAM_COUNT;
+
+ ch = strtoi(argv[1], &e, 0);
+ if (*e)
+ return EC_ERROR_PARAM1;
+ if (ch < 2 || ch > 5) {
+ ccprintf("ch%d is not supported\n", ch);
+ return EC_ERROR_PARAM1;
+ }
+
+ if (argc == 2) {
+ if (!(IT83XX_DAC_DACPDREG & IT83XX_DAC_POWDN(ch))) {
+ /* Get DAC output voltage */
+ rv = dac_get_output_voltage(ch);
+ ccprintf("DAC ch%d VOLT=%dmV\n", ch, rv);
+ } else
+ ccprintf("The DAC ch%d is powered down.\n", ch);
+ } else {
+ /*
+ * DAC data register raw data
+ * 0 ~ 0xFF(8-bit) = voltage 0 ~ 3300mV
+ */
+ mv = strtoi(argv[2], &e, 0);
+ if (*e)
+ return EC_ERROR_PARAM2;
+ if (mv) {
+ /* Set DAC output voltage */
+ dac_set_output_voltage(ch, mv);
+ dac_enable_channel(ch);
+ } else
+ dac_disable_channel(ch);
+ }
+
+ return EC_SUCCESS;
+}
+DECLARE_CONSOLE_COMMAND(dac, command_dac,
+ "[ch2-5] [0-3300mV]",
+ "Enable or disable(0mV) DAC output voltage.");