517 lines
30 KiB
C
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 */
|