osmo-e1-hardware/firmware/ice40-riscv/common/console.c

77 lines
1.1 KiB
C

/*
* console.c
*
* Copyright (C) 2019-2020 Sylvain Munaut <tnt@246tNt.com>
* SPDX-License-Identifier: LGPL-3.0-or-later
*/
#include <stdint.h>
#include "config.h"
#include "mini-printf.h"
struct wb_uart {
uint32_t data;
uint32_t clkdiv;
} __attribute__((packed,aligned(4)));
static volatile struct wb_uart * const uart_regs = (void*)(UART_BASE);
static char _printf_buf[128];
void console_init(void)
{
#ifdef BOARD_E1_TRACER
uart_regs->clkdiv = 22; /* ~1 Mbaud with clk=24MHz */
#else
uart_regs->clkdiv = 29; /* ~1 Mbaud with clk=30.72MHz */
#endif
}
char getchar(void)
{
int32_t c;
do {
c = uart_regs->data;
} while (c & 0x80000000);
return c;
}
int getchar_nowait(void)
{
int32_t c;
c = uart_regs->data;
return c & 0x80000000 ? -1 : (c & 0xff);
}
void putchar(char c)
{
uart_regs->data = c;
}
void puts(const char *p)
{
char c;
while ((c = *(p++)) != 0x00) {
if (c == '\n')
uart_regs->data = '\r';
uart_regs->data = c;
}
}
int printf(const char *fmt, ...)
{
va_list va;
int l;
va_start(va, fmt);
l = mini_vsnprintf(_printf_buf, 128, fmt, va);
va_end(va);
puts(_printf_buf);
return l;
}