/************************************************************************
* Project : shakti devt board
* Name of the file : uart.h
* Brief Description of file : Header file for uart.
* Name of Author : Niketan Shahapur,Kotteeswaran & Sathya Narayanan N
* Email ID : niketanshahpur@gmail.com, kottee.1@gmail.com, sathya281@gmail.com
Copyright (C) 2019 IIT Madras. All rights reserved.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
************************************************************************/
/**
* @file uart.h
* @brief Header file for uart
* @detail this is the header file for uart.c
*/
#ifndef UART_H
#define UART_H
#include
#include "platform.h"
/* Struct to access UART registers as 32 bit registers */
typedef struct
{
unsigned short baud; /*! Baud rate configuration Register -- 16 bits*/
unsigned short reserv0; /*! reserved */
unsigned int tx_reg; /*! Transmit register -- the value that needs to be tranmitted needs to be written here-32 bits*/
unsigned int rcv_reg; /*! Receive register -- the value that received from uart can be read from here --32 bits*/
unsigned char status; /*! Status register -- Reads various transmit and receive status - 8 bits*/
unsigned char reserv1; /*! reserved */
unsigned short reserv2; /*! reserved */
unsigned short delay; /*! Delays the transmit with specified clock - 16bits*/
unsigned short reserv3; /*! reserved */
unsigned short control; /*! Control Register -- Configures the no. of bits used, stop bits, parity enabled or not - 16bits*/
unsigned short reserv5; /*! reserved */
unsigned char ien; /*! Enables the required interrupts - 8 bits*/
unsigned char reserv6; /*! reserved */
unsigned short reserv7; /*! reserved */
unsigned char iqcycles; /*! 8-bit register that indicates number of input qualification cycles - 8 bits*/
unsigned char reserv8; /*! reserved */
unsigned short reserv9; /*! reserved */
#ifdef USE_RX_THRESHOLD /*! This is to be used only when support is there. */
unsigned char rx_threshold; /*! RX FIFO size configuration register - 8 bits*/
unsigned char reserv10; /*! reserved */
unsigned short reserv11; /*! reserved */
#endif
} uart_struct;
#define STS_RX_THRESHOLD 0x1 << 8
#define BREAK_ERROR 1 << 7
#define FRAME_ERROR 1 << 6
#define OVERRUN 1 << 5
#define PARITY_ERROR 1 << 4
#define STS_RX_FULL 1 << 3
#define STS_RX_NOT_EMPTY 1 << 2
#define STS_TX_FULL 1 << 1
#define STS_TX_EMPTY 1 << 0
/*! UART Interrupt Enable bits description */
#define ENABLE_RX_THRESHOLD 1 << 8
#define ENABLE_BREAK_ERROR 1 << 7
#define ENABLE_FRAME_ERROR 1 << 6
#define ENABLE_OVERRUN 1 << 5
#define ENABLE_PARITY_ERROR 1 << 4
#define ENABLE_RX_FULL 1 << 3
#define ENABLE_RX_NOT_EMPTY 1 << 2
#define ENABLE_TX_FULL 1 << 1
#define ENABLE_TX_EMPTY 1 << 0
#define UARTX_BUFFER_SIZE 10000
/* UART control register */
#define STOP_BITS(x) ( (x & 3) << 1) /*! 00 - 1 stop bits, 01 - 1.5 stop bits; 10 - 2 stop bits; 11 unused */
#define PARITY(x) ( (x & 3) << 3 ) /*! 00 --- No parity; 01 -Odd Parity; 10 - Even Parity; 11 - Unused */
#define UART_TX_RX_LEN(x) ( (x & 0x1F) << 5) /*! Maximum length 32 bits */
extern uart_struct *uart_instance[MAX_UART_COUNT];
extern unsigned char uart0_complete;
extern unsigned char uart1_complete;
extern unsigned char uart2_complete;
extern unsigned int uart0_tx_isr_count ;
extern unsigned int uart0_rcv_isr_count ;
extern unsigned int uart1_tx_isr_count ;
extern unsigned int uart1_rcv_isr_count ;
extern unsigned int uart2_tx_isr_count ;
extern unsigned int uart2_rcv_isr_count ;
#ifdef USE_INTERRUPT
extern unsigned char u0_rcv_char[UARTX_BUFFER_SIZE];
extern unsigned char u1_rcv_char[UARTX_BUFFER_SIZE];
extern unsigned char u2_rcv_char[UARTX_BUFFER_SIZE];
#endif
void uart_init(void);
void set_baud_rate(uart_struct * uart_instance, unsigned int baudrate);
void enable_uart_interrupts(uart_struct * uart_instance, unsigned char interrupt);
void set_uart_rx_threshold(uart_struct * uart_instance, unsigned char rxthreshold);
uint32_t write_uart_character(uart_struct * uart_instance, uint8_t prn_character);
uint32_t write_uart_string(uart_struct * uart_instance, uint8_t * ptr_string);
uint8_t read_uart_character(uart_struct * uart_instance, char * prn_character);
uint8_t read_uart_string(uart_struct * uart_instance, char * ptr_string) ;
void flush_uart(uart_struct * instance);
#ifdef USE_INTERRUPT
unsigned char uart0_isr(void);
unsigned char uart1_isr(void);
unsigned char uart2_isr(void);
#endif
int is_empty(void);
#undef putchar
int putchar(int ch);
#undef getchar
int getchar(void);
#endif