[TOC]
ADC is used to measure VBUS, temperature and other values depending on a board.
The CONFIG_ADC
option enables ADC support in the Zephyr EC application.
Use the CONFIG_ADC_SHELL
option to enable ADC related shell commands.
Refer to Kconfig.adc for all sub-options related to ADC support that are specific to the Zephyr EC application.
The EC chip disables all Analog-to-Digital Converters by default. Enable ADC
used on your design by changing the chip-specific ADC status
property to
"okay"
.
ADC properties:
Property | Description | Settings |
---|---|---|
status |
Enables or disables the ADC module | "okay" "disabled" |
label |
Override the EC chip specific label. | "ADC_<number>" |
Either Nuvoton NPCX and ITE IT8xxx2 ECs use single a devicetree node adc0
to
describe ADC, but it supports multiple ADC channels.
To enable the ADC set the status
property to "okay"
:
&adc0 {
status = "okay";
};
The legacy ADC API for the Chromium EC application uses an enumeration (e.g.
ADC_VBUS
, ADC_AMON_BMON
) to specify the ADC channel to measure voltage.
The named-adc-channels
node creates the mapping between the legacy ADC channels
enumeration and the Zephyr ADC driver's channel_id.
named-adc-channels {
compatible = "named-adc-channels";
vbus {
enum-name = "ADC_VBUS";
io-channels = <&adc0 1>;
/* Measure VBUS through a 1/10 voltage divider */
mul = <10>;
};
};
Refer to the named-adc.yaml child-binding file for details about each property.
None required.
ADC support does not enable any threads.
Unfortunately, the are two adc
console commands: a Zephyr command
and the one implemented in CrosEC.
Only one of them can be enabled with CONFIG_ADC_SHELL
or
CONFIG_PLATFORM_EC_ADC_CMD
respectively.
The Zephyr adc
includes the following subcommands:
Subcommand | Description | Usage |
---|---|---|
acq_time |
Configure acquisition time | adc <adc_label> acq_time <time> <unit> |
channel |
Configure ADC channel | adc <adc_label> channel id <channel_id> |
gain |
Configure gain | adc <adc_label> gain <gain> |
print |
Print current configuration | adc <adc_label> print |
read |
Read adc value | adc <adc_label> read <channel> |
reference |
Configure reference | adc <adc_label> reference <reference> |
resolution |
Configure resolution for the read subcommand |
adc <adc_label> resolution <resolution> |
Parameters summary:
Parameter | Description |
---|---|
<adc_label> |
The ADC label property. By default, this is specified by the EC vendor in the respective devicetree include file unless you override the label in your devicetree. |
<time> |
For the acq_time subcommand, specifies the time of acquisition. |
<unit> |
For the acq_time subcommand, specifies the unit of the time of acquisition: us , ns , ticks . |
<channel_id> |
For the channel subcommand, specifies the channel ID. |
<gain> |
For the gain subcommand, specifies the gain of the ADC measurement, e.g. GAIN_1_6 , GAIN_2 , GAIN_64 . |
<channel> |
ADC channel. |
<reference> |
For the reference subcommand, specifies the reference for the ADC measurement, e.g. VDD_1 , INTERNAL . |
<resolution> |
For the resolution subcommand, specifies the resolution for the ADC conversion for the read subcommand. |
E.g.
21-12-22 13:51:11.380 uart:~$ adc ADC_0 read 5
adc ADC_0 read 5
21-12-22 13:51:26.031 read: 1023
The CrosEC shell command adc
displays current ADC measurements, e.g.
21-12-21 09:58:03.746 uart:~$ adc
adc
21-12-21 09:58:05.322 ADC_VBUS = 14850 mV
21-12-21 09:58:05.325 ADC_AMON_BMON = 37111 mV
21-12-21 09:58:05.325 ADC_PSYS = 8432000 mV
The image below shows the ADC wiring for the Volteer reference board.
The Volteer board uses Nuvoton NPCX EC that has one Analog-to-Digital Converter
adc0
, so enable it:
&adc0 {
status = "okay";
};
The board has four temperature sensors handled with ADC. Map legacy cros-ec enums to ADC channels with the following values:
ADC Enumeration Name | Volteer ADC channel |
---|---|
ADC_TEMP_SENSOR_CHARGER |
ADC0 |
ADC_TEMP_SENSOR_PP3300_REGULATOR |
ADC1 |
ADC_TEMP_SENSOR_DDR_SOC |
ADC8 |
ADC_TEMP_SENSOR_FAN |
ADC3 |
The Volteer project establishes this map using the named-adc-channels
as shown
below:
named-adc-channels {
compatible = "named-adc-channels";
adc_charger: charger {
enum-name = "ADC_TEMP_SENSOR_CHARGER";
io-channels = <&adc0 0>;
};
adc_pp3300_regulator: pp3300_regulator {
enum-name = "ADC_TEMP_SENSOR_PP3300_REGULATOR";
io-channels = <&adc0 1>;
};
adc_ddr_soc: ddr_soc {
enum-name = "ADC_TEMP_SENSOR_DDR_SOC";
io-channels = <&adc0 8>;
};
adc_fan: fan {
enum-name = "ADC_TEMP_SENSOR_FAN";
io-channels = <&adc0 3>;
};
};