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;