File : s-sam4s.ads
1 ------------------------------------------------------------------------------
2 -- --
3 -- GNAT RUN-TIME COMPONENTS --
4 -- --
5 -- S Y S T E M . S A M 4 S --
6 -- --
7 -- S p e c --
8 -- --
9 -- Copyright (C) 2014, Free Software Foundation, Inc. --
10 -- --
11 -- GNAT is free software; you can redistribute it and/or modify it under --
12 -- terms of the GNU General Public License as published by the Free Soft- --
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
16 -- or FITNESS FOR A PARTICULAR PURPOSE. --
17 -- --
18 -- --
19 -- --
20 -- --
21 -- --
22 -- You should have received a copy of the GNU General Public License and --
23 -- a copy of the GCC Runtime Library Exception along with this program; --
24 -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
25 -- <http://www.gnu.org/licenses/>. --
26 -- --
27 -- GNAT was originally developed by the GNAT team at New York University. --
28 -- Extensive contributions were provided by Ada Core Technologies Inc. --
29 -- --
30 ------------------------------------------------------------------------------
31
32 -- This file provides register definitions for the SAM4S (ARM Cortex M4)
33 -- microcontrollers from Atmel. Definitions are taken from 'SAM4S Series'
34 -- datasheet (document 11100E-ATARM-24-Jul-13).
35
36 package System.SAM4S is
37 pragma No_Elaboration_Code_All;
38 -- Allow user code with pragma No_Elaboration_Code_All to use this package
39
40 pragma Preelaborate (System.SAM4S);
41
42 pragma Suppress (Alignment_Check);
43 -- Avoid any warnings for address clauses on variables of type record.
44
45 type Word is mod 2**32;
46
47 -- Define address bases for various peripherals
48
49 Peripheral_Base : constant := 16#4000_0000#;
50
51 SPI_Base : constant := Peripheral_Base + 16#8000#;
52
53 System_Controller_Base : constant := Peripheral_Base + 16#e_0000#;
54 PMC_Base : constant := System_Controller_Base + 16#0400#;
55 UART0_Base : constant := System_Controller_Base + 16#0600#;
56 UART1_Base : constant := System_Controller_Base + 16#0800#;
57 EFC0_Base : constant := System_Controller_Base + 16#0A00#;
58 EFC1_Base : constant := System_Controller_Base + 16#0C00#;
59
60 PIOA_Base : constant := System_Controller_Base + 16#0e00#;
61 PIOB_Base : constant := System_Controller_Base + 16#1000#;
62 PIOC_Base : constant := System_Controller_Base + 16#1200#;
63 WDT_Base : constant := System_Controller_Base + 16#1450#;
64
65 ---------------------------------
66 -- Power Management Controller --
67 ---------------------------------
68
69 type PMC_Registers is record
70 PMC_SCER : Word;
71 PMC_SCDR : Word;
72 PMC_SCSR : Word;
73 Pad0 : Word;
74
75 PMC_PCER0 : Word;
76 PMC_PCDR0 : Word;
77 PMC_PCSR0 : Word;
78 Pad1 : Word;
79
80 CKGR_MOR : Word;
81 CKGR_MCFR : Word;
82 CKGR_PLLAR : Word;
83 CKGR_PLLBR : Word;
84
85 PMC_MCKR : Word;
86 Pad3_4 : Word;
87 PMC_USB : Word;
88 Pad3_C : Word;
89
90 PMC_PCK0 : Word;
91 PMC_PCK1 : Word;
92 PMC_PCK2 : Word;
93 Pad4_C : Word;
94
95 Pad5_0 : Word;
96 Pad5_4 : Word;
97 Pad5_8 : Word;
98 Pad5_C : Word;
99
100 PMC_IER : Word;
101 PMC_IDR : Word;
102 PMC_SR : Word;
103 PMC_IMR : Word;
104
105 PMC_FSMR : Word;
106 PMC_FSPR : Word;
107 PMC_FOCR : Word;
108 Pad7_C : Word;
109
110 -- Not complete
111 end record;
112
113 PMC : PMC_Registers with Volatile, Import,
114 Address => System'To_Address (PMC_Base);
115
116 -- Constants for the CKGR MOR register
117
118 package CKGR_MOR is
119 CFDEN : constant := 2 ** 25;
120 MOSCSEL : constant := 2 ** 24;
121 KEY : constant := 16#37# * 2 ** 16;
122
123 MOSCXTST : constant := 2 ** 8;
124
125 MOSCRCEN : constant := 2 ** 3;
126 WAITMODE : constant := 2 ** 2;
127 MOSCXTBY : constant := 2 ** 1;
128 MOSCXTEN : constant := 2 ** 0;
129 end CKGR_MOR;
130
131 -- Constants for the PMC SR register
132
133 package PMC_SR is
134 MCKRDY : constant := 2 ** 3;
135 LOCKB : constant := 2 ** 2;
136 LOCKA : constant := 2 ** 1;
137 MOSCXTS : constant := 2 ** 0;
138 end PMC_SR;
139
140 -- Constants for the CKGR PLLAR and PLLBR registers
141
142 package CKGR_PLLxR is
143 DIV : constant := 2 ** 0;
144 PLLCOUNT : constant := 2 ** 8;
145 MUL : constant := 2 ** 16;
146 ONE : constant := 2 ** 29;
147 end CKGR_PLLxR;
148
149 -- Constants for the PMC MCKR register
150
151 package PMC_MCKR is
152 PLLBDIV2 : constant := 2 ** 13;
153 PLLADIV2 : constant := 2 ** 12;
154 PRES_Mask : constant := 2#111# * 2 ** 4;
155 CLK_1 : constant := 0 * 2 ** 4;
156 CLK_2 : constant := 1 * 2 ** 4;
157 CLK_4 : constant := 2 * 2 ** 4;
158 CLK_8 : constant := 3 * 2 ** 4;
159 CLK_16 : constant := 4 * 2 ** 4;
160 CLK_32 : constant := 5 * 2 ** 4;
161 CLK_64 : constant := 6 * 2 ** 4;
162 CLK_3 : constant := 7 * 2 ** 4;
163 CSS_Mask : constant := 2#11# * 2 ** 0;
164 SLOW_CLK : constant := 0 * 2 ** 0;
165 MAIN_CLK : constant := 1 * 2 ** 0;
166 PLLA_CLK : constant := 2 * 2 ** 0;
167 PLLB_CLK : constant := 3 * 2 ** 0;
168 end PMC_MCKR;
169
170 ----------------------------------------
171 -- Enhanced Embedded Flash Controller --
172 ----------------------------------------
173
174 type EEFC_Registers is record
175 EEFC_FMR : Word;
176 EEFC_FCR : Word;
177 EEFC_FSR : Word;
178 EEFC_FFR : Word;
179 end record;
180
181 -- Constants for the EEFC FMR register
182
183 package EEFC_FMR is
184 FRDY : constant := 2 ** 0;
185 FWS : constant := 2 ** 8;
186 SCOD : constant := 2 ** 16;
187 FAM : constant := 2 ** 24;
188 CLOE : constant := 2 ** 26;
189 end EEFC_FMR;
190
191 EFC0 : EEFC_Registers with Volatile, Import,
192 Address => System'To_Address (EFC0_Base);
193
194 --------------------------------------
195 -- Parallel Input/Output Controller --
196 --------------------------------------
197
198 type PIO_Registers is record
199 PER : Word;
200 PDR : Word;
201 PSR : Word;
202 Pad0 : Word;
203
204 OER : Word;
205 ODR : Word;
206 OSR : Word;
207 Pad1 : Word;
208
209 IFER : Word;
210 IFDR : Word;
211 IFSR : Word;
212 Pad2 : Word;
213
214 SODR : Word;
215 CODR : Word;
216 ODSR : Word;
217 PDSR : Word;
218
219 IER : Word;
220 IDR : Word;
221 IMR : Word;
222 ISR : Word;
223
224 MDER : Word;
225 MDDR : Word;
226 MDSR : Word;
227 Pad5 : Word;
228
229 PUDR : Word;
230 PUER : Word;
231 PUSR : Word;
232 Pad6 : Word;
233
234 ABCDSR1 : Word;
235 ABCDSR2 : Word;
236 Pad7_8 : Word;
237 Pad7_C : Word;
238
239 IFSCDR : Word;
240 IFSCER : Word;
241 IFSCSR : Word;
242 SCDR : Word;
243
244 PPDDR : Word;
245 PPDER : Word;
246 PPDSR : Word;
247 Pad9 : Word;
248
249 OWER : Word;
250 OWDR : Word;
251 OWSR : Word;
252 Pada : Word;
253
254 AIMER : Word;
255 AIMDR : Word;
256 AIMMR : Word;
257 Padb : Word;
258
259 ESR : Word;
260 LSR : Word;
261 ELSR : Word;
262 Padc : Word;
263
264 FELLSR : Word;
265 REHLSR : Word;
266 FRLHSR : Word;
267 Padd : Word;
268
269 LOCKSR : Word;
270 WPMR : Word;
271 WPSR : Word;
272 PadE_C : Word;
273 end record;
274
275 PIOA : PIO_Registers with Volatile, Import,
276 Address => System'To_Address (PIOA_Base);
277 PIOB : PIO_Registers with Volatile, Import,
278 Address => System'To_Address (PIOB_Base);
279 PIOC : PIO_Registers with Volatile, Import,
280 Address => System'To_Address (PIOC_Base);
281
282 PIOA_ID : constant := 11;
283 PIOB_ID : constant := 12;
284 PIOC_ID : constant := 13;
285
286 ----------------------------------
287 -- Serial Peripheral Interface --
288 ----------------------------------
289
290 type SPI_Registers is record
291 SPI_CR : Word;
292 SPI_MR : Word;
293 SPI_RDR : Word;
294 SPI_TDR : Word;
295
296 SPI_SR : Word;
297 SPI_IER : Word;
298 SPI_IDR : Word;
299 SPI_IMR : Word;
300
301 Pad_20 : Word;
302 Pad_24 : Word;
303 Pad_28 : Word;
304 Pad_2c : Word;
305
306 SPI_CSR0 : Word;
307 SPI_CSR1 : Word;
308 SPI_CSR2 : Word;
309 SPI_CSR3 : Word;
310
311 -- ...
312 end record;
313
314 -- Constants for the SPI CR register
315
316 package SPI_CR is
317 SPIEN : constant := 2 ** 0;
318 SPIDIS : constant := 2 ** 1;
319 SWRST : constant := 2 ** 7;
320
321 LASTXFER : constant := 2 ** 24;
322 end SPI_CR;
323
324 -- Constants for the SPI MR register
325
326 package SPI_MR is
327 MSTR : constant := 2 ** 0;
328 PS : constant := 2 ** 1;
329 PCSDEC : constant := 2 ** 2;
330 MODFDIS : constant := 2 ** 4;
331 WDRBT : constant := 2 ** 5;
332 LLB : constant := 2 ** 7;
333
334 PCS : constant := 2 ** 16;
335 PCS_Mask : constant := 2#1111# * PCS;
336 DLYBCS : constant := 2 ** 16;
337 DLYBCS_Mask : constant := 16#ff# * DLYBCS;
338 end SPI_MR;
339
340 -- Constants for the SPI TDR register
341
342 package SPI_TDR is
343 TD : constant := 2 ** 0;
344 PCS : constant := 2 ** 16;
345 LASTXFER : constant := 2 ** 24;
346 end SPI_TDR;
347
348 -- Constants for the SPI SR register; also used by the SPI IER, IDR and
349 -- IMR registers.
350
351 package SPI_SR is
352 RDRF : constant := 2 ** 0;
353 TDRE : constant := 2 ** 1;
354 MODF : constant := 2 ** 2;
355 OVRES : constant := 2 ** 3;
356 ENDRX : constant := 2 ** 4;
357 ENDTX : constant := 2 ** 5;
358 RXBUFF : constant := 2 ** 6;
359 TXBUFE : constant := 2 ** 7;
360 NSSR : constant := 2 ** 8;
361 TXEMPTY : constant := 2 ** 9;
362 UNDES : constant := 2 ** 10;
363 SPIENS : constant := 2 ** 16;
364 end SPI_SR;
365
366 -- Constants for the SPI CSR register
367
368 package SPI_CSR is
369 CPOL : constant := 2 ** 0;
370 NCPHA : constant := 2 ** 1;
371 CSNAAT : constant := 2 ** 2;
372 CSAAT : constant := 2 ** 3;
373 BITS : constant := 2 ** 4;
374 SCBR : constant := 2 ** 8;
375 DLYBS : constant := 2 ** 16;
376 DLYBCT : constant := 2 ** 24;
377 end SPI_CSR;
378
379 SPI : SPI_Registers with Volatile, Import,
380 Address => System'To_Address (SPI_Base);
381
382 SPI_ID : constant := 21;
383
384 --------------------
385 -- Watchdog Timer --
386 --------------------
387
388 type WDT_Registers is record
389 WDT_CR : Word;
390 WDT_MR : Word;
391 WDT_SR : Word;
392 end record;
393
394 -- Constants for the WDT CR register
395
396 package WDT_CR is
397 KEY : constant := 16#a5_00_00_00#;
398 WDRSTT : constant := 2 ** 0;
399 end WDT_CR;
400
401 -- Constants for the WDT MR register
402
403 package WDT_MR is
404 WDV : constant := 2 ** 0;
405 WDFIEN : constant := 2 ** 2;
406 WDRSTEN : constant := 2 ** 13;
407 WDDPROC : constant := 2 ** 14;
408 WDDIS : constant := 2 ** 15;
409 WDD : constant := 2 ** 16;
410 WDDBGHLT : constant := 2 ** 13;
411 WDIDLEHLT : constant := 2 ** 13;
412 end WDT_MR;
413
414 WDT : WDT_Registers with Volatile, Import,
415 Address => System'To_Address (WDT_Base);
416
417 -------------------------------------------------
418 -- Universal Asynchronous Receiver Transmitter --
419 -------------------------------------------------
420
421 type UART_Registers is record
422 UART_CR : Word;
423 UART_MR : Word;
424 UART_IER : Word;
425 UART_IDR : Word;
426
427 UART_IMR : Word;
428 UART_SR : Word;
429 UART_RHR : Word;
430 UART_THR : Word;
431
432 UART_BRGR : Word;
433 end record;
434
435 -- Constants for the UART CR register
436
437 package UART_CR is
438 RSTRX : constant := 2 ** 2;
439 RSTTX : constant := 2 ** 3;
440 RXEN : constant := 2 ** 4;
441 RXDIS : constant := 2 ** 5;
442 TXEN : constant := 2 ** 6;
443 TXDIS : constant := 2 ** 7;
444 RSTSTA : constant := 2 ** 8;
445 end UART_CR;
446
447 -- Constants for the UART MR register
448
449 package UART_MR is
450 CHMODE_NORMAL : constant := 0 * 2 ** 14;
451 CHMODE_AUTOMATIC : constant := 1 * 2 ** 14;
452 CHMODE_LOCAL_LOOPBACK : constant := 2 * 2 ** 14;
453 CHMODE_REMOTE_LOOPBACK : constant := 3 * 2 ** 14;
454
455 PAR_EVEN : constant := 0 * 2 ** 9;
456 PAR_ODD : constant := 1 * 2 ** 9;
457 PAR_SPACE : constant := 2 * 2 ** 9;
458 PAR_MARK : constant := 3 * 2 ** 9;
459 PAR_NO : constant := 4 * 2 ** 9;
460 end UART_MR;
461
462 -- Constants for the UART SR register
463
464 package UART_SR is
465 RXRDY : constant := 2 ** 0;
466 TXRDY : constant := 2 ** 1;
467 ENDRX : constant := 2 ** 3;
468 ENDTX : constant := 2 ** 4;
469 OVRE : constant := 2 ** 5;
470 FRAME : constant := 2 ** 6;
471 PARE : constant := 2 ** 7;
472 TXEMPTY : constant := 2 ** 9;
473 TXBUFE : constant := 2 ** 11;
474 RXBUFF : constant := 2 ** 12;
475 end UART_SR;
476
477 UART0 : UART_Registers with Volatile, Import,
478 Address => System'To_Address (UART0_Base);
479 UART1 : UART_Registers with Volatile, Import,
480 Address => System'To_Address (UART1_Base);
481
482 UART0_ID : constant := 8;
483 UART1_ID : constant := 9;
484 end System.SAM4S;