blob: 9eb8f24c0b47f3d753f1df56af9e009a0c953ab2 [file] [log] [blame]
Yann Gautier4b0c72a2018-07-16 10:54:09 +02001/*
2 * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6#include <asm_macros.S>
Yann Gautier3d48bae2018-11-14 18:18:12 +01007#include <stm32_uart_regs.h>
Yann Gautier4b0c72a2018-07-16 10:54:09 +02008
Yann Gautier69035a82018-07-05 16:48:16 +02009#define USART_TIMEOUT 0x1000
10
Yann Gautier4b0c72a2018-07-16 10:54:09 +020011 .globl console_core_init
12 .globl console_core_putc
13 .globl console_core_getc
14 .globl console_core_flush
15
16 /* -----------------------------------------------------------------
17 * int console_core_init(uintptr_t base_addr,
18 * unsigned int uart_clk,
19 * unsigned int baud_rate)
20 *
21 * Function to initialize the console without a C Runtime to print
22 * debug information. This function will be accessed by console_init
23 * and crash reporting.
24 *
25 * In: r0 - console base address
26 * r1 - Uart clock in Hz
27 * r2 - Baud rate
28 * Out: return 1 on success else 0 on error
29 * Clobber list : r1, r2, r3
30 * -----------------------------------------------------------------
31 */
32func console_core_init
Yann Gautier69035a82018-07-05 16:48:16 +020033 /* Check the input base address */
34 cmp r0, #0
35 beq core_init_fail
36#if defined(IMAGE_BL2)
37 /* Check baud rate and uart clock for sanity */
38 cmp r1, #0
39 beq core_init_fail
40 cmp r2, #0
41 beq core_init_fail
42 /* Disable UART */
43 ldr r3, [r0, #USART_CR1]
44 bic r3, r3, #USART_CR1_UE
45 str r3, [r0, #USART_CR1]
46 /* Configure UART */
47 orr r3, r3, #(USART_CR1_TE | USART_CR1_FIFOEN)
48 str r3, [r0, #USART_CR1]
49 ldr r3, [r0, #USART_CR2]
50 bic r3, r3, #USART_CR2_STOP
51 str r3, [r0, #USART_CR2]
52 /* Divisor = (Uart clock + (baudrate / 2)) / baudrate */
53 lsl r3, r2, #1
54 add r3, r1, r3
55 udiv r3, r3, r2
56 str r3, [r0, #USART_BRR]
57 /* Enable UART */
58 ldr r3, [r0, #USART_CR1]
59 orr r3, r3, #USART_CR1_UE
60 str r3, [r0, #USART_CR1]
61 /* Check TEACK bit */
62 mov r2, #USART_TIMEOUT
63teack_loop:
64 subs r2, r2, #1
65 beq core_init_fail
66 ldr r3, [r0, #USART_ISR]
67 tst r3, #USART_ISR_TEACK
68 beq teack_loop
69#endif /* IMAGE_BL2 */
70 mov r0, #1
71 bx lr
72core_init_fail:
73 mov r0, #0
Yann Gautier4b0c72a2018-07-16 10:54:09 +020074 bx lr
75endfunc console_core_init
76
77 /* ---------------------------------------------------------------
78 * int console_core_putc(int c, uintptr_t base_addr)
79 *
80 * Function to output a character over the console. It returns the
81 * character printed on success or -1 on error.
82 *
83 * In : r0 - character to be printed
84 * r1 - console base address
85 * Out : return -1 on error else return character.
86 * Clobber list : r2
87 * ---------------------------------------------------------------
88 */
89func console_core_putc
Yann Gautier69035a82018-07-05 16:48:16 +020090 /* Check the input parameter */
91 cmp r1, #0
92 beq putc_error
93 /* Prepend '\r' to '\n' */
94 cmp r0, #0xA
95 bne 2f
961:
97 /* Check Transmit Data Register Empty */
98txe_loop_1:
99 ldr r2, [r1, #USART_ISR]
100 tst r2, #USART_ISR_TXE
101 beq txe_loop_1
102 mov r2, #0xD
103 str r2, [r1, #USART_TDR]
104 /* Check transmit complete flag */
105tc_loop_1:
106 ldr r2, [r1, #USART_ISR]
107 tst r2, #USART_ISR_TC
108 beq tc_loop_1
1092:
110 /* Check Transmit Data Register Empty */
111txe_loop_2:
112 ldr r2, [r1, #USART_ISR]
113 tst r2, #USART_ISR_TXE
114 beq txe_loop_2
115 str r0, [r1, #USART_TDR]
116 /* Check transmit complete flag */
117tc_loop_2:
118 ldr r2, [r1, #USART_ISR]
119 tst r2, #USART_ISR_TC
120 beq tc_loop_2
121 bx lr
122putc_error:
123 mov r0, #-1
Yann Gautier4b0c72a2018-07-16 10:54:09 +0200124 bx lr
125endfunc console_core_putc
126
127 /* -----------------------------------------------------------
128 * int console_core_getc(uintptr_t base_addr)
129 *
130 * Function to get a character from the console.
131 * It returns the character grabbed on success or -1 on error.
132 *
133 * In : r0 - console base address
134 * Out : return -1.
135 * Clobber list : r0, r1
136 * -----------------------------------------------------------
137 */
138func console_core_getc
139 /* Not supported */
140 mov r0, #-1
141 bx lr
142endfunc console_core_getc
143
144 /* ---------------------------------------------------------------
145 * int console_core_flush(uintptr_t base_addr)
146 *
147 * Function to force a write of all buffered data that hasn't been
148 * output.
149 *
150 * In : r0 - console base address
151 * Out : return -1 on error else return 0.
152 * Clobber list : r0, r1
153 * ---------------------------------------------------------------
154 */
155func console_core_flush
Yann Gautier69035a82018-07-05 16:48:16 +0200156 cmp r0, #0
157 beq flush_error
158 /* Check Transmit Data Register Empty */
159txe_loop_3:
160 ldr r1, [r0, #USART_ISR]
161 tst r1, #USART_ISR_TXE
162 beq txe_loop_3
163 mov r0, #0
164 bx lr
165flush_error:
166 mov r0, #-1
Yann Gautier4b0c72a2018-07-16 10:54:09 +0200167 bx lr
168endfunc console_core_flush