Zephyr Project API  3.1.0
A Scalable Open Source RTOS
adc.h
Go to the documentation of this file.
1
6/*
7 * Copyright (c) 2018 Nordic Semiconductor ASA
8 * Copyright (c) 2015 Intel Corporation
9 *
10 * SPDX-License-Identifier: Apache-2.0
11 */
12
13#ifndef ZEPHYR_INCLUDE_DRIVERS_ADC_H_
14#define ZEPHYR_INCLUDE_DRIVERS_ADC_H_
15
16#include <zephyr/device.h>
18
19#ifdef __cplusplus
20extern "C" {
21#endif
22
52};
53
71 int32_t *value);
72
82};
83
90
93
104
128
131
132#ifdef CONFIG_ADC_CONFIGURABLE_INPUTS
138 uint8_t input_positive;
139
145 uint8_t input_negative;
146#endif /* CONFIG_ADC_CONFIGURABLE_INPUTS */
147};
148
213#define ADC_CHANNEL_CFG_DT(node_id) { \
214 .channel_id = DT_REG_ADDR(node_id), \
215 .gain = DT_STRING_TOKEN(node_id, zephyr_gain), \
216 .reference = DT_STRING_TOKEN(node_id, zephyr_reference), \
217 .acquisition_time = DT_PROP(node_id, zephyr_acquisition_time), \
218IF_ENABLED(CONFIG_ADC_CONFIGURABLE_INPUTS, \
219 (COND_CODE_1(DT_NODE_HAS_PROP(node_id, zephyr_input_negative), \
220 (.differential = true, \
221 .input_positive = DT_PROP(node_id, zephyr_input_positive), \
222 .input_negative = DT_PROP(node_id, zephyr_input_negative),), \
223 (.input_positive = DT_PROP(node_id, zephyr_input_positive),)))) \
224}
225
237 const struct device *dev;
238
241
248
255
263
270
277};
278
281#define ADC_DT_SPEC_STRUCT(ctlr, input) { \
282 .dev = DEVICE_DT_GET(ctlr), \
283 .channel_id = input, \
284 ADC_CHANNEL_CFG_FROM_DT_NODE( \
285 DT_CHILD(ctlr, UTIL_CAT(channel_, input))) \
286 }
287
288#define ADC_CHANNEL_CFG_FROM_DT_NODE(node_id) \
289 IF_ENABLED(DT_NODE_EXISTS(node_id), \
290 (.channel_cfg_dt_node_exists = true, \
291 .channel_cfg = ADC_CHANNEL_CFG_DT(node_id), \
292 .vref_mv = DT_PROP_OR(node_id, zephyr_vref_mv, 0), \
293 .resolution = DT_PROP_OR(node_id, zephyr_resolution, 0), \
294 .oversampling = DT_PROP_OR(node_id, zephyr_oversampling, 0),))
295
367#define ADC_DT_SPEC_GET_BY_IDX(node_id, idx) \
368 ADC_DT_SPEC_STRUCT(DT_IO_CHANNELS_CTLR_BY_IDX(node_id, idx), \
369 DT_IO_CHANNELS_INPUT_BY_IDX(node_id, idx))
370
381#define ADC_DT_SPEC_INST_GET_BY_IDX(inst, idx) \
382 ADC_DT_SPEC_GET_BY_IDX(DT_DRV_INST(inst), idx)
383
393#define ADC_DT_SPEC_GET(node_id) ADC_DT_SPEC_GET_BY_IDX(node_id, 0)
394
403#define ADC_DT_SPEC_INST_GET(inst) ADC_DT_SPEC_GET(DT_DRV_INST(inst))
404
428static inline int adc_raw_to_millivolts(int32_t ref_mv,
429 enum adc_gain gain,
430 uint8_t resolution,
431 int32_t *valp)
432{
433 int32_t adc_mv = *valp * ref_mv;
434 int ret = adc_gain_invert(gain, &adc_mv);
435
436 if (ret == 0) {
437 *valp = (adc_mv >> resolution);
438 }
439
440 return ret;
441}
442
443/* Forward declaration of the adc_sequence structure. */
444struct adc_sequence;
445
452
458
461};
462
482typedef enum adc_action (*adc_sequence_callback)(const struct device *dev,
483 const struct adc_sequence *sequence,
484 uint16_t sampling_index);
485
500
506
512
518};
519
529
537
547 void *buffer;
548
556
565
573
583};
584
585
590typedef int (*adc_api_channel_setup)(const struct device *dev,
591 const struct adc_channel_cfg *channel_cfg);
592
597typedef int (*adc_api_read)(const struct device *dev,
598 const struct adc_sequence *sequence);
599
605typedef int (*adc_api_read_async)(const struct device *dev,
606 const struct adc_sequence *sequence,
607 struct k_poll_signal *async);
608
614__subsystem struct adc_driver_api {
617#ifdef CONFIG_ADC_ASYNC
618 adc_api_read_async read_async;
619#endif
621};
622
635__syscall int adc_channel_setup(const struct device *dev,
636 const struct adc_channel_cfg *channel_cfg);
637
638static inline int z_impl_adc_channel_setup(const struct device *dev,
639 const struct adc_channel_cfg *channel_cfg)
640{
641 const struct adc_driver_api *api =
642 (const struct adc_driver_api *)dev->api;
643
644 return api->channel_setup(dev, channel_cfg);
645}
646
668__syscall int adc_read(const struct device *dev,
669 const struct adc_sequence *sequence);
670
671static inline int z_impl_adc_read(const struct device *dev,
672 const struct adc_sequence *sequence)
673{
674 const struct adc_driver_api *api =
675 (const struct adc_driver_api *)dev->api;
676
677 return api->read(dev, sequence);
678}
679
700__syscall int adc_read_async(const struct device *dev,
701 const struct adc_sequence *sequence,
702 struct k_poll_signal *async);
703
704
705#ifdef CONFIG_ADC_ASYNC
706static inline int z_impl_adc_read_async(const struct device *dev,
707 const struct adc_sequence *sequence,
708 struct k_poll_signal *async)
709{
710 const struct adc_driver_api *api =
711 (const struct adc_driver_api *)dev->api;
712
713 return api->read_async(dev, sequence, async);
714}
715#endif /* CONFIG_ADC_ASYNC */
716
726static inline uint16_t adc_ref_internal(const struct device *dev)
727{
728 const struct adc_driver_api *api =
729 (const struct adc_driver_api *)dev->api;
730
731 return api->ref_internal;
732}
733
738#ifdef __cplusplus
739}
740#endif
741
742#include <syscalls/adc.h>
743
744#endif /* ZEPHYR_INCLUDE_DRIVERS_ADC_H_ */
int adc_read_async(const struct device *dev, const struct adc_sequence *sequence, struct k_poll_signal *async)
Set an asynchronous read request.
adc_gain
ADC channel gain factors.
Definition: adc.h:31
int(* adc_api_read)(const struct device *dev, const struct adc_sequence *sequence)
Type definition of ADC API function for setting a read request. See adc_read() for argument descripti...
Definition: adc.h:597
int adc_gain_invert(enum adc_gain gain, int32_t *value)
Invert the application of gain to a measurement value.
int adc_read(const struct device *dev, const struct adc_sequence *sequence)
Set a read request.
int adc_channel_setup(const struct device *dev, const struct adc_channel_cfg *channel_cfg)
Configure an ADC channel.
int(* adc_api_channel_setup)(const struct device *dev, const struct adc_channel_cfg *channel_cfg)
Type definition of ADC API function for configuring a channel. See adc_channel_setup() for argument d...
Definition: adc.h:590
adc_action
Action to be performed after a sampling is done.
Definition: adc.h:449
enum adc_action(* adc_sequence_callback)(const struct device *dev, const struct adc_sequence *sequence, uint16_t sampling_index)
Type definition of the optional callback function to be called after a requested sampling is done.
Definition: adc.h:482
adc_reference
ADC references.
Definition: adc.h:74
int(* adc_api_read_async)(const struct device *dev, const struct adc_sequence *sequence, struct k_poll_signal *async)
Type definition of ADC API function for setting an asynchronous read request. See adc_read_async() fo...
Definition: adc.h:605
static uint16_t adc_ref_internal(const struct device *dev)
Get the internal reference voltage.
Definition: adc.h:726
static int adc_raw_to_millivolts(int32_t ref_mv, enum adc_gain gain, uint8_t resolution, int32_t *valp)
Convert a raw ADC value to millivolts.
Definition: adc.h:428
@ ADC_GAIN_64
Definition: adc.h:50
@ ADC_GAIN_3
Definition: adc.h:42
@ ADC_GAIN_4
Definition: adc.h:43
@ ADC_GAIN_1_5
Definition: adc.h:33
@ ADC_GAIN_128
Definition: adc.h:51
@ ADC_GAIN_1_2
Definition: adc.h:37
@ ADC_GAIN_12
Definition: adc.h:46
@ ADC_GAIN_2_5
Definition: adc.h:36
@ ADC_GAIN_16
Definition: adc.h:47
@ ADC_GAIN_24
Definition: adc.h:48
@ ADC_GAIN_1
Definition: adc.h:40
@ ADC_GAIN_6
Definition: adc.h:44
@ ADC_GAIN_1_6
Definition: adc.h:32
@ ADC_GAIN_32
Definition: adc.h:49
@ ADC_GAIN_2_3
Definition: adc.h:38
@ ADC_GAIN_4_5
Definition: adc.h:39
@ ADC_GAIN_8
Definition: adc.h:45
@ ADC_GAIN_1_3
Definition: adc.h:35
@ ADC_GAIN_1_4
Definition: adc.h:34
@ ADC_GAIN_2
Definition: adc.h:41
@ ADC_ACTION_FINISH
Definition: adc.h:460
@ ADC_ACTION_REPEAT
Definition: adc.h:457
@ ADC_ACTION_CONTINUE
Definition: adc.h:451
@ ADC_REF_INTERNAL
Definition: adc.h:79
@ ADC_REF_EXTERNAL1
Definition: adc.h:81
@ ADC_REF_VDD_1_2
Definition: adc.h:76
@ ADC_REF_VDD_1_3
Definition: adc.h:77
@ ADC_REF_VDD_1_4
Definition: adc.h:78
@ ADC_REF_VDD_1
Definition: adc.h:75
@ ADC_REF_EXTERNAL0
Definition: adc.h:80
static ZTEST_BMEM volatile int ret
Definition: k_float_disable.c:28
__UINT32_TYPE__ uint32_t
Definition: stdint.h:90
__INT32_TYPE__ int32_t
Definition: stdint.h:74
__UINT8_TYPE__ uint8_t
Definition: stdint.h:88
__UINT16_TYPE__ uint16_t
Definition: stdint.h:89
Structure for specifying the configuration of an ADC channel.
Definition: adc.h:87
enum adc_gain gain
Definition: adc.h:89
uint8_t differential
Definition: adc.h:130
uint16_t acquisition_time
Definition: adc.h:103
enum adc_reference reference
Definition: adc.h:92
uint8_t channel_id
Definition: adc.h:127
ADC driver API.
Definition: adc.h:614
adc_api_read read
Definition: adc.h:616
uint16_t ref_internal
Definition: adc.h:620
adc_api_channel_setup channel_setup
Definition: adc.h:615
Container for ADC channel information specified in devicetree.
Definition: adc.h:232
struct adc_channel_cfg channel_cfg
Definition: adc.h:254
uint8_t channel_id
Definition: adc.h:240
uint16_t vref_mv
Definition: adc.h:262
const struct device * dev
Definition: adc.h:237
uint8_t oversampling
Definition: adc.h:276
bool channel_cfg_dt_node_exists
Definition: adc.h:247
uint8_t resolution
Definition: adc.h:269
Structure defining additional options for an ADC sampling sequence.
Definition: adc.h:489
void * user_data
Definition: adc.h:511
uint16_t extra_samplings
Definition: adc.h:517
adc_sequence_callback callback
Definition: adc.h:505
uint32_t interval_us
Definition: adc.h:499
Structure defining an ADC sampling sequence.
Definition: adc.h:523
uint8_t oversampling
Definition: adc.h:572
const struct adc_sequence_options * options
Definition: adc.h:528
uint32_t channels
Definition: adc.h:536
void * buffer
Definition: adc.h:547
bool calibrate
Definition: adc.h:582
size_t buffer_size
Definition: adc.h:555
uint8_t resolution
Definition: adc.h:564
Runtime device structure (in ROM) per driver instance.
Definition: device.h:456
const void * api
Definition: device.h:462
Definition: kernel.h:5459