77 lines
1.1 KiB
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;
|
|
}
|