blob: 65875b7fe249f6a22c90a1bf9eb7b78d9fa2bcdb [file] [log] [blame]
/****************************************************************************
* arch/sparc/src/s698pm/s698pm-uart.h
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
#ifndef __ARCH_SPARC_SRC_S698PM_S698PM_UART_H
#define __ARCH_SPARC_SRC_S698PM_S698PM_UART_H
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include "chip.h"
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/* Register Offsets *************************************************^*******/
#define S698PM_UART_TXREG_OFFSET 0x0000 /* UARTx transmit register */
#define S698PM_UART_RXREG_OFFSET 0x0000 /* UARTx receive register */
#define S698PM_UART_STATREG_OFFSET 0x0004 /* UARTx status register */
#define S698PM_UART_CTRLREG_OFFSET 0x0008 /* UARTx control register */
#define S698PM_UART_SCALREG_OFFSET 0x000c /* UARTx scaler register */
/* Register Addresses *******************************************************/
#if CHIP_NUARTS > 0
#define S698PM_UART1_TXREG (S698PM_UART1_BASE+S698PM_UART_TXREG_OFFSET)
#define S698PM_UART1_RXREG (S698PM_UART1_BASE+S698PM_UART_RXREG_OFFSET)
#define S698PM_UART1_STATREG (S698PM_UART1_BASE+S698PM_UART_STATREG_OFFSET)
#define S698PM_UART1_CTRLREG (S698PM_UART1_BASE+S698PM_UART_CTRLREG_OFFSET)
#define S698PM_UART1_SCALREG (S698PM_UART1_BASE+S698PM_UART_SCALREG_OFFSET)
#endif
#if CHIP_NUARTS > 1
#define S698PM_UART2_TXREG (S698PM_UART2_BASE+S698PM_UART_TXREG_OFFSET)
#define S698PM_UART2_RXREG (S698PM_UART2_BASE+S698PM_UART_RXREG_OFFSET)
#define S698PM_UART2_STATREG (S698PM_UART2_BASE+S698PM_UART_STATREG_OFFSET)
#define S698PM_UART2_CTRLREG (S698PM_UART2_BASE+S698PM_UART_CTRLREG_OFFSET)
#define S698PM_UART2_SCALREG (S698PM_UART2_BASE+S698PM_UART_SCALREG_OFFSET)
#endif
#if CHIP_NUARTS > 2
#define S698PM_UART3_TXREG (S698PM_UART3_BASE+S698PM_UART_TXREG_OFFSET)
#define S698PM_UART3_RXREG (S698PM_UART3_BASE+S698PM_UART_RXREG_OFFSET)
#define S698PM_UART3_STATREG (S698PM_UART3_BASE+S698PM_UART_STATREG_OFFSET)
#define S698PM_UART3_CTRLREG (S698PM_UART3_BASE+S698PM_UART_CTRLREG_OFFSET)
#define S698PM_UART3_SCALREG (S698PM_UART3_BASE+S698PM_UART_SCALREG_OFFSET)
#endif
#if CHIP_NUARTS > 3
#define S698PM_UART4_TXREG (S698PM_UART4_BASE+S698PM_UART_TXREG_OFFSET)
#define S698PM_UART4_RXREG (S698PM_UART4_BASE+S698PM_UART_RXREG_OFFSET)
#define S698PM_UART4_STATREG (S698PM_UART4_BASE+S698PM_UART_STATREG_OFFSET)
#define S698PM_UART4_CTRLREG (S698PM_UART4_BASE+S698PM_UART_CTRLREG_OFFSET)
#define S698PM_UART4_SCALREG (S698PM_UART4_BASE+S698PM_UART_SCALREG_OFFSET)
#endif
/* Register Bit-Field Definitions *******************************************/
#define ODD 1
#define EVEN 0
#define ON 1
#define OFF 0
#define NONE 2
#define RX 0
#define TX 1
#define RXTX 3
/* Uart control list - Mask */
#define MSK_UART_ENABLE_RX 0x01
#define MSK_UART_ENABLE_TX 0x02
#define MSK_UART_ENABLE_RXIT 0x04
#define MSK_UART_ENABLE_TXIT 0x08
#define MSK_UART_PAR 0x10
#define MSK_UART_ENABLE_PAR 0x20
#define MSK_UART_ENABLE_FLOW 0x40
#define MSK_UART_LOOPBACK 0x80
#define MSK_UART_CLOCK 0x100
#define MSK_UART_ALLINTS 0x0C
/* UARTx status and control register */
#define UART_STA_DR (1 << 0) /* Bit 0: Receive buffer data available */
#define UART_STA_TS (1 << 1) /* Bit 1: Transmit shift register is empty */
#define UART_STA_TE (1 << 2) /* Bit 2: TX buffer empty */
#define UART_STA_BR (1 << 3) /* Bit 3: Transmit break */
#define UART_STA_OV (1 << 4) /* Bit 4: overflow error status */
#define UART_STA_PE (1 << 5) /* Bit 5: Parity error status */
#define UART_STA_FE (1 << 6) /* Bit 6: Framing error status */
#define UART_STA_TH (1 << 7) /* Bit 7: TX buffer 1/2 full */
#define UART_STA_RH (1 << 8) /* Bit 8: RX buffer 1/2 full */
#define UART_STA_TF (1 << 9) /* Bit 9: Transmit buffer full status */
#define UART_STA_RF (1 << 10) /* Bit 10: Receive buffer full status */
#define REG_STAT_TX_CNT (0x3f << 20)
#define REG_STAT_RX_CNT (0x3f << 26)
/* UARTx transmit register */
#define UART_TXREG_MASK 0xff
/* UARTx receive register */
#define UART_RXREG_MASK 0xff
/* UARTx baud rate register */
#define UART_BRG_MASK 0xfff
#define uart_set_baudrate(baudrate) ((uint32_t)((((BOARD_CPU_CLOCK*10)/(baudrate * 8))-5)/10))
#define uart_parity_config(reg, uart_parity) ((uart_parity == ODD) ? \
(reg = ((reg | MSK_UART_PAR) | MSK_UART_ENABLE_PAR)) : \
((uart_parity == EVEN) ? \
(reg = ((reg & ~MSK_UART_PAR) | MSK_UART_ENABLE_PAR)) : \
(reg &= ~MSK_UART_ENABLE_PAR ) \
) \
)
#define Uart_interrupt_config(reg, uart_its) ((uart_its == RXTX) ? \
(reg |= (MSK_UART_ENABLE_RXIT | MSK_UART_ENABLE_TXIT)) : \
((uart_its == RX ) ? \
(reg |= (MSK_UART_ENABLE_RXIT & ~MSK_UART_ENABLE_TXIT)) : \
((uart_its == TX) ? \
(reg |= (MSK_UART_ENABLE_TXIT & ~MSK_UART_ENABLE_RXIT)) : \
(reg &= ~(MSK_UART_ENABLE_RXIT | MSK_UART_ENABLE_TXIT)) \
) \
) \
)
#define uart_flow_ctrl_config(reg, uart_flow) ((uart_flow == ON) ? \
(reg |= MSK_UART_ENABLE_FLOW) : \
(reg &= ~MSK_UART_ENABLE_FLOW) \
)
#define uart_loopback_config(reg, uart_loopb) ((uart_loopb == ON) ? \
(reg |= MSK_UART_LOOPBACK) : \
(reg &= ~MSK_UART_LOOPBACK) \
)
#define uart_enable(reg) (reg |= (MSK_UART_ENABLE_RX | MSK_UART_ENABLE_TX))
#define uart_disable(reg) (reg &= ~(MSK_UART_ENABLE_RX | MSK_UART_ENABLE_TX))
#define uart_tx_ready() ((S698PM_REG.uart_status1 & UART_STA_TF) != UART_STA_TF)
#define uart_rx_ready() ((S698PM_REG.uart_status1 & UART_STA_DR) == UART_STA_DR)
#define uart_send_byte(ch) (S698PM_REG.uart_data1 = ch)
/****************************************************************************
* Public Types
****************************************************************************/
#ifndef __ASSEMBLY__
/****************************************************************************
* Inline Functions
****************************************************************************/
/****************************************************************************
* Public Function Prototypes
****************************************************************************/
#ifdef __cplusplus
#define EXTERN extern "C"
extern "C"
{
#else
#define EXTERN extern
#endif
#undef EXTERN
#ifdef __cplusplus
}
#endif
#endif /* __ASSEMBLY__ */
#endif /* __ARCH_SPARC_SRC_S698PM_S698PM_UART_H */