116 lines
2.2 KiB
C
116 lines
2.2 KiB
C
|
/* 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
|