/* * Copyright (c) 2017-2019, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ #include #include #include "uniphier_console.h" /* * In: w0 - character to be printed * x1 - pointer to console structure * Out: return the character written (always succeeds) * Clobber: x2 */ .globl uniphier_console_putc func uniphier_console_putc ldr x1, [x1, #CONSOLE_T_DRVDATA] /* Wait until the transmitter FIFO gets empty */ 0: ldr w2, [x1, #UNIPHIER_UART_LSR] tbz w2, #UNIPHIER_UART_LSR_THRE_BIT, 0b mov w2, w0 1: str w2, [x1, #UNIPHIER_UART_TX] cmp w2, #'\n' b.ne 2f mov w2, #'\r' /* Append '\r' to '\n' */ b 1b 2: ret endfunc uniphier_console_putc /* * In: x0 - pointer to console structure * Out: return the character read, or ERROR_NO_PENDING_CHAR if no character is available * Clobber: x1 */ .globl uniphier_console_getc func uniphier_console_getc ldr x0, [x0, #CONSOLE_T_DRVDATA] ldr w1, [x0, #UNIPHIER_UART_LSR] tbz w1, #UNIPHIER_UART_LSR_DR_BIT, 0f ldr w0, [x0, #UNIPHIER_UART_RX] ret 0: mov w0, #ERROR_NO_PENDING_CHAR ret endfunc uniphier_console_getc /* * In: x0 - pointer to console structure * Out: return 0 (always succeeds) * Clobber: x1 */ .global uniphier_console_flush func uniphier_console_flush ldr x0, [x0, #CONSOLE_T_DRVDATA] /* wait until the transmitter gets empty */ 0: ldr w1, [x0, #UNIPHIER_UART_LSR] tbz w1, #UNIPHIER_UART_LSR_TEMT_BIT, 0b mov w0, #0 ret endfunc uniphier_console_flush