1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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.");
|