Skip to content

Commit a21e9f0

Browse files
IVandeVeirecarlescufi
authored andcommitted
drivers: dac: Add support for the SAM4S soc series
Add support for the SAM4S soc in the DACC driver. Signed-off-by: Ibe Van de Veire <ibe.vandeveire@basalte.be>
1 parent 31f4984 commit a21e9f0

File tree

1 file changed

+38
-8
lines changed

1 file changed

+38
-8
lines changed

drivers/dac/dac_sam.c

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,6 @@
55

66
/** @file
77
* @brief DAC driver for Atmel SAM MCU family.
8-
*
9-
* Remarks:
10-
* Only SAME70, SAMV71 series devices are currently supported. Please submit a
11-
* patch.
128
*/
139

1410
#define DT_DRV_COMPAT atmel_sam_dac
@@ -25,9 +21,6 @@
2521
#include <zephyr/irq.h>
2622
LOG_MODULE_REGISTER(dac_sam, CONFIG_DAC_LOG_LEVEL);
2723

28-
BUILD_ASSERT(IS_ENABLED(CONFIG_SOC_SERIES_SAMX7X),
29-
"Only SAMx7x series devices are currently supported.");
30-
3124
#define DAC_CHANNEL_NO 2
3225

3326
/* Device constant configuration parameters */
@@ -46,7 +39,11 @@ struct dac_channel {
4639

4740
/* Device run time data */
4841
struct dac_sam_dev_data {
42+
#if defined(SOC_SERIES_SAMX7X)
4943
struct dac_channel dac_channels[DAC_CHANNEL_NO];
44+
#else
45+
struct dac_channel dac_channel;
46+
#endif
5047
};
5148

5249
static void dac_sam_isr(const struct device *dev)
@@ -59,6 +56,7 @@ static void dac_sam_isr(const struct device *dev)
5956
/* Retrieve interrupt status */
6057
int_stat = dac->DACC_ISR & dac->DACC_IMR;
6158

59+
#if defined(SOC_SERIES_SAMX7X)
6260
if ((int_stat & DACC_ISR_TXRDY0) != 0) {
6361
/* Disable Transmit Ready Interrupt */
6462
dac->DACC_IDR = DACC_IDR_TXRDY0;
@@ -69,6 +67,13 @@ static void dac_sam_isr(const struct device *dev)
6967
dac->DACC_IDR = DACC_IDR_TXRDY1;
7068
k_sem_give(&dev_data->dac_channels[1].sem);
7169
}
70+
#else
71+
if ((int_stat & DACC_ISR_TXRDY) != 0) {
72+
/* Disable Transmit Ready Interrupt */
73+
dac->DACC_IDR = DACC_IDR_TXRDY;
74+
k_sem_give(&dev_data->dac_channel.sem);
75+
}
76+
#endif
7277
}
7378

7479
static int dac_sam_channel_setup(const struct device *dev,
@@ -105,7 +110,11 @@ static int dac_sam_write_value(const struct device *dev, uint8_t channel,
105110
return -EINVAL;
106111
}
107112

113+
#if defined(SOC_SERIES_SAMX7X)
108114
if (dac->DACC_IMR & (DACC_IMR_TXRDY0 << channel)) {
115+
#else
116+
if (dac->DACC_IMR & DACC_IMR_TXRDY) {
117+
#endif
109118
/* Attempting to send data on channel that's already in use */
110119
return -EINVAL;
111120
}
@@ -115,13 +124,26 @@ static int dac_sam_write_value(const struct device *dev, uint8_t channel,
115124
return -EINVAL;
116125
}
117126

127+
#if defined(SOC_SERIES_SAMX7X)
118128
k_sem_take(&dev_data->dac_channels[channel].sem, K_FOREVER);
119129

120130
/* Trigger conversion */
121131
dac->DACC_CDR[channel] = DACC_CDR_DATA0(value);
122132

123133
/* Enable Transmit Ready Interrupt */
124134
dac->DACC_IER = DACC_IER_TXRDY0 << channel;
135+
#else
136+
k_sem_take(&dev_data->dac_channel.sem, K_FOREVER);
137+
138+
/* Select the channel */
139+
dac->DACC_MR = DACC_MR_USER_SEL(channel) | DACC_MR_ONE;
140+
141+
/* Trigger conversion */
142+
dac->DACC_CDR = DACC_CDR_DATA(value);
143+
144+
/* Enable Transmit Ready Interrupt */
145+
dac->DACC_IER = DACC_IER_TXRDY;
146+
#endif
125147

126148
return 0;
127149
}
@@ -130,16 +152,22 @@ static int dac_sam_init(const struct device *dev)
130152
{
131153
const struct dac_sam_dev_cfg *const dev_cfg = dev->config;
132154
struct dac_sam_dev_data *const dev_data = dev->data;
133-
Dacc *const dac = dev_cfg->regs;
134155
int retval;
156+
#if defined(SOC_SERIES_SAMX7X)
157+
Dacc *const dac = dev_cfg->regs;
158+
#endif
135159

136160
/* Configure interrupts */
137161
dev_cfg->irq_config();
138162

139163
/* Initialize semaphores */
164+
#if defined(SOC_SERIES_SAMX7X)
140165
for (int i = 0; i < ARRAY_SIZE(dev_data->dac_channels); i++) {
141166
k_sem_init(&dev_data->dac_channels[i].sem, 1, 1);
142167
}
168+
#else
169+
k_sem_init(&dev_data->dac_channel.sem, 1, 1);
170+
#endif
143171

144172
/* Enable DAC clock in PMC */
145173
(void)clock_control_on(SAM_DT_PMC_CONTROLLER,
@@ -150,8 +178,10 @@ static int dac_sam_init(const struct device *dev)
150178
return retval;
151179
}
152180

181+
#if defined(SOC_SERIES_SAMX7X)
153182
/* Set Mode Register */
154183
dac->DACC_MR = DACC_MR_PRESCALER(dev_cfg->prescaler);
184+
#endif
155185

156186
/* Enable module's IRQ */
157187
irq_enable(dev_cfg->irq_id);

0 commit comments

Comments
 (0)