blob: c4e151692cfe4b0f29df769b4b2872a65cf2f3c3 [file] [log] [blame]
/* Copyright 2015 The Chromium OS Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
/* Synchronous UART debug printf */
#include "common.h"
#include "console.h"
#include "gpio.h"
#include "printf.h"
#include "registers.h"
#include "util.h"
static int debug_txchar(void *context, int c)
{
if (c == '\n') {
while (!(STM32_USART_SR(UARTN_BASE) & STM32_USART_SR_TXE))
;
STM32_USART_TDR(UARTN_BASE) = '\r';
}
/* Wait for space to transmit */
while (!(STM32_USART_SR(UARTN_BASE) & STM32_USART_SR_TXE))
;
STM32_USART_TDR(UARTN_BASE) = c;
return 0;
}
void debug_printf(const char *format, ...)
{
va_list args;
va_start(args, format);
vfnprintf(debug_txchar, NULL, format, args);
va_end(args);
}
#ifdef CONFIG_COMMON_RUNTIME
void cflush(void)
{
/* Wait for transmit complete */
while (!(STM32_USART_SR(UARTN_BASE) & STM32_USART_SR_TC))
;
}
int cputs(enum console_channel channel, const char *outstr)
{
debug_printf(outstr);
return 0;
}
void panic_puts(const char *outstr)
{
debug_printf(outstr);
cflush();
}
int cprintf(enum console_channel channel, const char *format, ...)
{
va_list args;
va_start(args, format);
vfnprintf(debug_txchar, NULL, format, args);
va_end(args);
return 0;
}
void panic_printf(const char *format, ...)
{
va_list args;
va_start(args, format);
vfnprintf(debug_txchar, NULL, format, args);
va_end(args);
cflush();
}
int cprints(enum console_channel channel, const char *format, ...)
{
va_list args;
va_start(args, format);
vfnprintf(debug_txchar, NULL, format, args);
va_end(args);
debug_printf("\n");
return 0;
}
void uart_init(void)
{
/* Enable USART1 clock */
STM32_RCC_APB2ENR |= STM32_RCC_PB2_USART1;
/* set baudrate */
STM32_USART_BRR(UARTN_BASE) =
DIV_ROUND_NEAREST(CPU_CLOCK, CONFIG_UART_BAUD_RATE);
/* UART enabled, 8 Data bits, oversampling x16, no parity */
STM32_USART_CR1(UARTN_BASE) =
STM32_USART_CR1_UE | STM32_USART_CR1_TE | STM32_USART_CR1_RE;
/* 1 stop bit, no fancy stuff */
STM32_USART_CR2(UARTN_BASE) = 0x0000;
/* DMA disabled, special modes disabled, error interrupt disabled */
STM32_USART_CR3(UARTN_BASE) = 0x0000;
/* Configure GPIOs */
gpio_config_module(MODULE_UART, 1);
}
#endif