skeleton_console.S 5.51 KB
Newer Older
1
/*
2
 * Copyright (c) 2015-2017, ARM Limited and Contributors. All rights reserved.
3
 *
dp-arm's avatar
dp-arm committed
4
 * SPDX-License-Identifier: BSD-3-Clause
5
6
 */
#include <asm_macros.S>
7
#include <console_macros.S>
8
9

	/*
Ambroise Vincent's avatar
Ambroise Vincent committed
10
	 * This file contains a skeleton console driver that can be used as a
11
12
13
14
15
16
17
18
	 * basis for a real console driver. Console drivers in Trusted Firmware
	 * can be instantiated multiple times. Each instance is described by a
	 * separate console_t structure which must be registered with the common
	 * console framework via console_register(). Console drivers should
	 * define a console_xxx_register() function that initializes a new
	 * console_t structure passed in from the caller and registers it after
	 * initializing the console hardware. Drivers may define their own
	 * structures extending console_t to store private driver information.
Ambroise Vincent's avatar
Ambroise Vincent committed
19
	 * Console drivers *MUST* ensure that the console callbacks they
20
21
22
23
24
	 * implement only change registers allowed in the clobber lists defined
	 * in this file. (Note that in addition to the explicit clobber lists,
	 * any function may always clobber the intra-procedure-call registers
	 * X16 and X17, but may never depend on them retaining their values
	 * across any function call.)
25
26
	 */

27
28
29
30
	.globl	console_xxx_register
	.globl	console_xxx_putc
	.globl	console_xxx_getc
	.globl	console_xxx_flush
31
32

	/* -----------------------------------------------
33
34
35
36
37
38
39
40
41
42
43
	 * int console_xxx_register(console_xxx_t *console,
	 * 	...additional parameters as desired...)
	 * Function to initialize and register the console.
	 * The caller needs to pass an empty console_xxx_t
	 * structure in which *MUST* be allocated in
	 * persistent memory (e.g. a global or static local
	 * variable, *NOT* on the stack).
	 * In : x0 - pointer to empty console_t structure
	 *      x1 through x7: additional parameters as desired
	 * Out: x0 - 1 on success, 0 on error
	 * Clobber list : x0 - x7
44
45
	 * -----------------------------------------------
	 */
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
func console_xxx_register
	/*
	 * Store parameters (e.g. hardware base address) in driver-specific
	 * console_xxx_t structure field if they will need to be retrieved
	 * by later console callback (e.g. putc).
	 * Example:
	 */
	str	x1, [x0, #CONSOLE_T_XXX_BASE]
	str	x2, [x0, #CONSOLE_T_XXX_SOME_OTHER_VALUE]

	/*
	 * Initialize console hardware, using x1 - x7 parameters as needed.
	 * Keep console_t pointer in x0 for later.
	 */

61
62
63
64
65
66
	/*
	 * Macro to finish up registration and return (needs valid x0 + x30).
	 * If any of the argument is unspecified, then the corresponding
	 * entry in console_t is set to 0.
	 */
	finish_console_register xxx putc=1, getc=1, flush=1
67
68
69
70

	/* Jump here if hardware init fails or parameters are invalid. */
register_fail:
	mov	w0, #0
71
	ret
72
endfunc console_xxx_register
73
74

	/* --------------------------------------------------------
75
	 * int console_xxx_putc(int c, console_xxx_t *console)
76
77
78
	 * Function to output a character over the console. It
	 * returns the character printed on success or -1 on error.
	 * In : w0 - character to be printed
79
80
81
	 *      x1 - pointer to console_t struct
	 * Out: w0 - printed character on success, < 0 on error.
	 * Clobber list : x0, x1, x2
82
83
	 * --------------------------------------------------------
	 */
84
85
86
87
88
89
90
91
92
93
94
95
func console_xxx_putc
	/*
	 * Retrieve values we need (e.g. hardware base address) from
	 * console_xxx_t structure pointed to by x1.
	 * Example:
	 */
	ldr	x1, [x1, #CONSOLE_T_XXX_BASE]

	/*
	 * Write w0 to hardware.
	 */

96
	ret
97
98

	/* Jump here if output fails for any reason. */
99
100
101
putc_error:
	mov	w0, #-1
	ret
102
endfunc console_xxx_putc
103
104

	/* ---------------------------------------------
105
	 * int console_xxx_getc(console_xxx_t *console)
106
	 * Function to get a character from the console.
107
108
109
110
111
112
113
114
115
116
117
118
	 * Even though console_getc() is blocking, this
	 * callback has to be non-blocking and always
	 * return immediately to allow polling multiple
	 * drivers concurrently.
	 * Returns the character grabbed on success,
	 * ERROR_NO_PENDING_CHAR if no character was
	 * available at this time, or any value
	 * between -2 and -127 if there was an error.
	 * In : x0 - pointer to console_t struct
	 * Out: w0 - character on success,
	 *           ERROR_NO_PENDING_CHAR if no char,
	 *           < -1 on error
119
120
121
	 * Clobber list : x0, x1
	 * ---------------------------------------------
	 */
122
123
124
125
126
127
128
129
130
131
132
133
func console_xxx_getc
	/*
	 * Retrieve values we need (e.g. hardware base address) from
	 * console_xxx_t structure pointed to by x0.
	 * Example:
	 */
	ldr	x1, [x0, #CONSOLE_T_XXX_BASE]

	/*
	 * Try to read character into w0 from hardware.
	 */

134
	ret
135
136
137
138
139
140
141

	/* Jump here if there is no character available at this time. */
getc_no_char:
	mov	w0, #ERROR_NO_PENDING_CHAR
	ret

	/* Jump here if there was any hardware error. */
142
getc_error:
143
	mov	w0, #-2		/* may pick error codes between -2 and -127 */
144
	ret
145
endfunc console_xxx_getc
146
147

	/* ---------------------------------------------
148
	 * int console_xxx_flush(console_xxx_t *console)
149
150
	 * Function to force a write of all buffered
	 * data that hasn't been output.
151
152
153
	 * In : x0 - pointer to console_xxx_t struct
	 * Out: w0 - 0 on success, < 0 on error
	 * Clobber list : x0, x1, x2, x3, x4, x5
154
155
	 * ---------------------------------------------
	 */
156
157
158
159
160
161
162
163
164
165
166
167
168
func console_xxx_flush
	/*
	 * Retrieve values we need (e.g. hardware base address) from
	 * console_xxx_t structure pointed to by x0.
	 * Example:
	 */
	ldr	x1, [x0, #CONSOLE_T_XXX_BASE]

	/*
	 * Flush all remaining output from hardware FIFOs. Do not return until
	 * all data has been flushed or there was an unrecoverable error.
	 */

169
170
	mov	w0, #0
	ret
171
172

	/* Jump here if an unrecoverable error has been encountered. */
173
174
175
flush_error:
	mov	w0, #-1
	ret
176
endfunc console_xxx_flush