diff options
Diffstat (limited to 'chip/it83xx/dac.c')
-rw-r--r-- | chip/it83xx/dac.c | 90 |
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."); |