Line data Source code
1 1 : /*
2 : * Copyright (c) 2020 Libre Solar Technologies GmbH
3 : *
4 : * SPDX-License-Identifier: Apache-2.0
5 : */
6 :
7 : /**
8 : * @file
9 : * @brief DAC public API header file.
10 : */
11 :
12 : #ifndef ZEPHYR_INCLUDE_DRIVERS_DAC_H_
13 : #define ZEPHYR_INCLUDE_DRIVERS_DAC_H_
14 :
15 : #include <zephyr/device.h>
16 :
17 : #ifdef __cplusplus
18 : extern "C" {
19 : #endif
20 :
21 : /**
22 : * @brief DAC driver APIs
23 : * @defgroup dac_interface DAC driver APIs
24 : * @since 2.3
25 : * @version 0.8.0
26 : * @ingroup io_interfaces
27 : * @{
28 : */
29 :
30 : /**
31 : * @brief Broadcast channel identifier for DACs that support it.
32 : * @note Only for use in dac_write_value().
33 : */
34 1 : #define DAC_CHANNEL_BROADCAST 0xFF
35 :
36 : /**
37 : * @brief Structure for specifying the configuration of a DAC channel.
38 : */
39 1 : struct dac_channel_cfg {
40 : /** Channel identifier of the DAC that should be configured. */
41 1 : uint8_t channel_id;
42 : /** Desired resolution of the DAC (depends on device capabilities). */
43 1 : uint8_t resolution;
44 : /** Enable output buffer for this channel.
45 : * This is relevant for instance if the output is directly connected to the load,
46 : * without an amplifierin between. The actual details on this are hardware dependent.
47 : */
48 1 : bool buffered: 1;
49 : /** Enable internal output path for this channel. This is relevant for channels that
50 : * support directly connecting to on-chip peripherals via internal paths. The actual
51 : * details on this are hardware dependent.
52 : */
53 : bool internal: 1;
54 : };
55 :
56 : /**
57 : * @cond INTERNAL_HIDDEN
58 : *
59 : * For internal use only, skip these in public documentation.
60 : */
61 :
62 : /*
63 : * Type definition of DAC API function for configuring a channel.
64 : * See dac_channel_setup() for argument descriptions.
65 : */
66 : typedef int (*dac_api_channel_setup)(const struct device *dev,
67 : const struct dac_channel_cfg *channel_cfg);
68 :
69 : /*
70 : * Type definition of DAC API function for setting a write request.
71 : * See dac_write_value() for argument descriptions.
72 : */
73 : typedef int (*dac_api_write_value)(const struct device *dev,
74 : uint8_t channel, uint32_t value);
75 :
76 : /*
77 : * DAC driver API
78 : *
79 : * This is the mandatory API any DAC driver needs to expose.
80 : */
81 : __subsystem struct dac_driver_api {
82 : dac_api_channel_setup channel_setup;
83 : dac_api_write_value write_value;
84 : };
85 :
86 : /**
87 : * @endcond
88 : */
89 :
90 : /**
91 : * @brief Configure a DAC channel.
92 : *
93 : * It is required to call this function and configure each channel before it is
94 : * selected for a write request.
95 : *
96 : * @param dev Pointer to the device structure for the driver instance.
97 : * @param channel_cfg Channel configuration.
98 : *
99 : * @retval 0 On success.
100 : * @retval -EINVAL If a parameter with an invalid value has been provided.
101 : * @retval -ENOTSUP If the requested resolution is not supported.
102 : */
103 1 : __syscall int dac_channel_setup(const struct device *dev,
104 : const struct dac_channel_cfg *channel_cfg);
105 :
106 : static inline int z_impl_dac_channel_setup(const struct device *dev,
107 : const struct dac_channel_cfg *channel_cfg)
108 : {
109 : const struct dac_driver_api *api =
110 : (const struct dac_driver_api *)dev->api;
111 :
112 : return api->channel_setup(dev, channel_cfg);
113 : }
114 :
115 : /**
116 : * @brief Write a single value to a DAC channel
117 : *
118 : * @param dev Pointer to the device structure for the driver instance.
119 : * @param channel Number of the channel to be used.
120 : * @param value Data to be written to DAC output registers.
121 : *
122 : * @retval 0 On success.
123 : * @retval -EINVAL If a parameter with an invalid value has been provided.
124 : */
125 1 : __syscall int dac_write_value(const struct device *dev, uint8_t channel,
126 : uint32_t value);
127 :
128 : static inline int z_impl_dac_write_value(const struct device *dev,
129 : uint8_t channel, uint32_t value)
130 : {
131 : const struct dac_driver_api *api =
132 : (const struct dac_driver_api *)dev->api;
133 :
134 : return api->write_value(dev, channel, value);
135 : }
136 :
137 : /**
138 : * @}
139 : */
140 :
141 : #ifdef __cplusplus
142 : }
143 : #endif
144 :
145 : #include <zephyr/syscalls/dac.h>
146 :
147 : #endif /* ZEPHYR_INCLUDE_DRIVERS_DAC_H_ */
|