| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- /*
- * Copyright (C) 2005-2007 by egnite Software GmbH
- *
- * All rights reserved.
- *
- * 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 of the copyright holders nor the names of
- * 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.
- *
- * For additional information see http://www.ethernut.de/
- *
- */
- /*
- * $Id: uart.c 2935 2010-04-01 12:14:17Z haraldkipp $
- */
- #include "utils.h"
- #include "uart.h"
- #ifndef NUT_CPU_FREQ
- #define NUT_CPU_FREQ 73728000
- #endif
- #define USART_BASE 0xFFFD0000 /*!< \brief USART 0 base address. */
- #define US_ID 2 /*!< \brief USART 0 ID. */
- #define US_CR (USART_BASE + 0x00) /*!< \brief Channel 0 control register address. */
- #define US_IDR (USART_BASE + 0x0C) /*!< \brief Interrupt disable register address. */
- #define US_RCR (USART_BASE + 0x34) /*!< \brief Receive counter register address. */
- #define US_TCR (USART_BASE + 0x3C) /*!< \brief Transmit counter register address. */
- #define US_BRGR (USART_BASE + 0x20) /*!< \brief USART 0 baud rate register address. */
- #define US_MR (USART_BASE + 0x04) /*!< \brief Channel 0 mode register address. */
- #define US_CSR (USART_BASE + 0x14) /*!< \brief Channel 0 status register address. */
- #define US_RHR (USART_BASE + 0x18) /*!< \brief Channel 0 receiver holding register address. */
- #define US_THR (USART_BASE + 0x1C) /*!< \brief USART 0 transmitter holding register address. */
- #define US_RXRDY 0x00000001 /*!< \brief Receiver ready */
- #define US_TXRDY 0x00000002 /*!< \brief Transmitter ready */
- #define US_RSTRX 0x00000004 /*!< \brief Reset receiver */
- #define US_RSTTX 0x00000008 /*!< \brief Reset transmitter */
- #define US_RXEN 0x00000010 /*!< \brief Receiver enable */
- #define US_RXDIS 0x00000020 /*!< \brief Receiver disable */
- #define US_TXEN 0x00000040 /*!< \brief Transmitter enable */
- #define US_TXDIS 0x00000080 /*!< \brief Transmitter disable */
- #define US_CHRL_8 0x000000C0 /*!< \brief 8 data bits. */
- #define US_PAR_NO 0x00000800 /*!< \brief No parity. */
- #define US_NBSTOP_1 0x00000000 /*!< \brief 1 stop bit. */
- #define US_CHMODE_NORMAL 0x00000000 /*!< \brief Normal mode. */
- #define PS_BASE 0xFFFF4000 /*!< \brief PS base address. */
- #define PS_PCER (PS_BASE + 0x04) /*!< \brief Peripheral clock enable register address. */
- #define PIO_BASE 0xFFFF0000 /*!< \brief PIO base address. */
- #define PIO_PDR (PIO_BASE + 0x04) /*!< \brief PIO disable register. */
- #define inr(_reg) (*((volatile unsigned int *)(_reg)))
- #define outr(_reg, _val) (*((volatile unsigned int *)(_reg)) = (_val))
- #define _BV(bit) (1 << bit)
- #define AT91_US_BAUD(baud) ((NUT_CPU_FREQ / (8 * (baud)) + 1) / 2)
- void UartInit(void)
- {
- /* Enable UART clock. */
- outr(PS_PCER, _BV(US_ID));
- /* Disable GPIO on UART tx/rx pins. */
- outr(PIO_PDR, _BV(14) | _BV(15));
- /* Reset UART. */
- outr(US_CR, US_RSTRX | US_RSTTX | US_RXDIS | US_TXDIS);
- /* Disable all UART interrupts. */
- outr(US_IDR, 0xFFFFFFFF);
- /* Clear UART counter registers. */
- outr(US_RCR, 0);
- outr(US_TCR, 0);
- /* Set UART baud rate generator register. */
- outr(US_BRGR, AT91_US_BAUD(115200));
- /* Set UART mode to 8 data bits, no parity and 1 stop bit. */
- outr(US_MR, US_CHMODE_NORMAL | US_CHRL_8 | US_PAR_NO | US_NBSTOP_1);
- /* Enable UART receiver and transmitter. */
- outr(US_CR, US_RXEN | US_TXEN);
- MicroDelay(1000);
- }
- int UartRxWait(unsigned int tmo)
- {
- while ((inr(US_CSR) & US_RXRDY) == 0) {
- if (tmo-- == 0) {
- return -1;
- }
- }
- return 0;
- }
- char UartRx(void)
- {
- while ((inr(US_CSR) & US_RXRDY) == 0);
- return (char) inr(US_RHR);
- }
- void UartTx(char ch)
- {
- while ((inr(US_CSR) & US_TXRDY) == 0);
- outr(US_THR, ch);
- }
|