| /* Copyright (c) 2014 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. |
| */ |
| |
| #include "clock.h" |
| #include "common.h" |
| #include "gpio.h" |
| #include "registers.h" |
| #include "system.h" |
| #include "task.h" |
| #include "uart.h" |
| #include "uartn.h" |
| #include "util.h" |
| |
| static int done_uart_init_yet; |
| |
| #define USE_UART_INTERRUPTS (!(defined(CONFIG_CUSTOMIZED_RO) && \ |
| defined(SECTION_IS_RO))) |
| #ifndef UARTN |
| #define UARTN 0 |
| #endif |
| |
| int uart_init_done(void) |
| { |
| return done_uart_init_yet; |
| } |
| |
| void uart_tx_start(void) |
| { |
| uartn_tx_start(UARTN); |
| } |
| |
| void uart_tx_stop(void) |
| { |
| uartn_tx_stop(UARTN); |
| |
| } |
| |
| int uart_tx_in_progress(void) |
| { |
| return uartn_tx_in_progress(UARTN); |
| } |
| |
| void uart_tx_flush(void) |
| { |
| uartn_tx_flush(UARTN); |
| } |
| |
| int uart_tx_ready(void) |
| { |
| /* True if the TX buffer is not completely full */ |
| return uartn_tx_ready(UARTN); |
| } |
| |
| int uart_rx_available(void) |
| { |
| /* True if the RX buffer is not completely empty. */ |
| return uartn_rx_available(UARTN); |
| } |
| |
| void uart_write_char(char c) |
| { |
| uartn_write_char(UARTN, c); |
| } |
| |
| int uart_read_char(void) |
| { |
| return uartn_read_char(UARTN); |
| } |
| |
| #if USE_UART_INTERRUPTS |
| |
| /** |
| * Interrupt handlers for UART0 |
| */ |
| void uart_ec_tx_interrupt(void) |
| { |
| /* Clear transmit interrupt status */ |
| GR_UART_ISTATECLR(UARTN) = GC_UART_ISTATECLR_TX_MASK; |
| |
| /* Fill output FIFO */ |
| uart_process_output(); |
| } |
| DECLARE_IRQ(GC_IRQNUM_UART0_TXINT, uart_ec_tx_interrupt, 1); |
| |
| void uart_ec_rx_interrupt(void) |
| { |
| /* Clear receive interrupt status */ |
| GR_UART_ISTATECLR(UARTN) = GC_UART_ISTATECLR_RX_MASK; |
| |
| /* Read input FIFO until empty */ |
| uart_process_input(); |
| } |
| DECLARE_IRQ(GC_IRQNUM_UART0_RXINT, uart_ec_rx_interrupt, 1); |
| #endif /* USE_UART_INTERRUPTS */ |
| |
| void uart_init(void) |
| { |
| clock_enable_module(MODULE_UART, 1); |
| |
| /* Initialize the Cr50 UART */ |
| uartn_init(UARTN); |
| uartn_enable(UARTN); |
| |
| #ifdef UART_AP |
| uartn_init(UART_AP); |
| #endif |
| #ifdef UART_EC |
| uartn_init(UART_EC); |
| #endif |
| |
| done_uart_init_yet = 1; |
| } |