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
2521#include <zephyr/irq.h>
2622LOG_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 */
4841struct 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
5249static 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
7479static 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