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;