85 lines
1.9 KiB
C
85 lines
1.9 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.
|
|
*/
|
|
#include "common.h"
|
|
#include "registers.h"
|
|
#include "uart.h"
|
|
|
|
#define UART_NCO ((16 * BIT(UART_NCO_WIDTH) * \
|
|
(long long)CONFIG_UART_BAUD_RATE) / PCLK_FREQ)
|
|
|
|
/* 115200N81 uart0, TX on A0, RX on A1 */
|
|
void uart_init(void)
|
|
{
|
|
/* Pinmux init also turns on all clocks. */
|
|
GREG32(PMU, PERICLKSET0) = 0xffffffff;
|
|
GREG32(PMU, PERICLKSET1) = 0xffffffff;
|
|
|
|
/*
|
|
* hardwire clocks to some value... just to get going
|
|
* Set source of trim to calibration logic during dynamic trim
|
|
*/
|
|
GWRITE_FIELD(XO, CLK_TIMER_TRIM_CTRL, RC_COARSE_TRIM_SRC, 0);
|
|
|
|
/* Set initial coarse trim value (slowest) */
|
|
GREG32(XO, CLK_TIMER_RC_COARSE_ATE_TRIM) = 100;
|
|
|
|
/* Set initial trim stabilization period */
|
|
GWRITE_FIELD(XO, CLK_TIMER_TRIM_CTRL, RC_INITIAL_TRIM_PERIOD, 10);
|
|
|
|
/* enable trim */
|
|
GWRITE_FIELD(XO, CLK_TIMER_TRIM_CTRL, RC_TRIM_EN, 1);
|
|
|
|
/* domain crossing sync */
|
|
GREG32(XO, CLK_TIMER_SYNC_CONTENTS) = 0x1;
|
|
|
|
|
|
GREG32(PINMUX, DIOA0_SEL) = GC_PINMUX_UART0_TX_SEL;
|
|
GREG32(PINMUX, UART0_RX_SEL) = GC_PINMUX_DIOA1_SEL;
|
|
GREG32(PINMUX, DIOA1_CTL) =
|
|
GC_PINMUX_DIOA1_CTL_DS_MASK | GC_PINMUX_DIOA1_CTL_IE_MASK;
|
|
|
|
GREG32(PMU, PWRDN_SCRATCH3) = 0xbeefcafe;
|
|
|
|
GREG32(UART, FIFO) = 3; /* clear RX,TX FIFO */
|
|
|
|
GREG32(UART, NCO) = UART_NCO; /* 115200N81 */
|
|
|
|
GREG32(UART, CTRL) = 3; /* TX,RX enable */
|
|
uart_write_char('\n');
|
|
uart_write_char('\r');
|
|
}
|
|
|
|
int uart_tx_ready(void)
|
|
{
|
|
/*
|
|
* This makes sure that transmit FIFO is fully flashed, so that TX
|
|
* FIFO is not used.
|
|
*/
|
|
return GREAD_FIELD(UART, STATE, TXIDLE);
|
|
}
|
|
|
|
void uart_tx_flush(void)
|
|
{
|
|
}
|
|
|
|
int uart_init_done(void)
|
|
{
|
|
return 1;
|
|
}
|
|
void uart_tx_start(void)
|
|
{
|
|
}
|
|
void uart_tx_stop(void)
|
|
{
|
|
}
|
|
|
|
void uart_write_char(char c)
|
|
{
|
|
while (!uart_tx_ready())
|
|
;
|
|
GREG32(UART, WDATA) = c;
|
|
}
|