Files
2026-06-01 20:15:04 +03:00

517 lines
30 KiB
C

/****************************************************************************
*
* 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 */