/* * Copyright (c) 2020 Libre Solar Technologies GmbH * * SPDX-License-Identifier: Apache-2.0 */ /** * @file * @brief DAC public API header file. */ #ifndef ZEPHYR_INCLUDE_DRIVERS_DAC_H_ #define ZEPHYR_INCLUDE_DRIVERS_DAC_H_ #include #ifdef __cplusplus extern "C" { #endif /** * @brief DAC driver APIs * @defgroup dac_interface DAC driver APIs * @ingroup io_interfaces * @{ */ /** * @struct dac_channel_cfg * @brief Structure for specifying the configuration of a DAC channel. * * @param channel_id Channel identifier of the DAC that should be configured. * @param resolution Desired resolution of the DAC (depends on device * capabilities). */ struct dac_channel_cfg { uint8_t channel_id; uint8_t resolution; }; /** * @cond INTERNAL_HIDDEN * * For internal use only, skip these in public documentation. */ /* * Type definition of DAC API function for configuring a channel. * See dac_channel_setup() for argument descriptions. */ typedef int (*dac_api_channel_setup)(struct device *dev, const struct dac_channel_cfg *channel_cfg); /* * Type definition of DAC API function for setting a write request. * See dac_write_value() for argument descriptions. */ typedef int (*dac_api_write_value)(struct device *dev, uint8_t channel, uint32_t value); /* * DAC driver API * * This is the mandatory API any DAC driver needs to expose. */ __subsystem struct dac_driver_api { dac_api_channel_setup channel_setup; dac_api_write_value write_value; }; /** * @endcond */ /** * @brief Configure a DAC channel. * * It is required to call this function and configure each channel before it is * selected for a write request. * * @param dev Pointer to the device structure for the driver instance. * @param channel_cfg Channel configuration. * * @retval 0 On success. * @retval -EINVAL If a parameter with an invalid value has been provided. * @retval -ENOTSUP If the requested resolution is not supported. */ __syscall int dac_channel_setup(struct device *dev, const struct dac_channel_cfg *channel_cfg); static inline int z_impl_dac_channel_setup(struct device *dev, const struct dac_channel_cfg *channel_cfg) { const struct dac_driver_api *api = (const struct dac_driver_api *)dev->driver_api; return api->channel_setup(dev, channel_cfg); } /** * @brief Write a single value to a DAC channel * * @param dev Pointer to the device structure for the driver instance. * @param channel Number of the channel to be used. * @param value Data to be written to DAC output registers. * * @retval 0 On success. * @retval -EINVAL If a parameter with an invalid value has been provided. */ __syscall int dac_write_value(struct device *dev, uint8_t channel, uint32_t value); static inline int z_impl_dac_write_value(struct device *dev, uint8_t channel, uint32_t value) { const struct dac_driver_api *api = (const struct dac_driver_api *)dev->driver_api; return api->write_value(dev, channel, value); } /** * @} */ #ifdef __cplusplus } #endif #include #endif /* ZEPHYR_INCLUDE_DRIVERS_DAC_H_ */