blob: 2e563f755741c4568ce76a497ed5b297e7d8018c [file] [log] [blame]
/* Copyright 2020 The ChromiumOS Authors
* 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, const 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.");