summaryrefslogtreecommitdiff
path: root/FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1_FreedomStudio/freedom-metal/src/tty.c
blob: c47cc44fdaa4d637a08ff7a9f8a06686e3660312 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/* Copyright 2018 SiFive, Inc */
/* SPDX-License-Identifier: Apache-2.0 */

#include <metal/uart.h>
#include <metal/machine.h>

#if defined(__METAL_DT_STDOUT_UART_HANDLE)
/* This implementation serves as a small shim that interfaces with the first
 * UART on a system. */
int metal_tty_putc(unsigned char c)
{
    if (c == '\n') {
        int out = metal_uart_putc(__METAL_DT_STDOUT_UART_HANDLE, '\r');
        if (out != 0)
            return out;
    }
    return metal_uart_putc(__METAL_DT_STDOUT_UART_HANDLE, c);
}

#ifndef __METAL_DT_STDOUT_UART_BAUD
#define __METAL_DT_STDOUT_UART_BAUD 115200
#endif

static void metal_tty_init(void) __attribute__((constructor));
static void metal_tty_init(void)
{
    metal_uart_init(__METAL_DT_STDOUT_UART_HANDLE, __METAL_DT_STDOUT_UART_BAUD);
}
#else
/* This implementation of putc doesn't actually do anything, it's just there to
 * provide a shim that eats all the characters so we can ensure that everything
 * can link to metal_tty_putc. */
int nop_putc(unsigned char c) __attribute__((section(".text.metal.nop.putc")));
int nop_putc(unsigned char c) { return -1; }
int metal_tty_putc(unsigned char c) __attribute__((weak, alias("nop_putc")));
#warning "There is no default output device, metal_tty_putc() will throw away all input."
#endif