Newer
Older
mbed-os / targets / TARGET_Samsung / TARGET_SIDK_S1SBP6A / device / s1sbp6a_i2c.h
@Heuisam Kwag Heuisam Kwag on 11 Aug 2020 29 KB introduce S1SBP6A
/****************************************************************************
 *
 * 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 __S1SBP6A_I2C_H
#define __S1SBP6A_I2C_H

#define I2C_CTL_OFFSET                     (0x0000)
#define I2C_FIFO_CTL_OFFSET                (0x0004)
#define I2C_TRAILING_CTL_OFFSET            (0x0008)
#define I2C_INT_EN_OFFSET                  (0x0020)
#define I2C_INT_STAT_OFFSET                (0x0024)
#define I2C_FIFO_STAT_OFFSET               (0x0030)
#define I2C_TX_DATA_OFFSET                 (0x0034)
#define I2C_RX_DATA_OFFSET                 (0x0038)
#define I2C_CONF_OFFSET                    (0x0040)
#define I2C_AUTO_CONF_OFFSET               (0x0044)
#define I2C_TIMEOUT_OFFSET                 (0x0048)
#define I2C_MANUAL_CMD_OFFSET              (0x004C)
#define I2C_TRANS_STATUS_OFFSET            (0x0050)
#define I2C_TIMING_HS1_OFFSET              (0x0054)
#define I2C_TIMING_HS2_OFFSET              (0x0058)
#define I2C_TIMING_HS3_OFFSET              (0x005C)
#define I2C_TIMING_FS1_OFFSET              (0x0060)
#define I2C_TIMING_FS2_OFFSET              (0x0064)
#define I2C_TIMING_FS3_OFFSET              (0x0068)
#define I2C_TIMING_SLA_OFFSET              (0x006C)
#define I2C_TIMING_ADDR_OFFSET             (0x0070)


/* I2C_CTL */
#define I2C_CTL_CS_EN_SHIFT                (0)
#define I2C_CTL_NO_TSCLH_SHIFT             (1)
#define I2C_CTL_NO_1CYC_EDG_SDA_SHIFT      (2)
#define I2C_CTL_MASTER_SHIFT               (3)
#define I2C_CTL_RX_MODE_SHIFT              (4)
#define I2C_CTL_TX_MODE_SHIFT              (5)
#define I2C_CTL_RXCHON_SHIFT               (6)
#define I2C_CTL_TXCHON_SHIFT               (7)
#define I2C_CTL_CH_WIDTH_SHIFT             (10)
#define I2C_CTL_BUS_WIDTH_SHIFT            (12)
#define I2C_CTL_RX_BIT_SWAP_SHIFT          (16)
#define I2C_CTL_TX_BIT_SWAP_SHIFT          (19)
#define I2C_CTL_NO_ARB_FAST_SDA_SHIFT      (28)
#define I2C_CTL_SW_RST_SHIFT               (31)

#define I2C_CTL_CS_EN_MASK                ((0x01) << I2C_CTL_CS_EN_SHIFT)
#define I2C_CTL_NO_TSCLH_MASK             ((0x01) << I2C_CTL_NO_TSCLH_SHIFT)
#define I2C_CTL_NO_1CYC_EDG_SDA_MASK      ((0x01) << I2C_CTL_NO_1CYC_EDG_SDA_SHIFT)
#define I2C_CTL_MASTER_MASK               ((0x01) << I2C_CTL_MASTER_SHIFT)
#define I2C_CTL_RX_MODE_MASK              ((0x01) << I2C_CTL_RX_MODE_SHIFT)
#define I2C_CTL_TX_MODE_MASK              ((0x01) << I2C_CTL_TX_MODE_SHIFT)
#define I2C_CTL_RXCHON_MASK               ((0x01) << I2C_CTL_RXCHON_SHIFT)
#define I2C_CTL_TXCHON_MASK               ((0x01) << I2C_CTL_TXCHON_SHIFT)
#define I2C_CTL_CH_WIDTH_MASK             ((0x03) << I2C_CTL_CH_WIDTH_SHIFT)
#define I2C_CTL_BUS_WIDTH_MASK            ((0x03) << I2C_CTL_BUS_WIDTH_SHIFT)
#define I2C_CTL_RX_BIT_SWAP_MASK          ((0x01) << I2C_CTL_RX_BIT_SWAP_SHIFT)
#define I2C_CTL_TX_BIT_SWAP_MASK          ((0x01) << I2C_CTL_TX_BIT_SWAP_SHIFT)
#define I2C_CTL_NO_ARB_FAST_SDA_MASK      ((0x01) << I2C_CTL_NO_ARB_FAST_SDA_SHIFT)
#define I2C_CTL_SW_RST_MASK               ((0x01) << I2C_CTL_SW_RST_SHIFT)

#define I2C_CTL_CS_EN(c)                  ((c) << I2C_CTL_CS_EN_SHIFT)
#define I2C_CTL_NO_TSCLH(c)               ((c) << I2C_CTL_NO_TSCLH_SHIFT)
#define I2C_CTL_NO_1CYC_EDG_SDA(c)        ((c) << I2C_CTL_NO_1CYC_EDG_SDA_SHIFT)
#define I2C_CTL_MASTER(c)                 ((c) << I2C_CTL_MASTER_SHIFT)
#define I2C_CTL_RX_MODE(c)                ((c) << I2C_CTL_RX_MODE_SHIFT)
#define I2C_CTL_TX_MODE(c)                ((c) << I2C_CTL_TX_MODE_SHIFT)
#define I2C_CTL_RXCHON(c)                 ((c) << I2C_CTL_RXCHON_SHIFT)
#define I2C_CTL_TXCHON(c)                 ((c) << I2C_CTL_TXCHON_SHIFT)
#define I2C_CTL_CH_WIDTH(c)               ((c) << I2C_CTL_CH_WIDTH_SHIFT)
#define I2C_CTL_BUS_WIDTH(c)              ((c) << I2C_CTL_BUS_WIDTH_SHIFT)
#define I2C_CTL_RX_BIT_SWAP(c)            ((c) << I2C_CTL_RX_BIT_SWAP_SHIFT)
#define I2C_CTL_TX_BIT_SWAP(c)            ((c) << I2C_CTL_TX_BIT_SWAP_SHIFT)
#define I2C_CTL_NO_ARB_FAST_SDA(c)        ((c) << I2C_CTL_NO_ARB_FAST_SDA_SHIFT)
#define I2C_CTL_SW_RST(c)                 ((c) << I2C_CTL_SW_RST_SHIFT)


/* I2C_FIFO_CTL */
#define I2C_FIFO_CTL_RXFIFO_EN_SHIFT        (0)
#define I2C_FIFO_CTL_TXFIFO_EN_SHIFT        (1)
#define I2C_FIFO_CTL_RXFIFO_RST_SHIFT       (2)
#define I2C_FIFO_CTL_TXFIFO_RST_SHIFT       (3)
#define I2C_FIFO_CTL_RXFIFO_TRIG_SHIFT      (4)
#define I2C_FIFO_CTL_TXFIFO_TRIG_SHIFT      (16)

#define I2C_FIFO_CTL_RXFIFO_EN_MASK        (0x01 << I2C_FIFO_CTL_RXFIFO_EN_SHIFT)
#define I2C_FIFO_CTL_TXFIFO_EN_MASK        (0x01 << I2C_FIFO_CTL_TXFIFO_EN_SHIFT)
#define I2C_FIFO_CTL_RXFIFO_RST_MASK       (0x01 << I2C_FIFO_CTL_RXFIFO_RST_SHIFT)
#define I2C_FIFO_CTL_TXFIFO_RST_MASK       (0x01 << I2C_FIFO_CTL_TXFIFO_RST_SHIFT)
#define I2C_FIFO_CTL_RXFIFO_TRIG_MASK      (0x7F << I2C_FIFO_CTL_RXFIFO_TRIG_SHIFT)
#define I2C_FIFO_CTL_TXFIFO_TRIG_MASK      (0x7F << I2C_FIFO_CTL_TXFIFO_TRIG_SHIFT)

#define I2C_FIFO_CTL_RXFIFO_EN(c)          ((c) << I2C_FIFO_CTL_RXFIFO_EN_SHIFT)
#define I2C_FIFO_CTL_TXFIFO_EN(c)          ((c) << I2C_FIFO_CTL_TXFIFO_EN_SHIFT)
#define I2C_FIFO_CTL_RXFIFO_RST(c)         ((c) << I2C_FIFO_CTL_RXFIFO_RST_SHIFT)
#define I2C_FIFO_CTL_TXFIFO_RST(c)         ((c) << I2C_FIFO_CTL_TXFIFO_RST_SHIFT)
#define I2C_FIFO_CTL_RXFIFO_TRIG(c)        ((c) << I2C_FIFO_CTL_RXFIFO_TRIG_SHIFT)
#define I2C_FIFO_CTL_TXFIFO_TRIG(c)        ((c) << I2C_FIFO_CTL_TXFIFO_TRIG_SHIFT)


/* I2C_TRAILING_CTL */

/* I2C_INT_EN */
#define I2C_INT_EN_TX_ALMOST_EMPTY_EN_SHIFT           (0)
#define I2C_INT_EN_RX_ALMOST_FULL_EN_SHIFT            (1)
#define I2C_INT_EN_TX_UNDERRUN_EN_SHIFT               (2)
#define I2C_INT_EN_TX_OVERRUN_EN_SHIFT                (3)
#define I2C_INT_EN_RX_UNDERRUN_EN_SHIFT               (4)
#define I2C_INT_EN_RX_OVERRUN_EN_SHIFT                (5)
#define I2C_INT_EN_TRAILING_EN_SHIFT                  (6)
#define I2C_INT_EN_XFER_DONE_AUTO_EN_SHIFT            (7)
#define I2C_INT_EN_XFER_ABORT_AUTO_EN_SHIFT           (8)
#define I2C_INT_EN_NO_DEV_ACK_AUTO_EN_SHIFT           (9)
#define I2C_INT_EN_NO_DEV_AUTO_EN_SHIFT               (10)
#define I2C_INT_EN_TIMEOUT_AUTO_EN_SHIFT              (11)
#define I2C_INT_EN_XFER_DONE_NOACK_MANUAL_EN_SHIFT    (12)
#define I2C_INT_EN_XFER_DONE_MANUAL_EN_SHIFT          (13)
#define I2C_INT_EN_LOSE_ARB_MANUAL_EN_SHIFT           (14)
#define I2C_INT_EN_SLAVE_ADDR_MATCH_EN_SHIFT          (15)

#define I2C_INT_EN_ALL_MASK                           (0xFFFF)
#define I2C_INT_EN_TX_ALMOST_EMPTY_EN_MASK            (0x01 << I2C_INT_EN_TX_ALMOST_EMPTY_EN_SHIFT)
#define I2C_INT_EN_RX_ALMOST_FULL_EN_MASK             (0x01 << I2C_INT_EN_RX_ALMOST_FULL_EN_SHIFT)
#define I2C_INT_EN_TX_UNDERRUN_EN_MASK                (0x01 << I2C_INT_EN_TX_UNDERRUN_EN_SHIFT)
#define I2C_INT_EN_TX_OVERRUN_EN_MASK                 (0x01 << I2C_INT_EN_TX_OVERRUN_EN_SHIFT)
#define I2C_INT_EN_RX_UNDERRUN_EN_MASK                (0x01 << I2C_INT_EN_RX_UNDERRUN_EN_SHIFT)
#define I2C_INT_EN_RX_OVERRUN_EN_MASK                 (0x01 << I2C_INT_EN_RX_OVERRUN_EN_SHIFT)
#define I2C_INT_EN_TRAILING_EN_MASK                   (0x01 << I2C_INT_EN_TRAILING_EN_SHIFT)
#define I2C_INT_EN_XFER_DONE_AUTO_EN_MASK             (0x01 << I2C_INT_EN_XFER_DONE_AUTO_EN_SHIFT)
#define I2C_INT_EN_XFER_ABORT_AUTO_EN_MASK            (0x01 << I2C_INT_EN_XFER_ABORT_AUTO_EN_SHIFT)
#define I2C_INT_EN_NO_DEV_ACK_AUTO_EN_MASK            (0x01 << I2C_INT_EN_NO_DEV_ACK_AUTO_EN_SHIFT)
#define I2C_INT_EN_NO_DEV_AUTO_EN_MASK                (0x01 << I2C_INT_EN_NO_DEV_AUTO_EN_SHIFT)
#define I2C_INT_EN_TIMEOUT_AUTO_EN_MASK               (0x01 << I2C_INT_EN_TIMEOUT_AUTO_EN_SHIFT)
#define I2C_INT_EN_XFER_DONE_NOACK_MANUAL_EN_MASK     (0x01 << I2C_INT_EN_XFER_DONE_NOACK_MANUAL_EN_SHIFT)
#define I2C_INT_EN_XFER_DONE_MANUAL_EN_MASK           (0x01 << I2C_INT_EN_XFER_DONE_MANUAL_EN_SHIFT)
#define I2C_INT_EN_LOSE_ARB_MANUAL_EN_MASK            (0x01 << I2C_INT_EN_LOSE_ARB_MANUAL_EN_SHIFT)
#define I2C_INT_EN_SLAVE_ADDR_MATCH_EN_MASK           (0x01 << I2C_INT_EN_SLAVE_ADDR_MATCH_EN_SHIFT)

#define I2C_INT_EN_TX_ALMOST_EMPTY_EN(c)              ((c) << I2C_INT_EN_TX_ALMOST_EMPTY_EN_SHIFT)
#define I2C_INT_EN_RX_ALMOST_FULL_EN(c)               ((c) << I2C_INT_EN_RX_ALMOST_FULL_EN_SHIFT)
#define I2C_INT_EN_TX_UNDERRUN_EN(c)                  ((c) << I2C_INT_EN_TX_UNDERRUN_EN_SHIFT)
#define I2C_INT_EN_TX_OVERRUN_EN(c)                   ((c) << I2C_INT_EN_TX_OVERRUN_EN_SHIFT)
#define I2C_INT_EN_RX_UNDERRUN_EN(c)                  ((c) << I2C_INT_EN_RX_UNDERRUN_EN_SHIFT)
#define I2C_INT_EN_RX_OVERRUN_EN(c)                   ((c) << I2C_INT_EN_RX_OVERRUN_EN_SHIFT)
#define I2C_INT_EN_TRAILING_EN(c)                     ((c) << I2C_INT_EN_TRAILING_EN_SHIFT)
#define I2C_INT_EN_XFER_DONE_AUTO_EN(c)               ((c) << I2C_INT_EN_XFER_DONE_AUTO_EN_SHIFT)
#define I2C_INT_EN_XFER_ABORT_AUTO_EN(c)              ((c) << I2C_INT_EN_XFER_ABORT_AUTO_EN_SHIFT)
#define I2C_INT_EN_NO_DEV_ACK_AUTO_EN(c)              ((c) << I2C_INT_EN_NO_DEV_ACK_AUTO_EN_SHIFT)
#define I2C_INT_EN_NO_DEV_AUTO_EN(c)                  ((c) << I2C_INT_EN_NO_DEV_AUTO_EN_SHIFT)
#define I2C_INT_EN_TIMEOUT_AUTO_EN(c)                 ((c) << I2C_INT_EN_TIMEOUT_AUTO_EN_SHIFT)
#define I2C_INT_EN_XFER_DONE_NOACK_MANUAL_EN(c)       ((c) << I2C_INT_EN_XFER_DONE_NOACK_MANUAL_EN_SHIFT)
#define I2C_INT_EN_XFER_DONE_MANUAL_EN(c)             ((c) << I2C_INT_EN_XFER_DONE_MANUAL_EN_SHIFT)
#define I2C_INT_EN_LOSE_ARB_MANUAL_EN(c)              ((c) << I2C_INT_EN_LOSE_ARB_MANUAL_EN_SHIFT)
#define I2C_INT_EN_SLAVE_ADDR_MATCH_EN(c)             ((c) << I2C_INT_EN_SLAVE_ADDR_MATCH_EN_SHIFT)

/* I2C_INT_STAT */
#define I2C_INT_STAT_TX_ALMOST_EMPTY_SHIFT            (0)
#define I2C_INT_STAT_RX_ALMOST_FULL_SHIFT             (1)
#define I2C_INT_STAT_TX_OVERRUN_SHIFT                 (3)
#define I2C_INT_STAT_RX_UNDERRUN_SHIFT                (4)
#define I2C_INT_STAT_RX_OVERRUN_SHIFT                 (5)
#define I2C_INT_STAT_TRAILING_SHIFT                   (6)
#define I2C_INT_STAT_XFER_DONE_AUTO_SHIFT             (7)
#define I2C_INT_STAT_XFER_ABORT_AUTO_SHIFT            (8)
#define I2C_INT_STAT_NO_DEV_ACK_AUTO_SHIFT            (9)
#define I2C_INT_STAT_NO_DEV_AUTO_SHIFT                (10)
#define I2C_INT_STAT_TIMEOUT_AUTO_SHIFT               (11)
#define I2C_INT_STAT_XFER_DONE_NOACK_MANUAL_SHIFT     (12)
#define I2C_INT_STAT_XFER_DONE_MANUAL_SHIFT           (13)
#define I2C_INT_STAT_LOSE_ARB_MANUAL_SHIFT            (14)
#define I2C_INT_STAT_SLAVE_ADDR_MATCH_SHIFT           (15)

#define I2C_INT_STAT_TX_ALMOST_EMPTY_MASK           (0x01 << I2C_INT_STAT_TX_ALMOST_EMPTY_SHIFT)
#define I2C_INT_STAT_RX_ALMOST_FULL_MASK            (0x01 << I2C_INT_STAT_RX_ALMOST_FULL_SHIFT)
#define I2C_INT_STAT_TX_OVERRUN_MASK                (0x01 << I2C_INT_STAT_TX_OVERRUN_SHIFT)
#define I2C_INT_STAT_RX_UNDERRUN_MASK               (0x01 << I2C_INT_STAT_RX_UNDERRUN_SHIFT)
#define I2C_INT_STAT_RX_OVERRUN_MASK                (0x01 << I2C_INT_STAT_RX_OVERRUN_SHIFT)
#define I2C_INT_STAT_TRAILING_MASK                  (0x01 << I2C_INT_STAT_TRAILING_SHIFT)
#define I2C_INT_STAT_XFER_DONE_AUTO_MASK            (0x01 << I2C_INT_STAT_XFER_DONE_AUTO_SHIFT)
#define I2C_INT_STAT_XFER_ABORT_AUTO_MASK           (0x01 << I2C_INT_STAT_XFER_ABORT_AUTO_SHIFT)
#define I2C_INT_STAT_NO_DEV_ACK_AUTO_MASK           (0x01 << I2C_INT_STAT_NO_DEV_ACK_AUTO_SHIFT)
#define I2C_INT_STAT_NO_DEV_AUTO_MASK               (0x01 << I2C_INT_STAT_NO_DEV_AUTO_SHIFT)
#define I2C_INT_STAT_TIMEOUT_AUTO_MASK              (0x01 << I2C_INT_STAT_TIMEOUT_AUTO_SHIFT)
#define I2C_INT_STAT_XFER_DONE_NOACK_MANUAL_MASK    (0x01 << I2C_INT_STAT_XFER_DONE_NOACK_MANUAL_SHIFT)
#define I2C_INT_STAT_XFER_DONE_MANUAL_MASK          (0x01 << I2C_INT_STAT_XFER_DONE_MANUAL_SHIFT)
#define I2C_INT_STAT_LOSE_ARB_MANUAL_MASK           (0x01 << I2C_INT_STAT_LOSE_ARB_MANUAL_SHIFT)
#define I2C_INT_STAT_SLAVE_ADDR_MATCH_MASK          (0x01 << I2C_INT_STAT_SLAVE_ADDR_MATCH_SHIFT)

#define I2C_INT_STAT_TX_ALMOST_EMPTY(c)             ((c) << I2C_INT_STAT_TX_ALMOST_EMPTY_SHIFT)
#define I2C_INT_STAT_RX_ALMOST_FULL(c)              ((c) << I2C_INT_STAT_RX_ALMOST_FULL_SHIFT)
#define I2C_INT_STAT_TX_OVERRUN(c)                  ((c) << I2C_INT_STAT_TX_OVERRUN_SHIFT)
#define I2C_INT_STAT_RX_UNDERRUN(c)                 ((c) << I2C_INT_STAT_RX_UNDERRUN_SHIFT)
#define I2C_INT_STAT_RX_OVERRUN(c)                  ((c) << I2C_INT_STAT_RX_OVERRUN_SHIFT)
#define I2C_INT_STAT_TRAILING(c)                    ((c) << I2C_INT_STAT_TRAILING_SHIFT)
#define I2C_INT_STAT_XFER_DONE_AUTO(c)              ((c) << I2C_INT_STAT_XFER_DONE_AUTO_SHIFT)
#define I2C_INT_STAT_XFER_ABORT_AUTO(c)             ((c) << I2C_INT_STAT_XFER_ABORT_AUTO_SHIFT)
#define I2C_INT_STAT_NO_DEV_ACK_AUTO(c)             ((c) << I2C_INT_STAT_NO_DEV_ACK_AUTO_SHIFT)
#define I2C_INT_STAT_NO_DEV_AUTO(c)                 ((c) << I2C_INT_STAT_NO_DEV_AUTO_SHIFT)
#define I2C_INT_STAT_TIMEOUT_AUTO(c)                ((c) << I2C_INT_STAT_TIMEOUT_AUTO_SHIFT)
#define I2C_INT_STAT_XFER_DONE_NOACK_MANUAL(c)      ((c) << I2C_INT_STAT_XFER_DONE_NOACK_MANUAL_SHIFT)
#define I2C_INT_STAT_XFER_DONE_MANUAL(c)            ((c) << I2C_INT_STAT_XFER_DONE_MANUAL_SHIFT)
#define I2C_INT_STAT_LOSE_ARB_MANUAL(c)             ((c) << I2C_INT_STAT_LOSE_ARB_MANUAL_SHIFT)
#define I2C_INT_STAT_SLAVE_ADDR_MATCH_(c)           ((c) << I2C_INT_STAT_SLAVE_ADDR_MATCH_SHIFT)

/* I2C_FIFO_STAT */
#define I2C_FIFO_STAT_TX_FIFO_LEVEL_SHIFT           (0)
#define I2C_FIFO_STAT_TX_FIFO_FULL_SHIFT            (7)
#define I2C_FIFO_STAT_TX_FIFO_EMPTY_SHIFT           (8)
#define I2C_FIFO_STAT_RX_FIFO_LEVEL_SHIFT           (16)
#define I2C_FIFO_STAT_RX_FIFO_FULL_SHIFT            (23)
#define I2C_FIFO_STAT_RX_FIFO_EMPTY_SHIFT           (24)

#define I2C_FIFO_STAT_TX_FIFO_LEVEL_MASK            (0x7F << I2C_FIFO_STAT_TX_FIFO_LEVEL_SHIFT)
#define I2C_FIFO_STAT_TX_FIFO_FULL_MASK             (0x01 << I2C_FIFO_STAT_TX_FIFO_FULL_SHIFT)
#define I2C_FIFO_STAT_TX_FIFO_EMPTY_MASK            (0x01 << I2C_FIFO_STAT_TX_FIFO_EMPTY_SHIFT)
#define I2C_FIFO_STAT_RX_FIFO_LEVEL_MASK            (0x7F << I2C_FIFO_STAT_RX_FIFO_LEVEL_SHIFT)
#define I2C_FIFO_STAT_RX_FIFO_FULL_MASK             (0x01 << I2C_FIFO_STAT_RX_FIFO_FULL_SHIFT)
#define I2C_FIFO_STAT_RX_FIFO_EMPTY_MASK            (0x01 << I2C_FIFO_STAT_RX_FIFO_EMPTY_SHIFT)

#define I2C_FIFO_STAT_TX_FIFO_LEVEL(c)              ((c) << I2C_FIFO_STAT_TX_FIFO_LEVEL_SHIFT)
#define I2C_FIFO_STAT_TX_FIFO_FULL(c)               ((c) << I2C_FIFO_STAT_TX_FIFO_FULL_SHIFT)
#define I2C_FIFO_STAT_TX_FIFO_EMPTY(c)              ((c) << I2C_FIFO_STAT_TX_FIFO_EMPTY_SHIFT)
#define I2C_FIFO_STAT_RX_FIFO_LEVEL(c)              ((c) << I2C_FIFO_STAT_RX_FIFO_LEVEL_SHIFT)
#define I2C_FIFO_STAT_RX_FIFO_FULL(c)               ((c) << I2C_FIFO_STAT_RX_FIFO_FULL_SHIFT)
#define I2C_FIFO_STAT_RX_FIFO_EMPTY(c)              ((c) << I2C_FIFO_STAT_RX_FIFO_EMPTY_SHIFT)

#define I2C_CONF_TSTOPTOIDLE_SHIFT           (0)
#define I2C_CONF_STRCH_EN_SHIFT              (8)
#define I2C_CONF_STRCH_MANUAL_SHIFT          (9)
#define I2C_CONF_FLT_CYCLE_SDA_SHIFT         (13)
#define I2C_CONF_FLT_CYCLE_SCL_SHIFT         (16)
#define I2C_CONF_FILTER_EN_SDA_SHIFT         (27)
#define I2C_CONF_FILTER_EN_SCL_SHIFT         (28)
#define I2C_CONF_HS_MODE_SHIFT               (29)
#define I2C_CONF_ADDR_MODE_SHIFT             (30)
#define I2C_CONF_AUTO_MODE_SHIFT             (31)

#define I2C_CONF_TSTOPTOIDLE_MASK            (0xFF << I2C_CONF_TSTOPTOIDLE_SHIFT)
#define I2C_CONF_STRCH_EN_MASK               (0x01 << I2C_CONF_STRCH_EN_SHIFT)
#define I2C_CONF_STRCH_MANUAL_MASK           (0x01 << I2C_CONF_STRCH_MANUAL_SHIFT)
#define I2C_CONF_FLT_CYCLE_SDA_MASK          (0x07 << I2C_CONF_FLT_CYCLE_SDA_SHIFT)
#define I2C_CONF_FLT_CYCLE_SCL_MASK          (0x07 << I2C_CONF_FLT_CYCLE_SCL_SHIFT)
#define I2C_CONF_FILTER_EN_SDA_MASK          (0x01 << I2C_CONF_FILTER_EN_SDA_SHIFT)
#define I2C_CONF_FILTER_EN_SCL_MASK          (0x01 << I2C_CONF_FILTER_EN_SCL_SHIFT)
#define I2C_CONF_HS_MODE_MASK                (0x01 << I2C_CONF_HS_MODE_SHIFT)
#define I2C_CONF_ADDR_MODE_MASK              (0x01 << I2C_CONF_ADDR_MODE_SHIFT)
#define I2C_CONF_AUTO_MODE_MASK              (0x01 << I2C_CONF_AUTO_MODE_SHIFT)

#define I2C_CONF_TSTOPTOIDLE(c)              ((c) << I2C_CONF_TSTOPTOIDLE_SHIFT)
#define I2C_CONF_STRCH_EN(c)                 ((c) << I2C_CONF_STRCH_EN_SHIFT)
#define I2C_CONF_STRCH_MANUAL(c)             ((c) << I2C_CONF_STRCH_MANUAL_SHIFT)
#define I2C_CONF_FLT_CYCLE_SDA(c)            ((c) << I2C_CONF_FLT_CYCLE_SDA_SHIFT)
#define I2C_CONF_FLT_CYCLE_SCL(c)            ((c) << I2C_CONF_FLT_CYCLE_SCL_SHIFT)
#define I2C_CONF_FILTER_EN_SDA(c)            ((c) << I2C_CONF_FILTER_EN_SDA_SHIFT)
#define I2C_CONF_FILTER_EN_SCL(c)            ((c) << I2C_CONF_FILTER_EN_SCL_SHIFT)
#define I2C_CONF_HS_MODE(c)                  ((c) << I2C_CONF_HS_MODE_SHIFT)
#define I2C_CONF_ADDR_MODE(c)                ((c) << I2C_CONF_ADDR_MODE_SHIFT)
#define I2C_CONF_AUTO_MODE(c)                ((c) << I2C_CONF_AUTO_MODE_SHIFT)

/* I2C_AUTO_CONF */
#define I2C_AUTO_CONF_TRANS_LEN_SHIFT         (0)
#define I2C_AUTO_CONF_READ_WRITE_SHIFT        (16)
#define I2C_AUTO_CONF_STOP_AFTER_TRANS_SHIFT  (17)
#define I2C_AUTO_CONF_MASTER_RUN_SHIFT        (31)

#define I2C_AUTO_CONF_TRANS_LEN_MASK          (0xFF << I2C_AUTO_CONF_TRANS_LEN_SHIFT)
#define I2C_AUTO_CONF_READ_WRITE_MASK         (0x01 << I2C_AUTO_CONF_READ_WRITE_SHIFT)
#define I2C_AUTO_CONF_STOP_AFTER_TRANS_MASK   (0x01 << I2C_AUTO_CONF_STOP_AFTER_TRANS_SHIFT)
#define I2C_AUTO_CONF_MASTER_RUN_MASK         (0x01 << I2C_AUTO_CONF_MASTER_RUN_SHIFT)

#define I2C_AUTO_CONF_TRANS_LEN(c)            ((c) << I2C_AUTO_CONF_TRANS_LEN_SHIFT)
#define I2C_AUTO_CONF_READ_WRITE(c)           ((c) << I2C_AUTO_CONF_READ_WRITE_SHIFT)
#define I2C_AUTO_CONF_STOP_AFTER_TRANS(c)     ((c) << I2C_AUTO_CONF_STOP_AFTER_TRANS_SHIFT)
#define I2C_AUTO_CONF_MASTER_RUN(c)           ((c) << I2C_AUTO_CONF_MASTER_RUN_SHIFT)

/* I2C_TIMEOUT */
#define I2C_TIMEOUT_TOUT_COUNT_SHIFT          (0)
#define I2C_TIMEOUT_TIMEOUT_EN_SHIFT          (31)

#define I2C_TIMEOUT_TOUT_COUNT_MASK           (0xFF << I2C_TIMEOUT_TOUT_COUNT_SHIFT)
#define I2C_TIMEOUT_TIMEOUT_EN_MASK           (0x01 << I2C_TIMEOUT_TIMEOUT_EN_SHIFT)

#define I2C_TIMEOUT_TOUT_COUNT(c)             ((c) << I2C_TIMEOUT_TOUT_COUNT_SHIFT)
#define I2C_TIMEOUT_TIMEOUT_EN(c)             ((c) << I2C_TIMEOUT_TIMEOUT_EN_SHIFT)

/* I2C_MANUAL_CMD */
#define I2C_MANUAL_CMD_SEND_START_SHIFT       (0)
#define I2C_MANUAL_CMD_SEND_RESTART_SHIFT     (1)
#define I2C_MANUAL_CMD_SEND_STOP_SHIFT        (2)
#define I2C_MANUAL_CMD_SEND_DATA_SHIFT        (3)
#define I2C_MANUAL_CMD_READ_DATA_SHIFT        (4)
#define I2C_MANUAL_CMD_RX_ACK_SHIFT           (6)
#define I2C_MANUAL_CMD_RX_DATA_SHIFT          (16)
#define I2C_MANUAL_CMD_TX_DATA_SHIFT          (24)

#define I2C_MANUAL_CMD_SEND_START_MASK        (0x01 << I2C_MANUAL_CMD_SEND_START_SHIFT)
#define I2C_MANUAL_CMD_SEND_RESTART_MASK      (0x01 << I2C_MANUAL_CMD_SEND_RESTART_SHIFT)
#define I2C_MANUAL_CMD_SEND_STOP_MASK         (0x01 << I2C_MANUAL_CMD_SEND_STOP_SHIFT)
#define I2C_MANUAL_CMD_SEND_DATA_MASK         (0x01 << I2C_MANUAL_CMD_SEND_DATA_SHIFT)
#define I2C_MANUAL_CMD_READ_DATA_MASK         (0x01 << I2C_MANUAL_CMD_READ_DATA_SHIFT)
#define I2C_MANUAL_CMD_RX_ACK_MASK            (0x01 << I2C_MANUAL_CMD_RX_ACK_SHIFT)
#define I2C_MANUAL_CMD_RX_DATA_MASK           (0xFF << I2C_MANUAL_CMD_RX_DATA_SHIFT)
#define I2C_MANUAL_CMD_TX_DATA_MASK           (0xFF << I2C_MANUAL_CMD_TX_DATA_SHIFT)

#define I2C_MANUAL_CMD_SEND_START(c)          ((c) << I2C_MANUAL_CMD_SEND_START_SHIFT)
#define I2C_MANUAL_CMD_SEND_RESTART(c)        ((c) << I2C_MANUAL_CMD_SEND_RESTART_SHIFT)
#define I2C_MANUAL_CMD_SEND_STOP(c)           ((c) << I2C_MANUAL_CMD_SEND_STOP_SHIFT)
#define I2C_MANUAL_CMD_SEND_DATA(c)           ((c) << I2C_MANUAL_CMD_SEND_DATA_SHIFT)
#define I2C_MANUAL_CMD_READ_DATA(c)           ((c) << I2C_MANUAL_CMD_READ_DATA_SHIFT)
#define I2C_MANUAL_CMD_RX_ACK(c)              ((c) << I2C_MANUAL_CMD_RX_ACK_SHIFT)
#define I2C_MANUAL_CMD_RX_DATA(c)             ((c) << I2C_MANUAL_CMD_RX_DATA_SHIFT)
#define I2C_MANUAL_CMD_TX_DATA(c)             ((c) << I2C_MANUAL_CMD_TX_DATA_SHIFT)

/* I2C_TRANS_STATUS  */
#define I2C_TRANS_STATUS_MASTER_ST_SHIFT            (0)
#define I2C_TRANS_STATUS_SLAVE_SCL_STRETCH_SHIFT    (15)
#define I2C_TRANS_STATUS_SLAVE_BUSY_SHIFT           (16)
#define I2C_TRANS_STATUS_MASTER_BUSY_SHIFT          (17)
#define I2C_TRANS_STATUS_STOP_COND_SHIFT            (18)
#define I2C_TRANS_STATUS_SLAVE_RW_SHIFT             (19)

#define I2C_TRANS_STATUS_MASTER_ST_MASK             (0x0F << I2C_TRANS_STATUS_MASTER_ST_SHIFT)
#define I2C_TRANS_STATUS_SLAVE_SCL_STRETCH_MASK     (0x00 << I2C_TRANS_STATUS_SLAVE_SCL_STRETCH_SHIFT)
#define I2C_TRANS_STATUS_SLAVE_BUSY_MASK            (0x00 << I2C_TRANS_STATUS_SLAVE_BUSY_SHIFT)
#define I2C_TRANS_STATUS_MASTER_BUSY_MASK           (0x00 << I2C_TRANS_STATUS_MASTER_BUSY_SHIFT)
#define I2C_TRANS_STATUS_STOP_COND_MASK             (0x00 << I2C_TRANS_STATUS_STOP_COND_SHIFT)
#define I2C_TRANS_STATUS_SLAVE_RW_MASK              (0x00 << I2C_TRANS_STATUS_SLAVE_RW_SHIFT)

#define I2C_TRANS_STATUS_MASTER_ST(c)               ((c) << I2C_TRANS_STATUS_MASTER_ST_SHIFT)
#define I2C_TRANS_STATUS_SLAVE_SCL_STRETCH(c)       ((c) << I2C_TRANS_STATUS_SLAVE_SCL_STRETCH_SHIFT)
#define I2C_TRANS_STATUS_SLAVE_BUSY(c)              ((c) << I2C_TRANS_STATUS_SLAVE_BUSY_SHIFT)
#define I2C_TRANS_STATUS_MASTER_BUSY(c)             ((c) << I2C_TRANS_STATUS_MASTER_BUSY_SHIFT)
#define I2C_TRANS_STATUS_STOP_COND(c)               ((c) << I2C_TRANS_STATUS_STOP_COND_SHIFT)
#define I2C_TRANS_STATUS_SLAVE_RW(c)                ((c) << I2C_TRANS_STATUS_SLAVE_RW_SHIFT)

/* I2C_TIMING_HS1 */
#define I2C_TIMING_HS1_TSDA_SU_HS_SHIFT             (0)
#define I2C_TIMING_HS1_TSTOP_SU_HS_SHIFT            (8)
#define I2C_TIMING_HS1_TSTART_HD_HS_SHIFT           (16)
#define I2C_TIMING_HS1_TSTART_SU_HS_SHIFT           (24)

#define I2C_TIMING_HS1_TSDA_SU_HS_MASK              (0xFF << I2C_TIMING_HS1_TSDA_SU_HS_SHIFT)
#define I2C_TIMING_HS1_TSTOP_SU_HS_MASK             (0xFF << I2C_TIMING_HS1_TSTOP_SU_HS_SHIFT)
#define I2C_TIMING_HS1_TSTART_HD_HS_MASK            (0xFF << I2C_TIMING_HS1_TSTART_HD_HS_SHIFT)
#define I2C_TIMING_HS1_TSTART_SU_HS_MASK            (0xFF << I2C_TIMING_HS1_TSTART_SU_HS_SHIFT)

#define I2C_TIMING_HS1_TSDA_SU_HS(c)                ((c) << I2C_TIMING_HS1_TSDA_SU_HS_SHIFT)
#define I2C_TIMING_HS1_TSTOP_SU_HS(c)               ((c) << I2C_TIMING_HS1_TSTOP_SU_HS_SHIFT)
#define I2C_TIMING_HS1_TSTART_HD_HS(c)              ((c) << I2C_TIMING_HS1_TSTART_HD_HS_SHIFT)
#define I2C_TIMING_HS1_TSTART_SU_HS(c)              ((c) << I2C_TIMING_HS1_TSTART_SU_HS_SHIFT)


/* I2C_TIMING_HS2 */
#define I2C_TIMING_HS2_TSCL_H_HS_SHIFT              (0)
#define I2C_TIMING_HS2_TSCL_L_HS_SHIFT              (8)
#define I2C_TIMING_HS2_TDATA_SU_HS_SHIFT            (24)

#define I2C_TIMING_HS2_TSCL_H_HS_MASK               (0xFF << I2C_TIMING_HS2_TSCL_H_HS_SHIFT)
#define I2C_TIMING_HS2_TSCL_L_HS_MASK               (0xFF << I2C_TIMING_HS2_TSCL_L_HS_SHIFT)
#define I2C_TIMING_HS2_TDATA_SU_HS_MASK             (0xFF << I2C_TIMING_HS2_TDATA_SU_HS_SHIFT)

#define I2C_TIMING_HS2_TSCL_H_HS(c)                 ((c) << I2C_TIMING_HS2_TSCL_H_HS_SHIFT)
#define I2C_TIMING_HS2_TSCL_L_HS(c)                 ((c) << I2C_TIMING_HS2_TSCL_L_HS_SHIFT)
#define I2C_TIMING_HS2_TDATA_SU_HS(c)               ((c) << I2C_TIMING_HS2_TDATA_SU_HS_SHIFT)



/* I2C_TIMING_HS3 */
#define I2C_TIMING_HS3_TSR_RELEASE_SHIFT            (0)
#define I2C_TIMING_HS3_CLK_DIV_SHIFT                (16)

#define I2C_TIMING_HS3_TSR_RELEASE_MASK             (0xFF << I2C_TIMING_HS3_TSR_RELEASE_SHIFT)
#define I2C_TIMING_HS3_CLK_DIV_MASK                 (0xFF << I2C_TIMING_HS3_CLK_DIV_SHIFT)

#define I2C_TIMING_HS3_TSR_RELEASE(c)               ((c) << I2C_TIMING_HS3_TSR_RELEASE_SHIFT)
#define I2C_TIMING_HS3_CLK_DIV(c)                   ((c) << I2C_TIMING_HS3_CLK_DIV_SHIFT)
/* I2C_TIMING_FS1 */
#define I2C_TIMING_FS1_TSDA_SU_FS_SHIFT             (0)
#define I2C_TIMING_FS1_TSTOP_SU_FS_SHIFT            (8)
#define I2C_TIMING_FS1_TSTART_HD_FS_SHIFT           (16)
#define I2C_TIMING_FS1_TSTART_SU_FS_SHIFT           (24)

#define I2C_TIMING_FS1_TSDA_SU_FS_MASK              (0xFF << I2C_TIMING_FS1_TSDA_SU_FS_SHIFT)
#define I2C_TIMING_FS1_TSTOP_SU_FS_MASK             (0xFF << I2C_TIMING_FS1_TSTOP_SU_FS_SHIFT)
#define I2C_TIMING_FS1_TSTART_HD_FS_MASK            (0xFF << I2C_TIMING_FS1_TSTART_HD_FS_SHIFT)
#define I2C_TIMING_FS1_TSTART_SU_FS_MASK            (0xFF << I2C_TIMING_FS1_TSTART_SU_FS_SHIFT)

#define I2C_TIMING_FS1_TSDA_SU_FS(c)                ((c) << I2C_TIMING_FS1_TSDA_SU_FS_SHIFT)
#define I2C_TIMING_FS1_TSTOP_SU_FS(c)               ((c) << I2C_TIMING_FS1_TSTOP_SU_FS_SHIFT)
#define I2C_TIMING_FS1_TSTART_HD_FS(c)              ((c) << I2C_TIMING_FS1_TSTART_HD_FS_SHIFT)
#define I2C_TIMING_FS1_TSTART_SU_FS(c)              ((c) << I2C_TIMING_FS1_TSTART_SU_FS_SHIFT)

/* I2C_TIMING_FS2 */
#define I2C_TIMING_FS2_TSCL_H_FS_SHIFT              (0)
#define I2C_TIMING_FS2_TSCL_L_FS_SHIFT              (8)
#define I2C_TIMING_FS2_TDATA_SU_FS_SHIFT            (24)

#define I2C_TIMING_FS2_TSCL_H_FS_MASK               (0xFF << I2C_TIMING_FS2_TSCL_H_FS_SHIFT)
#define I2C_TIMING_FS2_TSCL_L_FS_MASK               (0xFF << I2C_TIMING_FS2_TSCL_L_FS_SHIFT)
#define I2C_TIMING_FS2_TDATA_SU_FS_MASK             (0xFF << I2C_TIMING_FS2_TDATA_SU_FS_SHIFT)

#define I2C_TIMING_FS2_TSCL_H_FS(c)                 ((c) << I2C_TIMING_FS2_TSCL_H_FS_SHIFT)
#define I2C_TIMING_FS2_TSCL_L_FS(c)                 ((c) << I2C_TIMING_FS2_TSCL_L_FS_SHIFT)
#define I2C_TIMING_FS2_TDATA_SU_FS(c)               ((c) << I2C_TIMING_FS2_TDATA_SU_FS_SHIFT)

/* I2C_TIMING_FS3 */
#define I2C_TIMING_FS3_TSR_RELEASE_SHIFT            (0)
#define I2C_TIMING_FS3_CLK_DIV_SHIFT                (8)

#define I2C_TIMING_FS3_TSR_RELEASE_MASK             (0xFF << I2C_TIMING_FS3_TSR_RELEASE_SHIFT)
#define I2C_TIMING_FS3_CLK_DIV_MASK                 (0xFF << I2C_TIMING_FS3_CLK_DIV_SHIFT)

#define I2C_TIMING_FS3_TSR_RELEASE(c)               ((c) << I2C_TIMING_FS3_TSR_RELEASE_SHIFT)
#define I2C_TIMING_FS3_CLK_DIV(c)                   ((c) << I2C_TIMING_FS3_CLK_DIV_SHIFT)

/* I2C_TIMING_SLA */


/* I2C_ADDR */
#define I2C_ADDR_SLAVE_ADDR_SLA_SHIFT               (0)
#define I2C_ADDR_SLAVE_ADDR_MAS_SHIFT               (10)
#define I2C_ADDR_MASTERID_SHIFT                     (24)

#define I2C_ADDR_SLAVE_ADDR_SLA_MASK                (0x3FFul << I2C_ADDR_SLAVE_ADDR_SLA_SHIFT)
#define I2C_ADDR_SLAVE_ADDR_MAS_MASK                (0x3FFul << I2C_ADDR_SLAVE_ADDR_MAS_SHIFT)
#define I2C_ADDR_MASTERID_MASK                      (0x3FFul << I2C_ADDR_MASTERID_SHIFT)

#define I2C_ADDR_SLAVE_ADDR_SLA(c)                  ((c) << I2C_ADDR_SLAVE_ADDR_SLA_SHIFT)
#define I2C_ADDR_SLAVE_ADDR_MAS(c)                  ((c) << I2C_ADDR_SLAVE_ADDR_MAS_SHIFT)
#define I2C_ADDR_MASTERID(c)                        ((c) << I2C_ADDR_MASTERID_SHIFT)

#define I2C_FREQ_400KHZ                             (400000)
#define DEFAULT_I2CXFER_CLOCK                       I2C_FREQ_400KHZ
#define DEFAULT_I2CSLAVE_ADDR                       (0x5Fu)
#define DEFAULT_I2C_TIMEOUT                         (10000)
#define DEFAULT_I2C_TX_TRIGLVL                      (8u)
#define DEFAULT_I2C_RX_TRIGLVL                      (8u)
#define I2C_DEFAULT_I2CSLAVE_ADDR                   (0x77)
#define I2C_DEFAULT_MASTER_ADDRESS                  (0x09)

/* Msg flag */
#define I2C_M_WRITE          (0x0000u)
#define I2C_M_READ           (0x0001u)
#define I2C_M_TEN            (0x0002u)
#define I2C_M_NORESTART      (0x0080u)
#define I2C_M_IGNORE_NAK     (0x1000u)
#define I2C_M_NOSTART        (0x4000u)
#define I2C_M_NOSTOP         (0x8000u)

/* Mode */
#define I2C_MANUAL           (0x0000u)
#define I2C_AUTO             (0x0010u)
#define I2C_INTERRUPT        (0x0020u)
#define I2C_DMA              (0x0040u)
#define I2C_MODE_Msk         (0x0060u)

struct i2c_msg_s {
    uint16_t addr;                /**< Slave address */
    uint32_t timeout;
    uint16_t flags;                /**< I2C flags; See I2C_M_* definitions */
    uint16_t length;            /**< The length of buffer */
    uint8_t *buffer;            /**< The Buffer for transferring message */
};

typedef struct _bp6a_i2c_priv_t_ {
    uint32_t index;
    int xfer_speed;
    bool master;
    uint32_t mode;
    uint32_t slave_addr;
    uint32_t addrlen;
    uint32_t timeout;
    /*  master data  */
    uint8_t msgc;                ///< Message count
    struct i2c_msg_s *msgv;      ///< Message list
    uint16_t mflags;             ///< Current message flags

    /* slave data */
    uint8_t *mptr;               ///< Current message buffer
    int mcnt;                    ///< Current message length
    int cur_msg;
    struct i2c_msg_s *msg;
    volatile uint8_t st_slave_tx_master_rx;
    volatile uint8_t st_slave_rx_master_tx;
    volatile uint16_t int_stat;
} bp6a_i2c_priv_t;

void bp6a_i2c_master_init(uint32_t index, uint32_t freq, int addr_len);
void bp6a_i2c_slave_init(uint32_t index);
int bp6a_i2c_setaddress(uint32_t index, int addr, int nbits);
int bp6a_i2c_start(uint32_t index);
int bp6a_i2c_stop(uint32_t index);
void bp6a_i2c_reset(uint32_t index);
int bp6a_i2c_read_byte(uint32_t index, bool last);
int bp6a_i2c_write_byte(uint32_t index, int data);
int bp6a_i2c_read(uint32_t index, uint8_t *buffer, int buflen, int start, int stop);
int bp6a_i2c_write(uint32_t index, const uint8_t *buffer, int buflen, int start, int stop);
int bp6a_i2c_get_slave_status(uint32_t index);
void bp6a_i2c_set_slave_address(uint32_t index, int addr, bool is_slave);

#endif /*__S1SBP6A_I2C_H */