summaryrefslogtreecommitdiff
path: root/nuttx/arch/arm/src/sam34/chip/sam_dacc.h
blob: 4581289edae6b27b4a6f78da6a3868b6718fbf4f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
/****************************************************************************************
 * arch/arm/src/sam34/chip/sam_dacc.h
 * Digital-to-Analog Converter Controller (DACC) for the SAM4E
 *
 *   Copyright (C) 2014 Gregory Nutt. All rights reserved.
 *   Author: Gregory Nutt <gnutt@nuttx.org>
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 * 3. Neither the name NuttX nor the names of its contributors may be
 *    used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 ****************************************************************************************/

#ifndef __ARCH_ARM_SRC_SAM34_CHIP_SAM_DACC_H
#define __ARCH_ARM_SRC_SAM34_CHIP_SAM_DACC_H

/****************************************************************************************
 * Included Files
 ****************************************************************************************/

#include <nuttx/config.h>

#include "chip.h"
#include "chip/sam_memorymap.h"

/****************************************************************************************
 * Pre-processor Definitions
 ****************************************************************************************/

/* DACC register offsets *****************************************************************/

#define SAM_DACC_CR_OFFSET         0x0000 /* Control Register */
#define SAM_DACC_MR_OFFSET         0x0004 /* Mode Register */
#define SAM_DACC_CHER_OFFSET       0x0010 /* Channel Enable Register */
#define SAM_DACC_CHDR_OFFSET       0x0014 /* Channel Disable Register */
#define SAM_DACC_CHSR_OFFSET       0x0018 /* Channel Status Register */
#define SAM_DACC_CDR_OFFSET        0x0020 /* Conversion Data Register */
#define SAM_DACC_IER_OFFSET        0x0024 /* Interrupt Enable Register */
#define SAM_DACC_IDR_OFFSET        0x0028 /* Interrupt Disable Register */
#define SAM_DACC_IMR_OFFSET        0x002c /* Interrupt Mask Register */
#define SAM_DACC_ISR_OFFSET        0x0030 /* Interrupt Status Register */
#define SAM_DACC_ACR_OFFSET        0x0094 /* Analog Current Register */
#define SAM_DACC_WPMR_OFFSET       0x00e4 /* Write Protect Mode register */
#define SAM_DACC_WPSR_OFFSET       0x00e8 /* Write Protect Status register */

/* DACC register addresses **************************************************************/

#define SAM_DACC_CR                (SAM_DACC_BASE+SAM_DACC_CR_OFFSET)
#define SAM_DACC_MR                (SAM_DACC_BASE+SAM_DACC_MR_OFFSET)
#define SAM_DACC_CHER              (SAM_DACC_BASE+SAM_DACC_CHER_OFFSET)
#define SAM_DACC_CHDR              (SAM_DACC_BASE+SAM_DACC_CHDR_OFFSET)
#define SAM_DACC_CHSR              (SAM_DACC_BASE+SAM_DACC_CHSR_OFFSET)
#define SAM_DACC_CDR               (SAM_DACC_BASE+SAM_DACC_CDR_OFFSET)
#define SAM_DACC_IER               (SAM_DACC_BASE+SAM_DACC_IER_OFFSET)
#define SAM_DACC_IDR               (SAM_DACC_BASE+SAM_DACC_IDR_OFFSET)
#define SAM_DACC_IMR               (SAM_DACC_BASE+SAM_DACC_IMR_OFFSET)
#define SAM_DACC_ISR               (SAM_DACC_BASE+SAM_DACC_ISR_OFFSET)
#define SAM_DACC_ACR               (SAM_DACC_BASE+SAM_DACC_ACR_OFFSET)
#define SAM_DACC_WPMR              (SAM_DACC_BASE+SAM_DACC_WPMR_OFFSET)
#define SAM_DACC_WPSR              (SAM_DACC_BASE+SAM_DACC_WPSR_OFFSET)

/* DACC register bit definitions ********************************************************/

/* Control Register */

#define DACC_CR_SWRST              (1 << 0)  /* Bit 0:  Software reset */

/* Mode Register */

#define DACC_MR_TRGEN              (1 << 0)  /* Bit 0: Trigger Enable */
#define DACC_MR_TRGSEL_SHIFT       (1)       /* Bits 1-3: Trigger Selection */
#define DACC_MR_TRGSEL_MASK        (7 << DACC_MR_TRGSEL_SHIFT)
#  define DACC_MR_TRGSEL_EXTERN    (0 << DACC_MR_TRGSEL_SHIFT) /* External trigger */
#  define DACC_MR_TRGSEL_TIO0      (1 << DACC_MR_TRGSEL_SHIFT) /* TIO Output of the TC Channel 0 */
#  define DACC_MR_TRGSEL_TIO1      (2 << DACC_MR_TRGSEL_SHIFT) /* TIO Output of the TC Channel 1 */
#  define DACC_MR_TRGSEL_TIO2      (3 << DACC_MR_TRGSEL_SHIFT) /* TIO Output of the TC Channel 2 */
#  define DACC_MR_TRGSEL_PWM0      (4 << DACC_MR_TRGSEL_SHIFT) /* PWM Event Line 0 */
#  define DACC_MR_TRGSEL_PWM1      (5 << DACC_MR_TRGSEL_SHIFT) /* PWM Event Line 1 */
#define DACC_MR_WORD               (1 << 4)  /* Bit 4: Word Transfer */
#define DACC_MR_SLEEP              (1 << 5)  /* Bit 5: Sleep Mode */
#define DACC_MR_FASTWKUP           (1 << 6)  /* Bit 6: Fast Wake up Mode */
#define DACC_MR_REFRESH_SHIFT      (8)       /* Bits 8-15: Refresh Period */
#define DACC_MR_REFRESH_MASK       (0xff << DACC_MR_REFRESH_SHIFT)
#define DACC_MR_USERSEL_SHIFT      (16)       /* Bits 16-17: User Channel Selection */
#define DACC_MR_USERSEL_MASK       (3 << DACC_MR_USERSEL_SHIFT)
#  define DACC_MR_USERSEL_CHAN0    (0 << DACC_MR_USERSEL_SHIFT) /* Channel 0 */
#  define DACC_MR_USERSEL_CHAN1    (1 << DACC_MR_USERSEL_SHIFT) /* Channel 1 */
#define DACC_MR_TAG                (1 << 20)  /* Bit 20: Tag Selection Mode */
#define DACC_MR_MAXS               (1 << 21)  /* Bit 21: Max Speed Mode */
#define DACC_MR_CLKDIV             (1 << 22)  /* Bit 22: Clock Divider */
#  define DACC_MR_CLKDIV_2         (0)             /* DAC clock is MCK divided by 2 */
#  define DACC_MR_CLKDIV_4         DACC_MR_CLKDIV  /* DAC clock is MCK divided by 4 */
#define DACC_MR_STARTUP_SHIFT      (24)       /* Bits 24-29: Startup Time Select */
#define DACC_MR_STARTUP_MASK       (63 << DACC_MR_STARTUP_SHIFT)
#  define DACC_MR_STARTUP_0        (0 << DACC_MR_STARTUP_SHIFT)  /* 0 periods of DACClock */
#  define DACC_MR_STARTUP_8        (1 << DACC_MR_STARTUP_SHIFT)  /* 8 periods of DACClock */
#  define DACC_MR_STARTUP_16       (2 << DACC_MR_STARTUP_SHIFT)  /* 16 periods of DACClock */
#  define DACC_MR_STARTUP_24       (3 << DACC_MR_STARTUP_SHIFT)  /* 24 periods of DACClock */
#  define DACC_MR_STARTUP_64       (4 << DACC_MR_STARTUP_SHIFT)  /* 64 periods of DACClock */
#  define DACC_MR_STARTUP_80       (5 << DACC_MR_STARTUP_SHIFT)  /* 80 periods of DACClock */
#  define DACC_MR_STARTUP_96       (6 << DACC_MR_STARTUP_SHIFT)  /* 96 periods of DACClock */
#  define DACC_MR_STARTUP_112      (7 << DACC_MR_STARTUP_SHIFT)  /* 112 periods of DACClock */
#  define DACC_MR_STARTUP_512      (8 << DACC_MR_STARTUP_SHIFT)  /* 512 periods of DACClock */
#  define DACC_MR_STARTUP_576      (9 << DACC_MR_STARTUP_SHIFT)  /* 576 periods of DACClock */
#  define DACC_MR_STARTUP_640      (10 << DACC_MR_STARTUP_SHIFT) /* 640 periods of DACClock */
#  define DACC_MR_STARTUP_704      (11 << DACC_MR_STARTUP_SHIFT) /* 704 periods of DACClock */
#  define DACC_MR_STARTUP_768      (12 << DACC_MR_STARTUP_SHIFT) /* 768 periods of DACClock */
#  define DACC_MR_STARTUP_832      (13 << DACC_MR_STARTUP_SHIFT) /* 832 periods of DACClock */
#  define DACC_MR_STARTUP_896      (14 << DACC_MR_STARTUP_SHIFT) /* 896 periods of DACClock */
#  define DACC_MR_STARTUP_960      (51 << DACC_MR_STARTUP_SHIFT) /* 960 periods of DACClock */
#  define DACC_MR_STARTUP_1024     (16 << DACC_MR_STARTUP_SHIFT) /* 1024 periods of DACClock */
#  define DACC_MR_STARTUP_1088     (17 << DACC_MR_STARTUP_SHIFT) /* 1088 periods of DACClock */
#  define DACC_MR_STARTUP_1152     (18 << DACC_MR_STARTUP_SHIFT) /* 1152 periods of DACClock */
#  define DACC_MR_STARTUP_1216     (19 << DACC_MR_STARTUP_SHIFT) /* 1216 periods of DACClock */
#  define DACC_MR_STARTUP_1280     (20 << DACC_MR_STARTUP_SHIFT) /* 1280 periods of DACClock */
#  define DACC_MR_STARTUP_1344     (21 << DACC_MR_STARTUP_SHIFT) /* 1344 periods of DACClock */
#  define DACC_MR_STARTUP_1408     (22 << DACC_MR_STARTUP_SHIFT) /* 1408 periods of DACClock */
#  define DACC_MR_STARTUP_1472     (23 << DACC_MR_STARTUP_SHIFT) /* 1472 periods of DACClock */
#  define DACC_MR_STARTUP_1536     (24 << DACC_MR_STARTUP_SHIFT) /* 1536 periods of DACClock */
#  define DACC_MR_STARTUP_1600     (25 << DACC_MR_STARTUP_SHIFT) /* 1600 periods of DACClock */
#  define DACC_MR_STARTUP_1664     (26 << DACC_MR_STARTUP_SHIFT) /* 1664 periods of DACClock */
#  define DACC_MR_STARTUP_1728     (27 << DACC_MR_STARTUP_SHIFT) /* 1728 periods of DACClock */
#  define DACC_MR_STARTUP_1792     (28 << DACC_MR_STARTUP_SHIFT) /* 1792 periods of DACClock */
#  define DACC_MR_STARTUP_1856     (29 << DACC_MR_STARTUP_SHIFT) /* 1856 periods of DACClock */
#  define DACC_MR_STARTUP_1920     (30 << DACC_MR_STARTUP_SHIFT) /* 1920 periods of DACClock */
#  define DACC_MR_STARTUP_1984     (31 << DACC_MR_STARTUP_SHIFT) /* 1984 periods of DACClock */
#  define DACC_MR_STARTUP_2048     (32 << DACC_MR_STARTUP_SHIFT) /* 2048 periods of DACClock */
#  define DACC_MR_STARTUP_2112     (33 << DACC_MR_STARTUP_SHIFT) /* 2112 periods of DACClock */
#  define DACC_MR_STARTUP_2176     (34 << DACC_MR_STARTUP_SHIFT) /* 2176 periods of DACClock */
#  define DACC_MR_STARTUP_2240     (35 << DACC_MR_STARTUP_SHIFT) /* 2240 periods of DACClock */
#  define DACC_MR_STARTUP_2304     (36 << DACC_MR_STARTUP_SHIFT) /* 2304 periods of DACClock */
#  define DACC_MR_STARTUP_2368     (37 << DACC_MR_STARTUP_SHIFT) /* 2368 periods of DACClock */
#  define DACC_MR_STARTUP_2432     (38 << DACC_MR_STARTUP_SHIFT) /* 2432 periods of DACClock */
#  define DACC_MR_STARTUP_2496     (39 << DACC_MR_STARTUP_SHIFT) /* 2496 periods of DACClock */
#  define DACC_MR_STARTUP_2560     (40 << DACC_MR_STARTUP_SHIFT) /* 2560 periods of DACClock */
#  define DACC_MR_STARTUP_2624     (41 << DACC_MR_STARTUP_SHIFT) /* 2624 periods of DACClock */
#  define DACC_MR_STARTUP_2688     (42 << DACC_MR_STARTUP_SHIFT) /* 2688 periods of DACClock */
#  define DACC_MR_STARTUP_2752     (43 << DACC_MR_STARTUP_SHIFT) /* 2752 periods of DACClock */
#  define DACC_MR_STARTUP_2816     (44 << DACC_MR_STARTUP_SHIFT) /* 2816 periods of DACClock */
#  define DACC_MR_STARTUP_2880     (45 << DACC_MR_STARTUP_SHIFT) /* 2880 periods of DACClock */
#  define DACC_MR_STARTUP_2944     (46 << DACC_MR_STARTUP_SHIFT) /* 2944 periods of DACClock */
#  define DACC_MR_STARTUP_3008     (47 << DACC_MR_STARTUP_SHIFT) /* 3008 periods of DACClock */
#  define DACC_MR_STARTUP_3072     (48 << DACC_MR_STARTUP_SHIFT) /* 3072 periods of DACClock */
#  define DACC_MR_STARTUP_3136     (49 << DACC_MR_STARTUP_SHIFT) /* 3136 periods of DACClock */
#  define DACC_MR_STARTUP_3200     (50 << DACC_MR_STARTUP_SHIFT) /* 3200 periods of DACClock */
#  define DACC_MR_STARTUP_3264     (51 << DACC_MR_STARTUP_SHIFT) /* 3264 periods of DACClock */
#  define DACC_MR_STARTUP_3328     (52 << DACC_MR_STARTUP_SHIFT) /* 3328 periods of DACClock */
#  define DACC_MR_STARTUP_3392     (53 << DACC_MR_STARTUP_SHIFT) /* 3392 periods of DACClock */
#  define DACC_MR_STARTUP_3456     (54 << DACC_MR_STARTUP_SHIFT) /* 3456 periods of DACClock */
#  define DACC_MR_STARTUP_3520     (55 << DACC_MR_STARTUP_SHIFT) /* 3520 periods of DACClock */
#  define DACC_MR_STARTUP_3584     (56 << DACC_MR_STARTUP_SHIFT) /* 3584 periods of DACClock */
#  define DACC_MR_STARTUP_3648     (57 << DACC_MR_STARTUP_SHIFT) /* 3648 periods of DACClock */
#  define DACC_MR_STARTUP_3712     (58 << DACC_MR_STARTUP_SHIFT) /* 3712 periods of DACClock */
#  define DACC_MR_STARTUP_3776     (59 << DACC_MR_STARTUP_SHIFT) /* 3776 periods of DACClock */
#  define DACC_MR_STARTUP_3840     (60 << DACC_MR_STARTUP_SHIFT) /* 3840 periods of DACClock */
#  define DACC_MR_STARTUP_3940     (61 << DACC_MR_STARTUP_SHIFT) /* 3904 periods of DACClock */
#  define DACC_MR_STARTUP_3968     (62 << DACC_MR_STARTUP_SHIFT) /* 3968 periods of DACClock */
#  define DACC_MR_STARTUP_4032     (63 << DACC_MR_STARTUP_SHIFT) /* 4032 periods of DACClock */

/* Channel Enable, Channel Disable, and  Channel Status Registers */

#define DACC_CH0                   (1 << 0)  /* Bit 0: Channel 0 */
#define DACC_CH1                   (1 << 1)  /* Bit 1: Channel 1 */

/* Conversion Data Register -- 32-bit data */

/* Interrupt Enable, Interrupt Disable, Interrupt Mask, and Interrupt Status Register */

#define DACC_INT_TXRDY             (1 << 0)  /* Bit 0:  Transmit Ready Interrupt */
#define DACC_INT_EOC               (1 << 1)  /* Bit 1:  End of Conversion Interrupt Flag */
#define DACC_INT_ENDTX             (1 << 2)  /* Bit 2:  End of DMA Interrupt Flag */
#define DACC_INT_TXBUFE            (1 << 3)  /* Bit 3:  Transmit Buffer Empty */

/* Analog Current Register */

#define DACC_ACR_IBCTLCH_SHIFT     (0)       /* Bits 0-1: Analog Output Current Control */
#define DACC_ACR_IBCTLCH_MASK      (3 << DACC_ACR_IBCTLCH_SHIFT
#define DACC_ACR_IBCTLCH0          (1 << 0)  /* Bit 0:  Analog Output Current Control 0 */
#define DACC_ACR_IBCTLCH1          (1 << 1)  /* Bit 1:  Analog Output Current Control 1 */
#define DACC_ACR_IBCTLDACCORE_SHIFT (8)      /* Bits 8-9: Bias Current Control for DAC Core */
#define DACC_ACR_IBCTLDACCORE_MASK  (3 << DACC_ACR_IBCTLDACCORE_SHIFT)
#  define DACC_ACR_IBCTLDACCORE(n)  ((uint32_t)(n) << DACC_ACR_IBCTLDACCORE_SHIFT)

/* Write Protect Mode register */

#define DACC_WPMR_WPEN             (1 << 0)  /* Bit 0:  Write Protect Enable */
#define DACC_WPMR_WPKEY_SHIFT      (8)       /* Bits 8-31: Write Protect KEY */
#define DACC_WPMR_WPKEY_MASK       (0x00ffffff << DACC_WPMR_WPKEY_SHIFT)
#  define DACC_WPMR_WPKEY_MASK     (0x00444143 << DACC_WPMR_WPKEY_SHIFT)

/* Write Protect Status register */

#define DACC_WPSR_WPROTERR         (1 << 0)  /* Bit 0:  Write protection error */
#define DACC_WPSR_WPROTADDR_SHIFT  (8)       /* Bits 8-15: Write protection error address */
#define DACC_WPSR_WPROTADDR_MASK   (0xff << DACC_WPSR_WPROTADDR_SHIFT)

/****************************************************************************************
 * Public Types
 ****************************************************************************************/

/****************************************************************************************
 * Public Data
 ****************************************************************************************/

/****************************************************************************************
 * Public Functions
 ****************************************************************************************/

#endif /* __ARCH_ARM_SRC_SAM34_CHIP_SAM_DACC_H */