File : s-textio-erc32.adb


   1 ------------------------------------------------------------------------------
   2 --                                                                          --
   3 --                         GNAT RUN-TIME COMPONENTS                         --
   4 --                                                                          --
   5 --                       S Y S T E M . T E X T _ I O                        --
   6 --                                                                          --
   7 --                                 B o d y                                  --
   8 --                                                                          --
   9 --        Copyright (C) 1999-2002 Universidad Politecnica de Madrid         --
  10 --             Copyright (C) 2003-2006 The European Space Agency            --
  11 --                     Copyright (C) 2003-2013, AdaCore                     --
  12 --                                                                          --
  13 -- GNARL is free software; you can  redistribute it  and/or modify it under --
  14 -- terms of the  GNU General Public License as published  by the Free Soft- --
  15 -- ware  Foundation;  either version 3,  or (at your option) any later ver- --
  16 -- sion. GNARL is distributed in the hope that it will be useful, but WITH- --
  17 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
  18 -- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
  19 --                                                                          --
  20 --                                                                          --
  21 --                                                                          --
  22 --                                                                          --
  23 --                                                                          --
  24 -- You should have received a copy of the GNU General Public License and    --
  25 -- a copy of the GCC Runtime Library Exception along with this program;     --
  26 -- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
  27 -- <http://www.gnu.org/licenses/>.                                          --
  28 --                                                                          --
  29 -- GNARL was developed by the GNARL team at Florida State University.       --
  30 -- Extensive contributions were provided by Ada Core Technologies, Inc.     --
  31 --                                                                          --
  32 -- The port of GNARL to bare board  targets was initially developed by the  --
  33 -- Real-Time Systems Group at the Technical University of Madrid.           --
  34 --                                                                          --
  35 ------------------------------------------------------------------------------
  36 
  37 package body System.Text_IO is
  38 
  39    -----------
  40    -- Local --
  41    -----------
  42 
  43    Control_Register_Address :
  44    constant System.Address := 16#1F80000#;
  45 
  46    UART_Channel_A_Rx_Tx_Register_Address :
  47    constant System.Address := 16#01F800E0#;
  48 
  49    UART_Status_Register_Address :
  50    constant System.Address := 16#01F800E8#;
  51 
  52    type Scaler_8 is mod 2 ** 8;
  53    for Scaler_8'Size use  8;
  54    --  8-bit scaler
  55 
  56    type Reserved_8 is array (0 .. 7) of Boolean;
  57    for Reserved_8'Size use 8;
  58    pragma Pack (Reserved_8);
  59 
  60    type Reserved_24 is array (0 .. 23) of Boolean;
  61    for Reserved_24'Size use 24;
  62    pragma Pack (Reserved_24);
  63 
  64    type Control_Register is
  65       record
  66          PRD : Boolean;
  67          --  Power-down 1  : enabled (allowed) 0 : disabled r/w
  68 
  69          SWR : Boolean;
  70          --  Software reset 1  : enabled (allowed) 0 : disabled r/w
  71 
  72          BTO : Boolean;
  73          --  Bus timeout 1  : enabled 0 : disabled r/w
  74 
  75          BP : Boolean;
  76          --  Block protection instead of normal access protection
  77          --  1  : enabled 0 : disabled r/w
  78 
  79          WDCS : Boolean;
  80          --  Watchdog clock supply
  81          --  1  : external clock with prescaler (divide by 16)
  82          --  0  : external clock, no prescaler r/w
  83 
  84          IUEMMSK : Boolean;
  85          --  IU Error Mode Mask 1  : Error masked (= disabled)
  86          --  0  : Error not masked r/w
  87 
  88          RHIUEM : Boolean;
  89          --  Reset or Halt when IU error mode (ERROR*)
  90          --  1  : Reset 0 : Halt r/w
  91 
  92          IUHEMSK : Boolean;
  93          --  IU Hardware Error Mask
  94          --  1  : Error masked (= disabled) 0 : Error not masked r/w
  95 
  96          RHIUHE : Boolean;
  97          --  Reset or Halt when IU Hardware Error (HWERR*)
  98          --  1  : Reset 0 : Halt r/w
  99 
 100          IUCMPMSK : Boolean;
 101          --  IU Comparison Error Mask
 102          --  1  : Error masked (= disabled) 0 : Error not masked r/w
 103 
 104          RHIUCMP : Boolean;
 105          --  Reset or Halt when IU comparison error 1  : Reset 0 : Halt r/w
 106 
 107          FPUCMPMSK : Boolean;
 108          --  FPU Comparison Error Mask
 109          --  1  : Error masked (= disabled) 0 : Error not masked r/w
 110 
 111          RHFPUCMP : Boolean;
 112          --  Reset or Halt when FPU comparison error
 113          --  1  : Reset 0 : Halt r/w
 114 
 115          MECHEMSK : Boolean;
 116          --  MEC HW Error Mask
 117          --  1  : Error masked (= disabled) 0 : Error not masked r/w
 118 
 119          RHMECHE : Boolean;
 120          --  Reset or Halt when MEC HW Error (MECHWERR)
 121          --  1  : Reset 0 : Halt r/w
 122 
 123          RESERVED : Boolean;
 124          --  Not used r
 125 
 126          DMAE : Boolean;
 127          --  1 DMA 1  : enabled 0 : disabled r/w
 128 
 129          DPE : Boolean;
 130          --  DMA Parity Enabled 1  : enabled 0 : disabled r/w
 131 
 132          DST : Boolean;
 133          --  DMA session timeout 1  : enabled 0 : disabled r/w
 134 
 135          UBR : Boolean;
 136          --  UART baud rate(1)
 137          --  1  : No change of UART scaler baudrate
 138          --  0  : Divide UART scaler baudrate by two r/w
 139 
 140          UPE : Boolean;
 141          --  UART parity enable
 142          --  1  : parity enabled 0 : no parity r/w
 143 
 144          UP : Boolean;
 145          --  UART parity 1  : odd parity 0 : even parity r/w
 146 
 147          USB : Boolean;
 148          --   UART stop bits 1  : two stop bits 0 : one stop bit r/w
 149 
 150          UCS : Boolean;
 151          --  UART clock supply 1  : system clock 0 : external clock r/w
 152 
 153          UART_Scaler : Scaler_8;
 154          --  1 - 255 : Divide factor (1) 0: stops the UART clock r/w
 155       end record;
 156 
 157    for Control_Register use
 158       record
 159          PRD at 0 range 31 .. 31;
 160          SWR at 0 range 30 .. 30;
 161          BTO at 0 range 29 .. 29;
 162          BP at 0 range 28 .. 28;
 163          WDCS at 0 range 27 .. 27;
 164          IUEMMSK at 0 range 26 .. 26;
 165          RHIUEM at 0 range 25 .. 25;
 166          IUHEMSK at 0 range 24 .. 24;
 167          RHIUHE at 0 range 23 .. 23;
 168          IUCMPMSK at 0 range 22 .. 22;
 169          RHIUCMP at 0 range 21 .. 21;
 170          FPUCMPMSK at 0 range 20 .. 20;
 171          RHFPUCMP at 0 range 19 .. 19;
 172          MECHEMSK at 0 range 18 .. 18;
 173          RHMECHE at 0 range 17 .. 17;
 174          RESERVED at 0 range 16 .. 16;
 175          DMAE at 0 range 15 .. 15;
 176          DPE at 0 range 14 .. 14;
 177          DST at 0 range 13 .. 13;
 178          UBR at 0 range 12 .. 12;
 179          UPE at 0 range 11 .. 11;
 180          UP at 0 range 10 .. 10;
 181          USB at 0 range 9 .. 9;
 182          UCS at 0 range 8 .. 8;
 183          UART_scaler at 0 range 0 .. 7;
 184       end record;
 185 
 186    for Control_Register'Size use 32;
 187 
 188    pragma Suppress_Initialization (Control_Register);
 189 
 190    Control : Control_Register;
 191    pragma Atomic (Control);
 192    for Control'Address use Control_Register_Address;
 193 
 194    type UART_Channel_Rx_Tx_Register is
 195       record
 196          RTD : Character;
 197          --  Rx/Tx Data r/w
 198 
 199          Reserved24 : Reserved_24;
 200          --  Not used r
 201       end record;
 202 
 203    for UART_Channel_Rx_Tx_Register use
 204       record
 205          RTD at 0 range 24 .. 31;
 206          Reserved24 at 0 range 0 .. 23;
 207       end record;
 208 
 209    for UART_Channel_Rx_Tx_Register'Size use 32;
 210 
 211    pragma Suppress_Initialization (UART_Channel_Rx_Tx_Register);
 212 
 213    UART_Channel_A : UART_Channel_Rx_Tx_Register;
 214    pragma Atomic (UART_Channel_A);
 215    for UART_Channel_A'Address use UART_Channel_A_Rx_Tx_Register_Address;
 216 
 217       type UART_Status_Register is
 218       record
 219          DRA : Boolean;
 220          --  Data Ready in channel A r
 221 
 222          TSEA : Boolean;
 223          --  Transmitter A Send register Empty (no data to send) r
 224 
 225          THEA : Boolean;
 226          --  Transmitter A Holding register Empty (ready to load data) r
 227 
 228          Reserved1A : Boolean;
 229          --  Not used r
 230 
 231          FEA : Boolean;
 232          --  Framing Error in receiver A r
 233 
 234          PEA : Boolean;
 235          --  Parity Error in receiver A r
 236 
 237          OEA : Boolean;
 238          --  Overrun Error in receiver A r
 239 
 240          CUA : Boolean;
 241          --  Clear UART A (bit read as zero) r/w
 242 
 243          Reserved8A : Reserved_8;
 244          --  Not used r
 245 
 246          DRB : Boolean;
 247          --  Data Ready in channel B r
 248 
 249          TSEB : Boolean;
 250          --  Transmitter B Send register Empty (no data to send) r
 251 
 252          THEB : Boolean;
 253          --  Transmitter B Holding register Empty (ready to load data) r
 254 
 255          Reserved1B : Boolean;
 256          --  Not used r
 257 
 258          FEB : Boolean;
 259          --  Framing Error in receiver B r
 260 
 261          PEB : Boolean;
 262          --  Parity Error in receiver B r
 263 
 264          OEB : Boolean;
 265          --  Overrun Error in receiver B r
 266 
 267          CUB : Boolean;
 268          --  Clear UART B (bit read as zero) r/w
 269 
 270          Reserved8B : Reserved_8;
 271          --  Not used r
 272       end record;
 273 
 274    for UART_Status_Register use
 275       record
 276          DRA at 0 range 31 .. 31;
 277          TSEA at 0 range 30 .. 30;
 278          THEA at 0 range 29 .. 29;
 279          Reserved1A at 0 range 28 .. 28;
 280          FEA at 0 range 27 .. 27;
 281          PEA at 0 range 26 .. 26;
 282          OEA at 0 range 25 .. 25;
 283          CUA at 0 range 24 .. 24;
 284          Reserved8A at 0 range 16 .. 23;
 285          DRB at 0 range 15 .. 15;
 286          TSEB at 0 range 14 .. 14;
 287          THEB at 0 range 13 .. 13;
 288          Reserved1B at 0 range 12 .. 12;
 289          FEB at 0 range 11 .. 11;
 290          PEB at 0 range 10 .. 10;
 291          OEB at 0 range 9 .. 9;
 292          CUB at 0 range 8 .. 8;
 293          Reserved8B at 0 range 0 .. 7;
 294       end record;
 295 
 296    for UART_Status_Register'Size use 32;
 297 
 298    pragma Suppress_Initialization (UART_Status_Register);
 299 
 300    UART_Status : UART_Status_Register;
 301    pragma Atomic (UART_Status);
 302    for UART_Status'Address use UART_Status_Register_Address;
 303 
 304    Clock_Frequency : constant Natural;  --  Hertz
 305    pragma Import (Asm, Clock_Frequency, "clock_frequency");
 306    --  Frequency of the system clock
 307 
 308    ---------
 309    -- Get --
 310    ---------
 311 
 312    function Get return Character is
 313    begin
 314       --  Will never be called
 315 
 316       raise Program_Error;
 317       return ASCII.NUL;
 318    end Get;
 319 
 320    ----------------
 321    -- Initialize --
 322    ----------------
 323 
 324    procedure Initialize is
 325       Control_Aux : Control_Register;
 326       Scaler_Aux  : Scaler_8;
 327 
 328    begin
 329       --  Initialize the UART1 as output console
 330 
 331       --  Read the Control Register
 332 
 333       Control_Aux := Control;
 334 
 335       --  Set the UART scaler according to the baudrate given
 336 
 337       Scaler_Aux := Scaler_8 (Clock_Frequency / (32 * 115200 * 2));
 338 
 339       Control_Aux.UART_Scaler := Scaler_8'Max (Scaler_Aux - 1, 1);
 340 
 341       Control_Aux.UBR := False;
 342 
 343       Control_Aux.UPE := False;
 344       Control_Aux.USB := False;
 345 
 346       Control_Aux.UCS := True;
 347 
 348       --  Write to the Control Register in the MEC
 349 
 350       Control := Control_Aux;
 351 
 352       Initialized := True;
 353    end Initialize;
 354 
 355    -----------------
 356    -- Is_Rx_Ready --
 357    -----------------
 358 
 359    function Is_Rx_Ready return Boolean is
 360    begin
 361       return False;
 362    end Is_Rx_Ready;
 363 
 364    -----------------
 365    -- Is_Tx_Ready --
 366    -----------------
 367 
 368    function Is_Tx_Ready return Boolean is
 369       UART_Status_Aux : constant UART_Status_Register := UART_Status;
 370    begin
 371       return UART_Status_Aux.THEA;
 372    end Is_Tx_Ready;
 373 
 374    ---------
 375    -- Put --
 376    ---------
 377 
 378    procedure Put (C : Character) is
 379       UART_Tx : constant UART_Channel_Rx_Tx_Register :=
 380                 (RTD => C, Reserved24 => (others => False));
 381    begin
 382       UART_Channel_A := UART_Tx;
 383    end Put;
 384 
 385    ----------------------------
 386    -- Use_Cr_Lf_For_New_Line --
 387    ----------------------------
 388 
 389    function Use_Cr_Lf_For_New_Line return Boolean is
 390    begin
 391       return True;
 392    end Use_Cr_Lf_For_New_Line;
 393 end System.Text_IO;