summaryrefslogtreecommitdiff
path: root/nuttx/arch/arm/src/lpc313x/lpc313x_lowputc.c
diff options
context:
space:
mode:
Diffstat (limited to 'nuttx/arch/arm/src/lpc313x/lpc313x_lowputc.c')
-rwxr-xr-xnuttx/arch/arm/src/lpc313x/lpc313x_lowputc.c356
1 files changed, 0 insertions, 356 deletions
diff --git a/nuttx/arch/arm/src/lpc313x/lpc313x_lowputc.c b/nuttx/arch/arm/src/lpc313x/lpc313x_lowputc.c
deleted file mode 100755
index 5bfde83fc..000000000
--- a/nuttx/arch/arm/src/lpc313x/lpc313x_lowputc.c
+++ /dev/null
@@ -1,356 +0,0 @@
-/****************************************************************************
- * arch/arm/src/lpc313x/lpc313x_lowputc.c
- *
- * Copyright (C) 2009-2010 Gregory Nutt. All rights reserved.
- * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- * 3. Neither the name NuttX nor the names of its contributors may be
- * used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- ****************************************************************************/
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include <nuttx/config.h>
-
-#include <sys/types.h>
-#include <stdint.h>
-#include <debug.h>
-
-#include <nuttx/arch.h>
-
-#include "up_arch.h"
-#include "up_internal.h"
-
-#include "lpc313x_cgudrvr.h"
-#include "lpc313x_uart.h"
-
-/****************************************************************************
- * Definitions
- ****************************************************************************/
-
-/* Configuration ************************************************************/
-
-/* Is the UART enabled? */
-
-#ifdef CONFIG_LPC313X_UART
-# define HAVE_UART 1
-
-/* Is it a serial console? */
-
-# ifdef CONFIG_UART_SERIAL_CONSOLE
-# define HAVE_CONSOLE 1
-
- /* Is initialization performed by up_earlyserialinit()? Or is UART
- * initialization suppressed?
- */
-
-# if defined(CONFIG_USE_EARLYSERIALINIT) || defined(CONFIG_SUPPRESS_LPC313X_UART_CONFIG)
-# undef NEED_LOWSETUP
-# else
-# define NEED_LOWSETUP 1
-# endif
-# else
-# undef HAVE_CONSOLE
-# undef NEED_LOWSETUP
-# endif
-
-#else
-# undef HAVE_UART
-# undef HAVE_CONSOLE
-# undef NEED_LOWSETUP
-#endif
-
-/****************************************************************************
- * Private Types
- ****************************************************************************/
-
-/****************************************************************************
- * Private Variables
- ****************************************************************************/
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: up_waittxready
- ****************************************************************************/
-
-#ifdef HAVE_CONSOLE
-static inline void up_waittxready(void)
-{
- int tmp;
-
- /* Limit how long we will wait for the TX available condition */
-
- for (tmp = 1000 ; tmp > 0 ; tmp--)
- {
- /* Check if the tranmitter holding register (THR) is empty */
-
- if ((getreg32(LPC313X_UART_LSR) & UART_LSR_THRE) != 0)
- {
- /* The THR is empty, return */
-
- break;
- }
- }
-}
-#endif
-
-/****************************************************************************
- * Name: up_configbaud
- ****************************************************************************/
-
-#ifdef NEED_LOWSETUP
-static inline void up_configbaud(void)
-{
- /* In a buckled-up, embedded system, there is no reason to constantly
- * calculate the following. The calculation can be skipped if the
- * MULVAL, DIVADDVAL, and DIVISOR values are provided in the configuration
- * file.
- */
-
-#ifndef CONFIG_LPC313X_UART_MULVAL
- uint32_t qtrclk;
- uint32_t regval;
-
- /* Test values calculated for every multiplier/divisor combination */
-
- uint32_t tdiv;
- uint32_t terr;
- int tmulval;
- int tdivaddval;
-
- /* Optimal multiplier/divider values */
-
- uint32_t div = 0;
- uint32_t err = 100000;
- int mulval = 1;
- int divaddval = 0;
-
- /* Baud is generated using FDR and DLL-DLM registers
- *
- * baud = clock * (mulval/(mulval+divaddval) / (16 * div)
- *
- * Or
- *
- * div = (clock/16) * (mulval/(mulval+divaddval) / baud
- *
- * Where mulval = Fractional divider multiplier
- * divaddval = Fractional divider pre-scale div
- * div = DLL-DLM divisor
- */
-
- /* Get UART block clock divided by 16 */
-
- qtrclk = lpc313x_clkfreq(CLKID_UARTUCLK, DOMAINID_UART) >> 4;
-
- /* Try every valid multiplier, tmulval (or until a perfect
- * match is found).
- */
-
- for (tmulval = 1 ; tmulval <= 15 && err > 0; tmulval++)
- {
- /* Try every valid pre-scale div, tdivaddval (or until a perfect
- * match is found).
- */
-
- for (tdivaddval = 0 ; tdivaddval <= 15 && err > 0; tdivaddval++)
- {
- /* Calculate the divisor with these fractional divider settings */
-
- uint32_t tmp = (tmulval * qtrclk) / ((tmulval + tdivaddval));
- tdiv = (tmp + (CONFIG_UART_BAUD>>1)) / CONFIG_UART_BAUD;
-
- /* Check if this candidate divisor is within a valid range */
-
- if (tdiv > 2 && tdiv < 0x10000)
- {
- /* Calculate the actual baud and the error */
-
- uint32_t actualbaud = tmp / tdiv;
-
- if (actualbaud <= CONFIG_UART_BAUD)
- {
- terr = CONFIG_UART_BAUD - actualbaud;
- }
- else
- {
- terr = actualbaud - CONFIG_UART_BAUD;
- }
-
- /* Is this the smallest error we have encountered? */
-
- if (terr < err)
- {
- /* Yes, save these settings as the new, candidate optimal settings */
-
- mulval = tmulval ;
- divaddval = tdivaddval;
- div = tdiv;
- err = terr;
- }
- }
- }
- }
-
- /* Set the Divisor Latch Access Bit (DLAB) to enable DLL/DLM access */
-
- regval = getreg32(LPC313X_UART_LCR);
- regval |= UART_LCR_DLAB;
- putreg32(regval, LPC313X_UART_LCR);
-
- /* Configure the MS and LS DLAB registers */
-
- putreg32(div & UART_DLL_MASK, LPC313X_UART_DLL);
- putreg32((div >> 8) & UART_DLL_MASK, LPC313X_UART_DLM);
-
- regval &= ~UART_LCR_DLAB;
- putreg32(regval, LPC313X_UART_LCR);
-
- /* Configure the Fractional Divider Register (FDR) */
-
- putreg32((mulval << UART_FDR_MULVAL_SHIFT) |
- (divaddval << UART_FDR_DIVADDVAL_SHIFT),
- LPC313X_UART_FDR);
-#else
- /* Set the Divisor Latch Access Bit (DLAB) to enable DLL/DLM access */
-
- regval = getreg32(LPC313X_UART_LCR);
- regval |= UART_LCR_DLAB;
- putreg32(regval, LPC313X_UART_LCR);
-
- /* Configure the MS and LS DLAB registers */
-
- putreg32(CONFIG_LPC313X_UART_DIVISOR & UART_DLL_MASK, LPC313X_UART_DLL);
- putreg32((CONFIG_LPC313X_UART_DIVISOR >> 8) & UART_DLL_MASK, LPC313X_UART_DLM);
-
- regval &= ~UART_LCR_DLAB;
- putreg32(regval, LPC313X_UART_LCR);
-
- /* Configure the Fractional Divider Register (FDR) */
-
- putreg32((CONFIG_LPC313X_UART_MULVAL << UART_FDR_MULVAL_SHIFT) |
- (CONFIG_LPC313X_UART_DIVADDVAL << UART_FDR_DIVADDVAL_SHIFT),
- LPC313X_UART_FDR);
-#endif
-}
-#endif
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-/****************************************************************************
- * Name: lpc313x_lowsetup
- *
- * Description:
- * Called early in up_boot. Performs chip-common low level initialization.
- *
- ****************************************************************************/
-
-void lpc313x_lowsetup(void)
-{
-#ifdef NEED_LOWSETUP
- uint32_t regval;
-
- /* Enable UART system clock */
-
- lpc313x_enableclock(CLKID_UARTAPBCLK);
- lpc313x_enableclock(CLKID_UARTUCLK);
-
- /* Clear fifos */
-
- putreg32((UART_FCR_RXFIFORST|UART_FCR_TXFIFORST), LPC313X_UART_FCR);
-
- /* Set trigger */
-
- putreg32((UART_FCR_FIFOENABLE|UART_FCR_RXTRIGLEVEL_16), LPC313X_UART_FCR);
-
- /* Set up the LCR */
-
- regval = 0;
-
-#if CONFIG_UART_BITS == 5
- regval |= UART_LCR_WDLENSEL_5BITS;
-#elif CONFIG_UART_BITS == 6
- regval |= UART_LCR_WDLENSEL_6BITS;
-#elif CONFIG_UART_BITS == 7
- regval |= UART_LCR_WDLENSEL_7BITS;
-#else
- regval |= UART_LCR_WDLENSEL_8BITS;
-#endif
-
-#if CONFIG_UART_2STOP > 0
- regval |= UART_LCR_NSTOPBITS;
-#endif
-
-#if CONFIG_UART_PARITY == 1
- regval |= UART_LCR_PAREN;
-#elif CONFIG_UART_PARITY == 2
- regval |= (UART_LCR_PAREVEN|UART_LCR_PAREN);
-#endif
- putreg32(regval, LPC313X_UART_LCR);
-
- /* Set the BAUD divisor */
-
- up_configbaud();
-
- /* Configure the FIFOs */
-
- putreg32((UART_FCR_RXTRIGLEVEL_16|UART_FCR_TXFIFORST|
- UART_FCR_RXFIFORST|UART_FCR_FIFOENABLE),
- LPC313X_UART_FCR);
-
- /* The NuttX serial driver waits for the first THRE interrrupt before
- * sending serial data... However, it appears that the lpc313x hardware
- * does not generate that interrupt until a transition from not-empty
- * to empty. So, the current kludge here is to send one NULL at
- * startup to kick things off.
- */
-
- putreg32('\0', LPC313X_UART_THR);
-#endif
-}
-
-/****************************************************************************
- * Name: up_lowputc
- *
- * Description:
- * Provide priority, low-level access to support OS debug writes
- *
- ****************************************************************************/
-
-void up_lowputc(char ch)
-{
-#ifdef HAVE_CONSOLE
- up_waittxready();
- putreg32((uint32_t)ch, LPC313X_UART_THR);
-#endif
-}