5
5
6
6
/** @file
7
7
* @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.
12
8
*/
13
9
14
10
#define DT_DRV_COMPAT atmel_sam_dac
25
21
#include <zephyr/irq.h>
26
22
LOG_MODULE_REGISTER (dac_sam , CONFIG_DAC_LOG_LEVEL );
27
23
28
- BUILD_ASSERT (IS_ENABLED (CONFIG_SOC_SERIES_SAMX7X ),
29
- "Only SAMx7x series devices are currently supported." );
30
-
31
24
#define DAC_CHANNEL_NO 2
32
25
33
26
/* Device constant configuration parameters */
@@ -46,7 +39,11 @@ struct dac_channel {
46
39
47
40
/* Device run time data */
48
41
struct dac_sam_dev_data {
42
+ #if defined(SOC_SERIES_SAMX7X )
49
43
struct dac_channel dac_channels [DAC_CHANNEL_NO ];
44
+ #else
45
+ struct dac_channel dac_channel ;
46
+ #endif
50
47
};
51
48
52
49
static void dac_sam_isr (const struct device * dev )
@@ -59,6 +56,7 @@ static void dac_sam_isr(const struct device *dev)
59
56
/* Retrieve interrupt status */
60
57
int_stat = dac -> DACC_ISR & dac -> DACC_IMR ;
61
58
59
+ #if defined(SOC_SERIES_SAMX7X )
62
60
if ((int_stat & DACC_ISR_TXRDY0 ) != 0 ) {
63
61
/* Disable Transmit Ready Interrupt */
64
62
dac -> DACC_IDR = DACC_IDR_TXRDY0 ;
@@ -69,6 +67,13 @@ static void dac_sam_isr(const struct device *dev)
69
67
dac -> DACC_IDR = DACC_IDR_TXRDY1 ;
70
68
k_sem_give (& dev_data -> dac_channels [1 ].sem );
71
69
}
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
72
77
}
73
78
74
79
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,
105
110
return - EINVAL ;
106
111
}
107
112
113
+ #if defined(SOC_SERIES_SAMX7X )
108
114
if (dac -> DACC_IMR & (DACC_IMR_TXRDY0 << channel )) {
115
+ #else
116
+ if (dac -> DACC_IMR & DACC_IMR_TXRDY ) {
117
+ #endif
109
118
/* Attempting to send data on channel that's already in use */
110
119
return - EINVAL ;
111
120
}
@@ -115,13 +124,26 @@ static int dac_sam_write_value(const struct device *dev, uint8_t channel,
115
124
return - EINVAL ;
116
125
}
117
126
127
+ #if defined(SOC_SERIES_SAMX7X )
118
128
k_sem_take (& dev_data -> dac_channels [channel ].sem , K_FOREVER );
119
129
120
130
/* Trigger conversion */
121
131
dac -> DACC_CDR [channel ] = DACC_CDR_DATA0 (value );
122
132
123
133
/* Enable Transmit Ready Interrupt */
124
134
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
125
147
126
148
return 0 ;
127
149
}
@@ -130,16 +152,22 @@ static int dac_sam_init(const struct device *dev)
130
152
{
131
153
const struct dac_sam_dev_cfg * const dev_cfg = dev -> config ;
132
154
struct dac_sam_dev_data * const dev_data = dev -> data ;
133
- Dacc * const dac = dev_cfg -> regs ;
134
155
int retval ;
156
+ #if defined(SOC_SERIES_SAMX7X )
157
+ Dacc * const dac = dev_cfg -> regs ;
158
+ #endif
135
159
136
160
/* Configure interrupts */
137
161
dev_cfg -> irq_config ();
138
162
139
163
/* Initialize semaphores */
164
+ #if defined(SOC_SERIES_SAMX7X )
140
165
for (int i = 0 ; i < ARRAY_SIZE (dev_data -> dac_channels ); i ++ ) {
141
166
k_sem_init (& dev_data -> dac_channels [i ].sem , 1 , 1 );
142
167
}
168
+ #else
169
+ k_sem_init (& dev_data -> dac_channel .sem , 1 , 1 );
170
+ #endif
143
171
144
172
/* Enable DAC clock in PMC */
145
173
(void )clock_control_on (SAM_DT_PMC_CONTROLLER ,
@@ -150,8 +178,10 @@ static int dac_sam_init(const struct device *dev)
150
178
return retval ;
151
179
}
152
180
181
+ #if defined(SOC_SERIES_SAMX7X )
153
182
/* Set Mode Register */
154
183
dac -> DACC_MR = DACC_MR_PRESCALER (dev_cfg -> prescaler );
184
+ #endif
155
185
156
186
/* Enable module's IRQ */
157
187
irq_enable (dev_cfg -> irq_id );
0 commit comments