Newer
Older
mbed-os / targets / TARGET_Samsung / TARGET_SIDK_S5JS100 / device / s5js100.h
/****************************************************************************
 *
 * Copyright 2020 Samsung Electronics All Rights Reserved.
 * SPDX-License-Identifier: Apache-2.0
 *
 * Licensed 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 S5JS100_H
#define S5JS100_H

#ifdef __cplusplus
extern "C" {
#endif
/* -------------------------  Interrupt Number Definition  ------------------------ */
#define S5JS100_IRQ_FIRST         (16) /* Vector number of the first external interrupt */
typedef enum IRQn {
    /* -------------------  Cortex-M7 Processor Exceptions Numbers  ------------------- */
    NonMaskableInt_IRQn           = -14,        /*  2 Non Maskable Interrupt          */
    HardFault_IRQn                = -13,        /*  3 HardFault Interrupt             */
    MemoryManagement_IRQn         = -12,        /*  4 Memory Management Interrupt     */
    BusFault_IRQn                 = -11,        /*  5 Bus Fault Interrupt             */
    UsageFault_IRQn               = -10,        /*  6 Usage Fault Interrupt           */
    SVCall_IRQn                   =  -5,        /* 11 SV Call Interrupt               */
    DebugMonitor_IRQn             =  -4,        /* 12 Debug Monitor Interrupt         */
    PendSV_IRQn                   =  -2,        /* 14 Pend SV Interrupt               */
    SysTick_IRQn                  =  -1,        /* 15 System Tick Interrupt           */
    /* ---------------------  S5JS100 Specific Interrupt Numbers  ---------------- */
    S5JS100_IRQ_WDG            = 0,
    S5JS100_IRQ_PMU_ApTimer    = 1,
    S5JS100_IRQ_PMU_AlivePad   = 2,
    S5JS100_IRQ_PMU_JtagInt    = 3,
    S5JS100_IRQ_SSS_SSSINT     = 4,
    S5JS100_IRQ_SSS_MBINT      = 5,
    S5JS100_IRQ_SSS_KMINT      = 6,
    S5JS100_IRQ_DMACINTR       = 7,
    S5JS100_IRQ_SDIO_INTREQ_L  = 8,
    S5JS100_IRQ_TINT0          = 9,
    S5JS100_IRQ_TINT1          = 10,
    S5JS100_IRQ_TINT2          = 11,
    S5JS100_IRQ_TINT3          = 12,
    S5JS100_IRQ_TINT4          = 13,
    S5JS100_IRQ_TINT5          = 14,
    S5JS100_IRQ_GPIO_INTR0     = 15,
    S5JS100_IRQ_GPIO_INTR1     = 16,
    S5JS100_IRQ_GPIO_INTR2     = 17,
    S5JS100_IRQ_USI0           = 18,
    S5JS100_IRQ_USI1           = 19,
    S5JS100_IRQ_SPI            = 20,
    S5JS100_IRQ_I2C            = 21,
    S5JS100_IRQ_PWM_INT0       = 22,
    S5JS100_IRQ_PWM_INT1       = 23,
    S5JS100_IRQ_PWM_INT2       = 24,
    S5JS100_IRQ_PWM_INT3       = 25,
    S5JS100_IRQ_PWM_INT4       = 26,
    S5JS100_IRQ_PPMU           = 27,
    S5JS100_IRQ_EFUSE_WR       = 28,
    S5JS100_IRQ_CM7_CTT_0      = 29,
    S5JS100_IRQ_CM7_CTT_1      = 30,
    S5JS100_IRQ_MAILBOX_AP_INT = 31,
    S5JS100_IRQ_UART0          = 32,
    S5JS100_IRQ_UART1          = 33,
    S5JS100_IRQ_GPADC          = 34,
    S5JS100_IRQ_MCPU_WDT       = 35,
    S5JS100_IRQ_SSS_INT1       = 36,
    S5JS100_IRQ_SSS_INT2       = 37,
    S5JS100_IRQ_SSS_RESET      = 38,
    S5JS100_IRQ_SLEEP          = 39,
    S5JS100_IRQ_TSU0           = 40,
    S5JS100_IRQ_TSU1           = 41,
} IRQn_Type;


/* ================================================================================ */
/* ================      Processor and Core Peripheral Section     ================ */
/* ================================================================================ */

/* --------  Configuration of the Cortex-M7 Processor and Core Peripherals  ------- */
#define __CM7_REV                 0x0201U   /* Core revision r2p1 */
#define __MPU_PRESENT             1         /* MPU present */
#define __DCACHE_PRESENT          1       /* 32KB d-cache */
#define __ICACHE_PRESENT          1         /* 32KB I-cache */

#define __VTOR_PRESENT            1         /* VTOR present or not */
#define __NVIC_PRIO_BITS          3         /* Number of Bits used for Priority Levels */
#define __Vendor_SysTickConfig    0         /* Set to 1 if different SysTick Config is used */

#include <core_cm7.h>                         /* Processor and core peripherals                  */
#include "system_s5js100.h"              /* System Header                                   */
/* ================================================================================ */
/* ================       Device Specific Peripheral Section       ================ */
/* ================================================================================ */

/* -------------------  Start of section using anonymous unions  ------------------ */
#if defined ( __CC_ARM   )
#pragma push
#pragma anon_unions
#elif defined(__ICCARM__)
#pragma language=extended
#elif defined(__GNUC__)
/* anonymous unions are enabled by default */
#elif defined(__TMS470__)
/* anonymous unions are enabled by default */
#elif defined(__TASKING__)
#pragma warning 586
#else
#warning Not supported compiler type
#endif

/*------------- Universal Asynchronous Receiver Transmitter (USI_UART) -----------*/
typedef struct {
    __IO   uint32_t  ULCON;                    /* Offset : 0x000 (R/W) Line Control Register */
    __IO   uint32_t  UCON;                    /* Offset: 0x004 (R/W) Control Register  */
    __IO   uint32_t  UFCON;                     /* Offset: 0x008 (R/W) FIFO Control Register */
    __IO   uint32_t  UMCON;                  /* Offset: 0x00C (R/W) Modem Control Register */
    __IO   uint32_t  UTRSTAT;                  /* Offset: 0x010 (R/W) Tx/Rx Status Register */
    __IO   uint32_t  UERSTAT;                  /* Offset: 0x014 (R) Rx Error Status Register */
    __IO   uint32_t  UFSTAT;                  /* Offset: 0x018 (R) FIFO Status Register */
    __IO   uint32_t  UMSTAT;                  /* Offset: 0x01C (R) Modem Status Register */
    __IO   uint32_t  UTXH;                  /* Offset: 0x020 (W) Transmit Buffer Register */
    __IO   uint32_t  URXH;                  /* Offset: 0x024 (R) Receive Buffer Register */
    __IO   uint32_t  UBRDIV;                  /* Offset: 0x028 (R/W) Baud Rate Divisor Register */
    __IO   uint32_t  UFRACVAL;                  /* Offset: 0x02C (R/W) Divisor Fractional value Register */
    __IO   uint32_t  UINTP;                  /* Offset: 0x030 (R/W) Interrupt Pending Register */
    __IO   uint32_t  UINTS;                  /* Offset: 0x034 (R) Interrupt Source Register */
    __IO   uint32_t  UINTM;                  /* Offset: 0x038 (R/W) Interrupt Mask Register */
    __IO     uint32_t  RESERVED0[1];
    __IO   uint32_t  UFTL_CONF;                  /* Offset: 0x040 (R/W) Filter Configuration Register */

} S5JS100_USI_UART_TypeDef;

/*------------- Universal Asynchronous Receiver Transmitter (UART) -----------*/
typedef struct {
    __IO uint32_t   DR;     // 0x0000
    __IO uint32_t   SR;     // 0x0004
    __IO uint32_t   RESERVED0[4];   // 0x008~0x014
    __IO uint32_t   FR;     // 0x018
    __IO uint32_t   RESERVED1;  // 0x01c
    __IO uint32_t   ILPR;       // 0x020
    __IO uint32_t   IBRD;       // 0x024
    __IO uint32_t   FBRD;       // 0x028
    __IO uint32_t   LCRH;       // 0x02c
    __IO uint32_t   CR;     // 0x030
    __IO uint32_t   IFLS;       // 0x034
    __IO uint32_t   IMSC;       // 0x038
    __IO uint32_t   RIS;        // 0x03C
    __IO uint32_t   MIS;        // 0x040
    __IO uint32_t   ICR;        // 0x044
    __IO uint32_t   DMACR;      // 0x048
    __IO uint32_t   MODESEL;    // 0x04C
} S5JS100_UART_TypeDef;
/* S5JS100 DATA Register Definitions */
/* Line Control register ****************************************************/
#define UART_ULCON_SAMPLING_SHIFT       7
#define UART_ULCON_SAMPLING_MASK        (0x1 << UART_ULCON_SAMPLING_SHIFT)
#define UART_ULCON_SAMPLING_16          (0x0 << UART_ULCON_SAMPLING_SHIFT)
#define UART_ULCON_SAMPLING_8           (0x1 << UART_ULCON_SAMPLING_SHIFT)

#define UART_ULCON_INFRARED_SHIFT       6
#define UART_ULCON_INFRARED_MASK        (0x1 << UART_ULCON_INFRARED_SHIFT)
#define UART_ULCON_INFRARED_NORMAL      (0x0 << UART_ULCON_INFRARED_SHIFT)
#define UART_ULCON_INFRARED_IRTXRX      (0x1 << UART_ULCON_INFRARED_SHIFT)

#define UART_ULCON_PARITY_SHIFT         5
#define UART_ULCON_PARITY_MASK          (0x7 << UART_ULCON_PARITY_SHIFT)
#define UART_ULCON_PARITY_NONE          (0x0 << UART_ULCON_PARITY_SHIFT)
#define UART_ULCON_PARITY_ODD           (0x4 << UART_ULCON_PARITY_SHIFT)
#define UART_ULCON_PARITY_EVEN          (0x5 << UART_ULCON_PARITY_SHIFT)
#define UART_ULCON_PARITY_FORCE1        (0x6 << UART_ULCON_PARITY_SHIFT)
#define UART_ULCON_PARITY_FORCE0        (0x7 << UART_ULCON_PARITY_SHIFT)

#define UART_ULCON_STOPBITS_SHIFT       2
#define UART_ULCON_STOPBITS_MASK        (0x1 << UART_ULCON_STOPBITS_SHIFT)
#define UART_ULCON_STOPBITS_1BIT        (0x0 << UART_ULCON_STOPBITS_SHIFT)
#define UART_ULCON_STOPBITS_2BITS       (0x1 << UART_ULCON_STOPBITS_SHIFT)

#define UART_ULCON_DATABITS_SHIFT       0
#define UART_ULCON_DATABITS_MASK        (0x3 << UART_ULCON_DATABITS_SHIFT)
#define UART_ULCON_DATABITS_5BITS       (0x0 << UART_ULCON_DATABITS_SHIFT)
#define UART_ULCON_DATABITS_6BITS       (0x1 << UART_ULCON_DATABITS_SHIFT)
#define UART_ULCON_DATABITS_7BITS       (0x2 << UART_ULCON_DATABITS_SHIFT)
#define UART_ULCON_DATABITS_8BITS       (0x3 << UART_ULCON_DATABITS_SHIFT)

/* Control register *********************************************************/
#define UART_UCON_TX_DMA_BURST_SHIFT    20
#define UART_UCON_TX_DMA_BURST_MASK     (0x7 << UART_UCON_TX_DMA_BURST_SHIFT)
#define UART_UCON_TX_DMA_BURST_1BYTE    (0x0 << UART_UCON_TX_DMA_BURST_SHIFT)
#define UART_UCON_TX_DMA_BURST_4BYTES   (0x1 << UART_UCON_TX_DMA_BURST_SHIFT)
#define UART_UCON_TX_DMA_BURST_8BYTES   (0x2 << UART_UCON_TX_DMA_BURST_SHIFT)

#define UART_UCON_RX_DMA_BURST_SHIFT    16
#define UART_UCON_RX_DMA_BURST_MASK     (0x7 << UART_UCON_RX_DMA_BURST_SHIFT)
#define UART_UCON_RX_DMA_BURST_1BYTE    (0x0 << UART_UCON_RX_DMA_BURST_SHIFT)
#define UART_UCON_RX_DMA_BURST_4BYTES   (0x1 << UART_UCON_RX_DMA_BURST_SHIFT)
#define UART_UCON_RX_DMA_BURST_8BYTES   (0x2 << UART_UCON_RX_DMA_BURST_SHIFT)
#define UART_UCON_RX_DMA_BURST_16BYTES  (0x3 << UART_UCON_RX_DMA_BURST_SHIFT)

#define UART_UCON_RX_TOUT_SHIFT         12
#define UART_UCON_RX_TOUT_MASK          (0x7 << UART_UCON_RX_TOUT_SHIFT)
#define UART_UCON_RX_TOUT_8FRAMES       (0x0 << UART_UCON_RX_TOUT_SHIFT)
#define UART_UCON_RX_TOUT_16FRAMES      (0x1 << UART_UCON_RX_TOUT_SHIFT)
#define UART_UCON_RX_TOUT_24FRAMES      (0x2 << UART_UCON_RX_TOUT_SHIFT)
#define UART_UCON_RX_TOUT_32FRAMES      (0x3 << UART_UCON_RX_TOUT_SHIFT)
#define UART_UCON_RX_TOUT_40FRAMES      (0x4 << UART_UCON_RX_TOUT_SHIFT)
#define UART_UCON_RX_TOUT_48FRAMES      (0x5 << UART_UCON_RX_TOUT_SHIFT)
#define UART_UCON_RX_TOUT_56FRAMES      (0x6 << UART_UCON_RX_TOUT_SHIFT)
#define UART_UCON_RX_TOUT_64FRAMES      (0x7 << UART_UCON_RX_TOUT_SHIFT)

#define UART_UCON_RX_FIFO_EMPTY_SHIFT   11
#define UART_UCON_RX_FIFO_EMPTY_MASK    (0x1 << UART_UCON_RX_FIFO_EMPTY_SHIFT)
#define UART_UCON_RX_FIFO_EMPTY_DISABLE (0x0 << UART_UCON_RX_FIFO_EMPTY_SHIFT)
#define UART_UCON_RX_FIFO_EMPTY_ENABLE  (0x1 << UART_UCON_RX_FIFO_EMPTY_SHIFT)

#define UART_UCON_RX_TOUT_DMAS_SHIFT    10
#define UART_UCON_RX_TOUT_DMAS_MASK     (0x1 << UART_UCON_RX_TOUT_DMAS_SHIFT)
#define UART_UCON_RX_TOUT_DMAS_DISABLE  (0x0 << UART_UCON_RX_TOUT_DMAS_SHIFT)
#define UART_UCON_RX_TOUT_DMAS_ENABLE   (0x1 << UART_UCON_RX_TOUT_DMAS_SHIFT)

#define UART_UCON_TX_INTTYPE_SHIFT             9
#define UART_UCON_TX_INTTYPE_MASK              (UART_UCON_TX_INTTYPE_SHIFT)
#define UART_UCON_TX_INTTYPE_PULSE             (0x0 << UART_UCON_TX_INTTYPE_SHIFT)
#define UART_UCON_TX_INTTYPE_LEVEL             (0x1 << UART_UCON_TX_INTTYPE_SHIFT)

#define UART_UCON_RX_INTTYPE_SHIFT             8
#define UART_UCON_RX_INTTYPE_MASK              (UART_UCON_RX_INTTYPE_SHIFT)
#define UART_UCON_RX_INTTYPE_PULSE             (0x0 << UART_UCON_RX_INTTYPE_SHIFT)
#define UART_UCON_RX_INTTYPE_LEVEL             (0x1 << UART_UCON_RX_INTTYPE_SHIFT)

#define UART_UCON_RX_TOUTINT_SHIFT      7
#define UART_UCON_RX_TOUTINT_MASK       (0x1 << UART_UCON_RX_TOUTINT_SHIFT)
#define UART_UCON_RX_TOUTINT_DISABLE    (0x0 << UART_UCON_RX_TOUTINT_SHIFT)
#define UART_UCON_RX_TOUTINT_ENABLE     (0x1 << UART_UCON_RX_TOUTINT_SHIFT)

#define UART_UCON_RX_ERRINT_SHIFT       6
#define UART_UCON_RX_ERRINT_MASK        (0x1 << UART_UCON_RX_ERRINT_SHIFT)
#define UART_UCON_RX_ERRINT_DISABLE     (0x0 << UART_UCON_RX_ERRINT_SHIFT)
#define UART_UCON_RX_ERRINT_ENABLE      (0x1 << UART_UCON_RX_ERRINT_SHIFT)

#define UART_UCON_LOOPBACK_SHIFT        5
#define UART_UCON_LOOPBACK_MASK         (0x1 << UART_UCON_LOOPBACK_SHIFT)
#define UART_UCON_LOOPBACK_DISABLE      (0x0 << UART_UCON_LOOPBACK_SHIFT)
#define UART_UCON_LOOPBACK_ENABLE       (0x1 << UART_UCON_LOOPBACK_SHIFT)

#define UART_UCON_SEND_BREAK_SHIFT      4
#define UART_UCON_SEND_BREAK            (0x1 << UART_UCON_SEND_BREAK_SHIFT)

#define UART_UCON_TX_MODE_SHIFT         2
#define UART_UCON_TX_MODE_MASK          (0x3 << UART_UCON_TX_MODE_SHIFT)
#define UART_UCON_TX_MODE_DISABLE       (0x0 << UART_UCON_TX_MODE_SHIFT)
#define UART_UCON_TX_MODE_IRQPOLL       (0x1 << UART_UCON_TX_MODE_SHIFT)
#define UART_UCON_TX_MODE_DMA           (0x2 << UART_UCON_TX_MODE_SHIFT)
#define UART_UCON_TX_MODE_RESERVED      (0x3 << UART_UCON_TX_MODE_SHIFT)

#define UART_UCON_RX_MODE_SHIFT         0
#define UART_UCON_RX_MODE_MASK          (0x3 << UART_UCON_RX_MODE_SHIFT)
#define UART_UCON_RX_MODE_DISABLE       (0x0 << UART_UCON_RX_MODE_SHIFT)
#define UART_UCON_RX_MODE_IRQPOLL       (0x1 << UART_UCON_RX_MODE_SHIFT)
#define UART_UCON_RX_MODE_DMA           (0x2 << UART_UCON_RX_MODE_SHIFT)
#define UART_UCON_RX_MODE_RESERVED      (0x3 << UART_UCON_RX_MODE_SHIFT)

/* FIFO Control register ****************************************************/
#define UART_UFCON_TX_FIFO_TRIG_SHIFT   8
#define UART_UFCON_TX_FIFO_TRIG_MASK    (0x7 << UART_UFCON_TX_FIFO_TRIG_SHIFT)
#define UART_UFCON_TX_FIFO_TRIG_0BYTE   (0x0 << UART_UFCON_TX_FIFO_TRIG_SHIFT)
#define UART_UFCON_TX_FIFO_TRIG_2BYTES  (0x1 << UART_UFCON_TX_FIFO_TRIG_SHIFT)
#define UART_UFCON_TX_FIFO_TRIG_4BYTES  (0x2 << UART_UFCON_TX_FIFO_TRIG_SHIFT)
#define UART_UFCON_TX_FIFO_TRIG_6BYTES  (0x3 << UART_UFCON_TX_FIFO_TRIG_SHIFT)
#define UART_UFCON_TX_FIFO_TRIG_8BYTES  (0x4 << UART_UFCON_TX_FIFO_TRIG_SHIFT)
#define UART_UFCON_TX_FIFO_TRIG_10BYTES (0x4 << UART_UFCON_TX_FIFO_TRIG_SHIFT)
#define UART_UFCON_TX_FIFO_TRIG_12BYTES (0x5 << UART_UFCON_TX_FIFO_TRIG_SHIFT)
#define UART_UFCON_TX_FIFO_TRIG_14BYTES (0x6 << UART_UFCON_TX_FIFO_TRIG_SHIFT)

#define UART_UFCON_RX_FIFO_TRIG_SHIFT   4
#define UART_UFCON_RX_FIFO_TRIG_MASK    (0x7 << UART_UFCON_RX_FIFO_TRIG_SHIFT)
#define UART_UFCON_RX_FIFO_TRIG_0BYTE   (0x0 << UART_UFCON_RX_FIFO_TRIG_SHIFT)
#define UART_UFCON_RX_FIFO_TRIG_2BYTES  (0x1 << UART_UFCON_RX_FIFO_TRIG_SHIFT)
#define UART_UFCON_RX_FIFO_TRIG_4BYTES  (0x2 << UART_UFCON_RX_FIFO_TRIG_SHIFT)
#define UART_UFCON_RX_FIFO_TRIG_6BYTES  (0x3 << UART_UFCON_RX_FIFO_TRIG_SHIFT)
#define UART_UFCON_RX_FIFO_TRIG_8BYTES  (0x4 << UART_UFCON_RX_FIFO_TRIG_SHIFT)
#define UART_UFCON_RX_FIFO_TRIG_10BYTES (0x4 << UART_UFCON_RX_FIFO_TRIG_SHIFT)
#define UART_UFCON_RX_FIFO_TRIG_12BYTES (0x5 << UART_UFCON_RX_FIFO_TRIG_SHIFT)
#define UART_UFCON_RX_FIFO_TRIG_14BYTES (0x6 << UART_UFCON_RX_FIFO_TRIG_SHIFT)

#define UART_UFCON_TX_FIFO_RESET_SHIFT  2
#define UART_UFCON_TX_FIFO_RESET        (0x1 << UART_UFCON_TX_FIFO_RESET_SHIFT)

#define UART_UFCON_RX_FIFO_RESET_SHIFT  1
#define UART_UFCON_RX_FIFO_RESET        (0x1 << UART_UFCON_RX_FIFO_RESET_SHIFT)

#define UART_UFCON_FIFO_SHIFT           0
#define UART_UFCON_FIFO_MASK            (0x1 << UART_UFCON_FIFO_SHIFT)
#define UART_UFCON_FIFO_DISABLE         (0x0 << UART_UFCON_FIFO_SHIFT)
#define UART_UFCON_FIFO_ENABLE          (0x1 << UART_UFCON_FIFO_SHIFT)

/* Modem Control register ***************************************************/
#define UART_UMCON_RTS_TRIG_SHIFT       5
#define UART_UMCON_RTS_TRIG_MASK        (0x7 << UART_UMCON_RTS_TRIG_SHIFT)
#define UART_UMCON_RTS_TRIG_15BYTES     (0x0 << UART_UMCON_RTS_TRIG_SHIFT)
#define UART_UMCON_RTS_TRIG_14BYTES     (0x1 << UART_UMCON_RTS_TRIG_SHIFT)
#define UART_UMCON_RTS_TRIG_12BYTES     (0x2 << UART_UMCON_RTS_TRIG_SHIFT)
#define UART_UMCON_RTS_TRIG_10BYTES     (0x3 << UART_UMCON_RTS_TRIG_SHIFT)
#define UART_UMCON_RTS_TRIG_8BYTES      (0x4 << UART_UMCON_RTS_TRIG_SHIFT)
#define UART_UMCON_RTS_TRIG_6BYTES      (0x5 << UART_UMCON_RTS_TRIG_SHIFT)
#define UART_UMCON_RTS_TRIG_4BYTES      (0x6 << UART_UMCON_RTS_TRIG_SHIFT)
#define UART_UMCON_RTS_TRIG_2BYTES      (0x7 << UART_UMCON_RTS_TRIG_SHIFT)

#define UART_UMCON_AFC_SHIFT            4
#define UART_UMCON_AFC_MASK             (0x1 << UART_UMCON_AFC_SHIFT)
#define UART_UMCON_AFC_DISABLE          (0x0 << UART_UMCON_AFC_SHIFT)
#define UART_UMCON_AFC_ENABLE           (0x1 << UART_UMCON_AFC_SHIFT)

#define UART_UMCON_MODEM_INT_SHIFT      3
#define UART_UMCON_MODEM_INT_MASK       (0x1 << UART_UMCON_MODEM_INT_SHIFT)
#define UART_UMCON_MODEM_INT_DISABLE    (0x0 << UART_UMCON_MODEM_INT_SHIFT)
#define UART_UMCON_MODEM_INT_ENABLE     (0x1 << UART_UMCON_MODEM_INT_SHIFT)

#define UART_UMCON_REQ_TO_SEND_SHIFT    0
#define UART_UMCON_REQ_TO_SEND_MASK     (0x1 << UART_UMCON_REQ_TO_SEND_SHIFT)
#define UART_UMCON_REQ_TO_SEND_HIGH     (0x0 << UART_UMCON_REQ_TO_SEND_SHIFT)
#define UART_UMCON_REQ_TO_SEND_LOW      (0x1 << UART_UMCON_REQ_TO_SEND_SHIFT)

/* Tx/Rx Status register ****************************************************/
#define UART_UTRSTAT_RX_FIFO_CNT_SHIFT  16
#define UART_UTRSTAT_RX_FIFO_CNT_MASK   (0xff << UART_UTRSTAT_RXFIFO_CNT_SHIFT)

#define UART_UTRSTAT_TX_DMA_SHIFT       12
#define UART_UTRSTAT_TX_DMA_MASK        (0xf << UART_UTRSTAT_TX_DMA_SHIFT)
#define UART_UTRSTAT_TX_DMA_IDLE        (0x0 << UART_UTRSTAT_TX_DMA_SHIFT)
#define UART_UTRSTAT_TX_DMA_BURST_REQ   (0x1 << UART_UTRSTAT_TX_DMA_SHIFT)
#define UART_UTRSTAT_TX_DMA_BURST_ACK   (0x2 << UART_UTRSTAT_TX_DMA_SHIFT)
#define UART_UTRSTAT_TX_DMA_BURST_NEXT  (0x3 << UART_UTRSTAT_TX_DMA_SHIFT)
#define UART_UTRSTAT_TX_DMA_SINGLE_REQ  (0x4 << UART_UTRSTAT_TX_DMA_SHIFT)
#define UART_UTRSTAT_TX_DMA_SINGLE_ACK  (0x5 << UART_UTRSTAT_TX_DMA_SHIFT)
#define UART_UTRSTAT_TX_DMA_SINGLE_NEXT (0x6 << UART_UTRSTAT_TX_DMA_SHIFT)
#define UART_UTRSTAT_TX_DMA_LBURST_REQ  (0x7 << UART_UTRSTAT_TX_DMA_SHIFT)
#define UART_UTRSTAT_TX_DMA_LBURST_ACK  (0x8 << UART_UTRSTAT_TX_DMA_SHIFT)
#define UART_UTRSTAT_TX_DMA_LSINGLE_REQ (0x9 << UART_UTRSTAT_TX_DMA_SHIFT)
#define UART_UTRSTAT_TX_DMA_LSINGLE_ACK (0xa << UART_UTRSTAT_TX_DMA_SHIFT)

#define UART_UTRSTAT_RX_DMA_SHIFT       8
#define UART_UTRSTAT_RX_DMA_MASK        (0xf << UART_UTRSTAT_RX_DMA_SHIFT)
#define UART_UTRSTAT_RX_DMA_IDLE        (0x0 << UART_UTRSTAT_RX_DMA_SHIFT)
#define UART_UTRSTAT_RX_DMA_BURST_REQ   (0x1 << UART_UTRSTAT_RX_DMA_SHIFT)
#define UART_UTRSTAT_RX_DMA_BURST_ACK   (0x2 << UART_UTRSTAT_RX_DMA_SHIFT)
#define UART_UTRSTAT_RX_DMA_BURST_NEXT  (0x3 << UART_UTRSTAT_RX_DMA_SHIFT)
#define UART_UTRSTAT_RX_DMA_SINGLE_REQ  (0x4 << UART_UTRSTAT_RX_DMA_SHIFT)
#define UART_UTRSTAT_RX_DMA_SINGLE_ACK  (0x5 << UART_UTRSTAT_RX_DMA_SHIFT)
#define UART_UTRSTAT_RX_DMA_SINGLE_NEXT (0x6 << UART_UTRSTAT_RX_DMA_SHIFT)
#define UART_UTRSTAT_RX_DMA_LBURST_REQ  (0x7 << UART_UTRSTAT_RX_DMA_SHIFT)
#define UART_UTRSTAT_RX_DMA_LBURST_ACK  (0x8 << UART_UTRSTAT_RX_DMA_SHIFT)
#define UART_UTRSTAT_RX_DMA_LSINGLE_REQ (0x9 << UART_UTRSTAT_RX_DMA_SHIFT)
#define UART_UTRSTAT_RX_DMA_LSINGLE_ACK (0xa << UART_UTRSTAT_RX_DMA_SHIFT)

#define UART_UTRSTAT_RX_TOUT_SHIFT      3
#define UART_UTRSTAT_RX_TOUT_MASK       (0x1 << UART_UTRSTAT_RX_TOUT_SHIFT)
#define UART_UTRSTAT_RX_TOUT_NONE       (0x0 << UART_UTRSTAT_RX_TOUT_SHIFT)
#define UART_UTRSTAT_RX_TOUT_TIMEOUT    (0x1 << UART_UTRSTAT_RX_TOUT_SHIFT)

#define UART_UTRSTAT_TX_SHIFT           2
#define UART_UTRSTAT_TX_MASK            (0x1 << UART_UTRSTAT_TX_SHIFT)
#define UART_UTRSTAT_TX_NOT_EMPTY       (0x0 << UART_UTRSTAT_TX_SHIFT)
#define UART_UTRSTAT_TX_EMPTY           (0x1 << UART_UTRSTAT_TX_SHIFT)

#define UART_UTRSTAT_TX_BUF_SHIFT       1
#define UART_UTRSTAT_TX_BUF_MASK        (0x1 << UART_UTRSTAT_TX_BUF_SHIFT)
#define UART_UTRSTAT_TX_BUF_NOT_EMPTY   (0x0 << UART_UTRSTAT_TX_BUF_SHIFT)
#define UART_UTRSTAT_TX_BUF_EMPTY       (0x1 << UART_UTRSTAT_TX_BUF_SHIFT)

#define UART_UTRSTAT_RX_BUF_SHIFT       0
#define UART_UTRSTAT_RX_BUF_MASK        (0x1 << UART_UTRSTAT_RX_BUF_SHIFT)
#define UART_UTRSTAT_RX_BUF_NOT_EMPTY   (0x1 << UART_UTRSTAT_RX_BUF_SHIFT)
#define UART_UTRSTAT_RX_BUF_EMPTY       (0x0 << UART_UTRSTAT_RX_BUF_SHIFT)

/* Rx Error Status register *************************************************/
#define UART_UERSTAT_BREAK_DETECT       0x8
#define UART_UERSTAT_FRAME_ERROR        0x4
#define UART_UERSTAT_PARITY_ERROR       0x2
#define UART_UERSTAT_OVERRUN_ERROR      0x1

/* FIFO status register *****************************************************/
#define UART_UFSTAT_TX_FIFO_FULL_SHIFT  24
#define UART_UFSTAT_TX_FIFO_FULL_MASK   (0x1 << UART_UFSTAT_TX_FIFO_FULL_SHIFT)
#define UART_UFSTAT_TX_FIFO_FULL        (0x1 << UART_UFSTAT_TX_FIFO_FULL_SHIFT)

#define UART_UFSTAT_TX_FIFO_COUNT_SHIFT 16
#define UART_UFSTAT_TX_FIFO_COUNT_MASK  (0xff << UART_UFSTAT_TX_FIFO_COUNT_SHIFT)

#define UART_UFSTAT_RX_FIFO_ERROR_SHIFT 9
#define UART_UFSTAT_RX_FIFO_ERROR_MASK  (0x1 << UART_UFSTAT_RX_FIFO_ERROR_SHIFT)
#define UART_UFSTAT_RX_FIFO_ERROR       (0x1 << UART_UFSTAT_RX_FIFO_ERROR_SHIFT)

#define UART_UFSTAT_RX_FIFO_FULL_SHIFT  8
#define UART_UFSTAT_RX_FIFO_FULL_MASK       (0x1 << UART_UFSTAT_RX_FIFO_FULL_SHIFT)
#define UART_UFSTAT_RX_FIFO_FULL        (0x1 << UART_UFSTAT_RX_FIFO_FULL_SHIFT)

#define UART_UFSTAT_RX_FIFO_COUNT_SHIFT 0
#define UART_UFSTAT_RX_FIFO_COUNT_MASK  (0xff << UART_UFSTAT_RX_FIFO_COUNT_SHIFT)

/* Modem Status register ****************************************************/
#define UART_UMSTAT_DELTA_CTS_SHIFT     4
#define UART_UMSTAT_DELTA_CTS_MASK      (0x1 << UART_UMSTAT_DELTA_CTS_SHIFT)
#define UART_UMSTAT_DELTA_CTS_NOCHANGE  (0x0 << UART_UMSTAT_DELTA_CTS_SHIFT)
#define UART_UMSTAT_DELTA_CTS_CHANGED   (0x1 << UART_UMSTAT_DELTA_CTS_SHIFT)

#define UART_UMSTAT_NCTS_SHIFT          0
#define UART_UMSTAT_NCTS_MASK           (0x1 << UART_UMSTAT_NCTS_SHIFT)
#define UART_UMSTAT_NCTS_HIGH           (0x0 << UART_UMSTAT_NCTS_SHIFT)
#define UART_UMSTAT_NCTS_LOW            (0x1 << UART_UMSTAT_NCTS_SHIFT)

/* INterrupt Pending register ***********************************************/
#define UART_UINTP_MODEM_SHIFT          3
#define UART_UINTP_MODEM_MASK           (0x1 << UART_UINTP_MODEM_SHIFT)
#define UART_UINTP_MODEM                (0x1 << UART_UINTP_MODEM_SHIFT)

#define UART_UINTP_TXD_SHIFT            2
#define UART_UINTP_TXD_MASK             (0x1 << UART_UINTP_TXD_SHIFT)
#define UART_UINTP_TXD                  (0x1 << UART_UINTP_TXD_SHIFT)

#define UART_UINTP_ERROR_SHIFT          1
#define UART_UINTP_ERROR_MASK           (0x1 << UART_UINTP_ERROR_SHIFT)
#define UART_UINTP_ERROR                (0x1 << UART_UINTP_ERROR_SHIFT)

#define UART_UINTP_RXD_SHIFT            0
#define UART_UINTP_RXD_MASK             (0x1 << UART_UINTP_RXD_SHIFT)
#define UART_UINTP_RXD                  (0x1 << UART_UINTP_RXD_SHIFT)

/* Interrupt Source register ************************************************/
#define UART_UINTS_MODEM_SHIFT          3
#define UART_UINTS_MODEM_MASK           (0x1 << UART_UINTS_MODEM_SHIFT)
#define UART_UINTS_MODEM                (0x1 << UART_UINTS_MODEM_SHIFT)

#define UART_UINTS_TXD_SHIFT            2
#define UART_UINTS_TXD_MASK             (0x1 << UART_UINTS_TXD_SHIFT)
#define UART_UINTS_TXD                  (0x1 << UART_UINTS_TXD_SHIFT)

#define UART_UINTS_ERROR_SHIFT          1
#define UART_UINTS_ERROR_MASK           (0x1 << UART_UINTS_ERROR_SHIFT)
#define UART_UINTS_ERROR                (0x1 << UART_UINTS_ERROR_SHIFT)

#define UART_UINTS_RXD_SHIFT            0
#define UART_UINTS_RXD_MASK             (0x1 << UART_UINTS_RXD_SHIFT)
#define UART_UINTS_RXD                  (0x1 << UART_UINTS_RXD_SHIFT)

/* Interrupt Mask register **************************************************/
#define UART_UINTM_MODEM_SHIFT          3
#define UART_UINTM_MODEM_MASK           (0x1 << UART_UINTM_MODEM_SHIFT)

#define UART_UINTM_TXD_SHIFT            2
#define UART_UINTM_TXD_MASK             (0x1 << UART_UINTM_TXD_SHIFT)

#define UART_UINTM_ERROR_SHIFT          1
#define UART_UINTM_ERROR_MASK           (0x1 << UART_UINTM_ERROR_SHIFT)

#define UART_UINTM_RXD_SHIFT            0
#define UART_UINTM_RXD_MASK             (0x1 << UART_UINTM_RXD_SHIFT)


/*----------------------------- S5JS100 ATimer (TIMER) -------------------------------*/
typedef struct {
    __IO   uint32_t  LOAD_VALUE;    /* 0x0 */
    __IO   uint32_t  CTRL;              /* 0x4 */
    __IO   uint32_t  LOAD_CON_VALUE;    /* 0x8 */
    __IO   uint32_t  INT_STATUS;        /* 0xC */

    __IO   uint32_t  INT_CLEAR;     /* 0x10 */
    __IO   uint32_t  INT_ENABLE;        /* 0x14 */
    __IO   uint32_t  RSVD3;         /* 0x18 */
    __IO   uint32_t  RSVD4;         /* 0x1C */

    __IO   uint32_t  RSVD5;         /* 0x20 */
    __IO   uint32_t  RSVD6;         /* 0x24 */
    __IO   uint32_t  RSVD7;         /* 0x28 */
    __IO   uint32_t  RSVD8;         /* 0x2C */

    __IO   uint32_t  RSVD9;         /* 0x30 */
    __IO   uint32_t  CNT_VALUE;         /* 0x34 */
    __IO   uint32_t  RSVD10;            /* 0x38 */
    __IO   uint32_t  RSVD11;            /* 0x3C */
} S5JS100_TIMER_TypeDef;

/*----------------------------- S5JS100 USI (UART/SPI/I2C) -------------------------------*/
typedef struct {
    __IO uint32_t   CONFIG;     // 0x0000
    __IO uint32_t   CON;     // 0x0004
    __IO uint32_t   OPTION;   // 0x008~0x014
    __IO uint32_t   VERSION;     // 0x018
    __IO uint32_t   UART_VERSION;  // 0x01c
    __IO uint32_t   SPI_VERSION;       // 0x020
    __IO uint32_t   I2C_VERSION;       // 0x024
    __IO uint32_t   FIFO_DEPTH;       // 0x028
} S5JS100_USI_TypeDef;

#define USI_CONFIG_UART             1
#define USI_CONFIG_SPI              2
#define USI_CONFIG_I2C              4

#define USI_CON_RST             1

#define USI_OPTION_MASTER           1
#define USI_OPTION_HWACG(x)         ((0x3 & (x)) << 1)

#define USI_VERSION_HW(x)           ((x) & 0xFF)
#define USI_VERSION_SW(x)           (((x) >> 8) & 0xFF)
#define USI_VERSION_UART(x)         (((x) >> 16) & 1)
#define USI_VERSION_SPI(x)          (((x) >> 17) & 1)
#define USI_VERSION_USI(x)          (((x) >> 24) & 0xFF)

#define USI_TXFIFO(x)               (((x) >> 16) & 0x1FF)
#define USI_RXFIFO(x)               ((x) & 0x1FF)


/*-------------------- General Purpose Input Output (GPIO) -------------------*/
/*------------------- Watchdog ----------------------------------------------*/
/* --------------------  End of section using anonymous unions  ------------------- */
#if defined ( __CC_ARM   )
#pragma pop
#elif defined(__ICCARM__)
/* leave anonymous unions enabled */
#elif defined(__GNUC__)
/* anonymous unions are enabled by default */
#elif defined(__TMS470__)
/* anonymous unions are enabled by default */
#elif defined(__TASKING__)
#pragma warning restore
#else
#warning Not supported compiler type
#endif




/* ================================================================================ */
/* ================              Peripheral memory map             ================ */
/* ================================================================================ */

/* Peripheral and SRAM base address                                                 */
#define S5JS100_FLASH_BASE      0x00000000
#define S5JS100_TIMER0_BASE     0x83012000
#define S5JS100_TIMER1_BASE     0x83012100
#define S5JS100_USI0_BASE       0x83014000
#define S5JS100_USI1_BASE       0x83015000
#define S5JS100_ACPU_SFR_PADDR  0x80000000
#define S5JS100_MCPU_ROM        0x80140000
#define S5JS100_MCPU_Debug      0x80150000
#define S5JS100_MCPU_CTI        0x80158000
#define S5JS100_PMU_ALIVE       0x81000000
#define S5JS100_SCMU            0x82000000
#define S5JS100_EFUSE           0x82010000
#define S5JS100_PMU_SYS         0x82020000
#define S5JS100_REG_PAD_CONTROL 0x82021000
#define S5JS100_ACMU            0x83000000
#define S5JS100_WDT_BASE        0x83011000
#define S5JS100_ATIMER          0x83012000
#define S5JS100_SDIOC           0x83020000
#define S5JS100_USI0            0x83014000
#define S5JS100_USI1            0x83015000
#define S5JS100_SPI             0x83016000
#define S5JS100_I2C             0x83017000
#define S5JS100_PWM             0x83018000
#define S5JS100_SSS_SS          0x83100000
#define S5JS100_SSS_MB          0x83110000
#define S5JS100_SSS_KM          0x83120000
#define S5JS100_PUF             0x83130000
#define S5JS100_PDMAC           0x83200000
#define S5JS100_ACPU_BUS_GPV    0x83300000
#define S5JS100_PPMU_ACPU       0x83400000
#define S5JS100_MCMU            0x84000000
#define S5JS100_MWDOG           0x84010000
#define S5JS100_MTIMER          0x84011000
#define S5JS100_NBSLEEP         0x84012000
#define S5JS100_USIM            0x84013000
#define S5JS100_GIC_DST         0x84100000
#define S5JS100_GIC_CPU         0x84101000
#define S5JS100_MDMAC           0x84200000
#define S5JS100_MCPU_BUS_GPV    0x84300000
#define S5JS100_MCPU_BUS_CFG    0x84400000
#define S5JS100_BUS_MONITOR     0x84401000
#define S5JS100_PPMU_MCPU       0x84410000
#define S5JS100_MIFCMU          0x85000000
#define S5JS100_BAAW            0x85010000
#define S5JS100_QSPI_SFR        0x85020000
#define S5JS100_GPADCIF0        0x85021000
#define S5JS100_GPADCIF1        0x85022000
#define S5JS100_MAILBOX         0x85023000
#define S5JS100_UART0_BASE      0x85024000
#define S5JS100_UART1_BASE      0x85025000
#define S5JS100_GPIO_BASE       0x85026000
#define S5JS100_PPMU_MCPU2MIF   0x85030000
#define S5JS100_SYS_CFG         0x85040000
#define S5JS100_MIF_BUS_GPV     0x85300000
#define S5JS100_PPMU_ACPU2MIF   0x85400000
#define S5JS100_RFIP            0x86000000
#define S5JS100_DCXO_CFG        0x87000000
#define S5JS100_MCPU2GNSS0      0x88000000
#define S5JS100_MCPU2GNSS1      0xC0000000
#define S5JS100_NB_MDM00        0xDC000000
#define S5JS100_NB_MDM01        0xDC400000
#define S5JS100_NB_MDM02        0xDC800000
#define S5JS100_NB_MDM03        0xDCC00000
#define S5JS100_NB_MDM04        0xDD000000
#define S5JS100_NB_MDM05        0xDD400000
#define S5JS100_NB_MDM06        0xDD800000
#define S5JS100_NB_MDM07        0xDDC00000
#define S5JS100_NB_MDM08        0xDE000000
#define S5JS100_NB_MDM09        0xDE400000
#define S5JS100_NB_MDM10        0xDE800000
#define S5JS100_NB_MDM11        0xDEC00000
#define S5JS100_NB_MDM12        0xDF000000
#define S5JS100_NB_MDM13        0xDF400000
#define S5JS100_ACPU_CM7_PERI   0xE0000000
#define S5JS100_BOOTMEM_MIRROR  0xFFFF0000
/* ================================================================================ */
/* ================             Peripheral declaration             ================ */
/* ================================================================================ */

#define S5JS100_USI0_UART             ((S5JS100_USI_UART_TypeDef   *) S5JS100_USI0_BASE )
#define S5JS100_USI1_UART             ((S5JS100_USI_UART_TypeDef   *) S5JS100_USI1_BASE )
#define S5JS100_UART0 ((S5JS100_UART_TypeDef *) S5JS100_UART0_BASE )
#define S5JS100_UART1 ((S5JS100_UART_TypeDef *) S5JS100_UART1_BASE )
#define S5JS100_TIMER0            ((S5JS100_TIMER_TypeDef  *) S5JS100_TIMER0_BASE  )
#define S5JS100_TIMER1            ((S5JS100_TIMER_TypeDef  *) S5JS100_TIMER1_BASE  )

#define S5JS100_USI0_REG        ((S5JS100_USI_TypeDef   *) (S5JS100_USI0 + 0xC0))
#define S5JS100_USI1_REG        ((S5JS100_USI_TypeDef   *) (S5JS100_USI1 + 0xC0))

#define S5JS100_SYSCFG_USI0_CONF    (*(uint32_t *)(S5JS100_SYS_CFG + 0x1030))
#define S5JS100_SYSCFG_USI0_IPCLK   (*(uint32_t *)(S5JS100_SYS_CFG + 0x1034))
#define S5JS100_SYSCFG_USI1_CONF    (*(uint32_t *)(S5JS100_SYS_CFG + 0x1038))
#define S5JS100_SYSCFG_USI1_IPCLK   (*(uint32_t *)(S5JS100_SYS_CFG + 0x103C))


/*********************************************************************
*        GPIO 2 / 3 BIT FEILD POS, OUTPUTS
*************************************************************************/

#ifdef __cplusplus
}
#endif

#endif  /* S5JS100_H */