123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485 |
- #ifndef ZEPHYR_INCLUDE_DRIVERS_ADC_H_
- #define ZEPHYR_INCLUDE_DRIVERS_ADC_H_
- #include <device.h>
- #ifdef __cplusplus
- extern "C" {
- #endif
- enum adc_gain {
- ADC_GAIN_1_6,
- ADC_GAIN_1_5,
- ADC_GAIN_1_4,
- ADC_GAIN_1_3,
- ADC_GAIN_1_2,
- ADC_GAIN_2_3,
- ADC_GAIN_1,
- ADC_GAIN_2,
- ADC_GAIN_3,
- ADC_GAIN_4,
- ADC_GAIN_6,
- ADC_GAIN_8,
- ADC_GAIN_12,
- ADC_GAIN_16,
- ADC_GAIN_24,
- ADC_GAIN_32,
- ADC_GAIN_64,
- ADC_GAIN_128,
- };
- int adc_gain_invert(enum adc_gain gain,
- int32_t *value);
- enum adc_reference {
- ADC_REF_VDD_1,
- ADC_REF_VDD_1_2,
- ADC_REF_VDD_1_3,
- ADC_REF_VDD_1_4,
- ADC_REF_INTERNAL,
- ADC_REF_EXTERNAL0,
- ADC_REF_EXTERNAL1,
- };
- struct adc_channel_cfg {
-
- enum adc_gain gain;
-
- enum adc_reference reference;
-
- uint16_t acquisition_time;
-
- uint8_t channel_id : 5;
-
- uint8_t differential : 1;
- #ifdef CONFIG_ADC_CONFIGURABLE_INPUTS
-
- uint8_t input_positive;
-
- uint8_t input_negative;
- #endif
- };
- static inline int adc_raw_to_millivolts(int32_t ref_mv,
- enum adc_gain gain,
- uint8_t resolution,
- int32_t *valp)
- {
- int32_t adc_mv = *valp * ref_mv;
- int ret = adc_gain_invert(gain, &adc_mv);
- if (ret == 0) {
- *valp = (adc_mv >> resolution);
- }
- return ret;
- }
- struct adc_sequence;
- enum adc_action {
-
- ADC_ACTION_CONTINUE = 0,
-
- ADC_ACTION_REPEAT,
-
- ADC_ACTION_FINISH,
- };
- typedef enum adc_action (*adc_sequence_callback)(const struct device *dev,
- const struct adc_sequence *sequence,
- uint16_t sampling_index);
- struct adc_sequence_options {
-
- uint32_t interval_us;
-
- adc_sequence_callback callback;
-
- void *user_data;
-
- uint16_t extra_samplings;
- };
- struct adc_sequence {
-
- const struct adc_sequence_options *options;
-
- uint32_t channels;
-
- void *buffer;
-
- size_t buffer_size;
-
- uint8_t resolution;
-
- uint8_t oversampling;
-
- bool calibrate;
- };
- typedef int (*adc_api_channel_setup)(const struct device *dev,
- const struct adc_channel_cfg *channel_cfg);
- typedef int (*adc_api_read)(const struct device *dev,
- const struct adc_sequence *sequence);
- typedef int (*adc_api_read_async)(const struct device *dev,
- const struct adc_sequence *sequence,
- struct k_poll_signal *async);
- __subsystem struct adc_driver_api {
- adc_api_channel_setup channel_setup;
- adc_api_read read;
- #ifdef CONFIG_ADC_ASYNC
- adc_api_read_async read_async;
- #endif
- uint16_t ref_internal;
- };
- __syscall int adc_channel_setup(const struct device *dev,
- const struct adc_channel_cfg *channel_cfg);
- static inline int z_impl_adc_channel_setup(const struct device *dev,
- const struct adc_channel_cfg *channel_cfg)
- {
- const struct adc_driver_api *api =
- (const struct adc_driver_api *)dev->api;
- return api->channel_setup(dev, channel_cfg);
- }
- __syscall int adc_read(const struct device *dev,
- const struct adc_sequence *sequence);
- static inline int z_impl_adc_read(const struct device *dev,
- const struct adc_sequence *sequence)
- {
- const struct adc_driver_api *api =
- (const struct adc_driver_api *)dev->api;
- return api->read(dev, sequence);
- }
- __syscall int adc_read_async(const struct device *dev,
- const struct adc_sequence *sequence,
- struct k_poll_signal *async);
- #ifdef CONFIG_ADC_ASYNC
- static inline int z_impl_adc_read_async(const struct device *dev,
- const struct adc_sequence *sequence,
- struct k_poll_signal *async)
- {
- const struct adc_driver_api *api =
- (const struct adc_driver_api *)dev->api;
- return api->read_async(dev, sequence, async);
- }
- #endif
- static inline uint16_t adc_ref_internal(const struct device *dev)
- {
- const struct adc_driver_api *api =
- (const struct adc_driver_api *)dev->api;
- return api->ref_internal;
- }
- #ifdef __cplusplus
- }
- #endif
- #include <syscalls/adc.h>
- #endif
|