pinebuds/platform/hal/hal_i2cip.h

375 lines
12 KiB
C

/***************************************************************************
*
* Copyright 2015-2019 BES.
* All rights reserved. All unpublished rights reserved.
*
* No part of this work may be used or reproduced in any form or by any
* means, or stored in a database or retrieval system, without prior written
* permission of BES.
*
* Use of this work is governed by a license granted by BES.
* This work contains confidential and proprietary information of
* BES. which is protected by copyright, trade secret,
* trademark and other intellectual property rights.
*
****************************************************************************/
#ifndef __HAL_I2CIP_H__
#define __HAL_I2CIP_H__
#ifdef __cplusplus
extern "C" {
#endif
#include "plat_types.h"
#include "reg_i2cip.h"
#define i2cip_read32(b,a) \
(*(volatile uint32_t *)(b+a))
#define i2cip_write32(v,b,a) \
((*(volatile uint32_t *)(b+a)) = v)
static inline uint8_t i2cip_w_enable(uint32_t reg_base, uint8_t enable)
{
uint32_t val = 0;
val = i2cip_read32(reg_base, I2CIP_ENABLE_REG_OFFSET);
if (enable)
val |= I2CIP_ENABLE_MASK;
else
val &= ~I2CIP_ENABLE_MASK;
i2cip_write32(val, reg_base, I2CIP_ENABLE_REG_OFFSET);
return 0;
}
static inline uint8_t i2cip_w_clear_ctrl(uint32_t reg_base)
{
i2cip_write32(0, reg_base, I2CIP_CTRL_REG_OFFSET);
return 0;
}
static inline uint8_t i2cip_w_10bit_master(uint32_t reg_base, uint8_t enable)
{
uint32_t val = 0;
val = i2cip_read32(reg_base, I2CIP_CTRL_REG_OFFSET);
if (enable)
val |= I2CIP_10BITADDR_MASTER_MASK;
else
val &= ~I2CIP_10BITADDR_MASTER_MASK;
i2cip_write32(val, reg_base, I2CIP_CTRL_REG_OFFSET);
return 0;
}
static inline uint8_t i2cip_r_ctrl_reg(uint32_t reg_base)
{
return i2cip_read32(reg_base, I2CIP_CTRL_REG_OFFSET);
}
static inline uint8_t i2cip_w_10bit_slave(uint32_t reg_base, uint8_t enable)
{
uint32_t val = 0;
val = i2cip_read32(reg_base, I2CIP_CTRL_REG_OFFSET);
if (enable)
val |= I2CIP_10BITADDR_SLAVE_MASK;
else
val &= ~I2CIP_10BITADDR_SLAVE_MASK;
i2cip_write32(val, reg_base, I2CIP_CTRL_REG_OFFSET);
return 0;
}
static inline uint8_t i2cip_w_restart(uint32_t reg_base, uint8_t restart)
{
uint32_t val = 0;
val = i2cip_read32(reg_base, I2CIP_CTRL_REG_OFFSET);
if (restart)
val |= I2CIP_RESTART_ENABLE_MASK;
else
val &= ~I2CIP_RESTART_ENABLE_MASK;
i2cip_write32(val, reg_base, I2CIP_CTRL_REG_OFFSET);
return 0;
}
static inline uint8_t i2cip_w_speed(uint32_t reg_base, uint32_t speed)
{
uint32_t val = 0;
val = i2cip_read32(reg_base, I2CIP_CTRL_REG_OFFSET);
val &= ~I2CIP_SPEED_MASK;
val |= speed;
i2cip_write32(val, reg_base, I2CIP_CTRL_REG_OFFSET);
return 0;
}
static inline uint8_t i2cip_w_standard_speed_hcnt(uint32_t reg_base, uint32_t hcnt)
{
uint32_t val = 0;
val |= hcnt<<I2CIP_SS_SCL_HCNT_SHIFT;
i2cip_write32(val, reg_base, I2CIP_SS_SCL_HCNT_REG_OFFSET);
return 0;
}
static inline uint8_t i2cip_w_fast_speed_hcnt(uint32_t reg_base, uint32_t hcnt)
{
uint32_t val = 0;
val |= hcnt<<I2CIP_FS_SCL_HCNT_SHIFT;
i2cip_write32(val, reg_base, I2CIP_FS_SCL_HCNT_REG_OFFSET);
return 0;
}
static inline uint8_t i2cip_w_high_speed_hcnt(uint32_t reg_base, uint32_t hcnt)
{
uint32_t val = 0;
val |= hcnt<<I2CIP_HS_SCL_HCNT_SHIFT;
i2cip_write32(val, reg_base, I2CIP_HS_SCL_HCNT_REG_OFFSET);
return 0;
}
static inline uint8_t i2cip_w_standard_speed_lcnt(uint32_t reg_base, uint32_t lcnt)
{
uint32_t val = 0;
val |= lcnt<<I2CIP_SS_SCL_LCNT_SHIFT;
i2cip_write32(val, reg_base, I2CIP_SS_SCL_LCNT_REG_OFFSET);
return 0;
}
static inline uint8_t i2cip_w_fast_speed_lcnt(uint32_t reg_base, uint32_t lcnt)
{
uint32_t val = 0;
val |= lcnt<<I2CIP_FS_SCL_LCNT_SHIFT;
i2cip_write32(val, reg_base, I2CIP_FS_SCL_LCNT_REG_OFFSET);
return 0;
}
static inline uint8_t i2cip_w_high_speed_lcnt(uint32_t reg_base, uint32_t lcnt)
{
uint32_t val = 0;
val |= lcnt<<I2CIP_HS_SCL_LCNT_SHIFT;
i2cip_write32(val, reg_base, I2CIP_HS_SCL_LCNT_REG_OFFSET);
return 0;
}
static inline uint32_t i2cip_r_target_address_reg(uint32_t reg_base)
{
return i2cip_read32(reg_base, I2CIP_TARGET_ADDRESS_REG_OFFSET);
}
static inline void i2cip_w_target_address_reg(uint32_t reg_base, uint32_t val)
{
i2cip_write32(val, reg_base, I2CIP_TARGET_ADDRESS_REG_OFFSET);
}
static inline uint8_t i2cip_w_target_address(uint32_t reg_base, uint32_t addr)
{
uint32_t val = 0;
val = i2cip_read32(reg_base, I2CIP_TARGET_ADDRESS_REG_OFFSET);
val &= ~I2CIP_TARGET_ADDRESS_MASK;
val |= (addr<<I2CIP_TARGET_ADDRESS_SHIFT) & I2CIP_TARGET_ADDRESS_MASK;
if (addr & HAL_I2C_10BITADDR_MASK) {
val |= I2CIP_TARGET_ADDRESS_IC_10BITADDR_MASTER_MASK;
} else {
val &= ~I2CIP_TARGET_ADDRESS_IC_10BITADDR_MASTER_MASK;
}
i2cip_write32(val, reg_base, I2CIP_TARGET_ADDRESS_REG_OFFSET);
return 0;
}
static inline uint8_t i2cip_w_gc_or_start_bit(uint32_t reg_base, uint8_t set)
{
uint32_t val = 0;
val = i2cip_read32(reg_base, I2CIP_TARGET_ADDRESS_REG_OFFSET);
if (set)
val |= I2CIP_TARGET_ADDRESS_GC_OR_START_MASK;
else
val &= ~I2CIP_TARGET_ADDRESS_GC_OR_START_MASK;
i2cip_write32(val, reg_base, I2CIP_TARGET_ADDRESS_REG_OFFSET);
return 0;
}
static inline uint8_t i2cip_w_special_bit(uint32_t reg_base, uint8_t set)
{
uint32_t val = 0;
val = i2cip_read32(reg_base, I2CIP_TARGET_ADDRESS_REG_OFFSET);
if (set)
val |= I2CIP_TARGET_ADDRESS_SPECIAL_BIT_MASK;
else
val &= ~I2CIP_TARGET_ADDRESS_SPECIAL_BIT_MASK;
i2cip_write32(val, reg_base, I2CIP_TARGET_ADDRESS_REG_OFFSET);
return 0;
}
static inline uint8_t i2cip_w_address_as_slave(uint32_t reg_base, uint32_t addr)
{
uint32_t val = 0;
val |= addr<<I2CIP_ADDRESS_AS_SLAVE_SHIFT;
i2cip_write32(val, reg_base, I2CIP_ADDRESS_AS_SLAVE_REG_OFFSET);
return 0;
}
static inline uint8_t i2cip_init_int_mask(uint32_t reg_base, uint32_t mask)
{
uint32_t val = 0;
val = mask;
i2cip_write32(val, reg_base, I2CIP_INT_MASK_REG_OFFSET);
return 0;
}
static inline uint8_t i2cip_set_int_mask(uint32_t reg_base, uint32_t mask)
{
uint32_t val = 0;
val = i2cip_read32(reg_base, I2CIP_INT_MASK_REG_OFFSET);
val |= mask;
i2cip_write32(val, reg_base, I2CIP_INT_MASK_REG_OFFSET);
return 0;
}
static inline uint8_t i2cip_clear_int_mask(uint32_t reg_base, uint32_t mask)
{
uint32_t val = 0;
val = i2cip_read32(reg_base, I2CIP_INT_MASK_REG_OFFSET);
val &= ~mask;
i2cip_write32(val, reg_base, I2CIP_INT_MASK_REG_OFFSET);
return 0;
}
static inline uint8_t i2cip_w_disable_slave(uint32_t reg_base, uint8_t disable)
{
uint32_t val = 0;
val = i2cip_read32(reg_base, I2CIP_CTRL_REG_OFFSET);
if (disable)
val |= I2CIP_SLAVE_DISABLE_MASK;
else
val &= ~I2CIP_SLAVE_DISABLE_MASK;
i2cip_write32(val, reg_base, I2CIP_CTRL_REG_OFFSET);
return 0;
}
static inline uint8_t i2cip_w_master_mode(uint32_t reg_base, uint8_t master_mode)
{
uint32_t val = 0;
val = i2cip_read32(reg_base, I2CIP_CTRL_REG_OFFSET);
if (master_mode)
val |= I2CIP_MASTER_MODE_MASK;
else
val &= ~I2CIP_MASTER_MODE_MASK;
i2cip_write32(val, reg_base, I2CIP_CTRL_REG_OFFSET);
return 0;
}
static inline uint8_t i2cip_w_rx_threshold(uint32_t reg_base, uint32_t th)
{
i2cip_write32(th, reg_base, I2CIP_RX_THRESHOLD_REG_OFFSET);
return 0;
}
static inline uint8_t i2cip_w_tx_threshold(uint32_t reg_base, uint32_t th)
{
i2cip_write32(th, reg_base, I2CIP_TX_THRESHOLD_REG_OFFSET);
return 0;
}
static inline uint8_t i2cip_w_cmd_data(uint32_t reg_base, uint32_t cmd_data)
{
i2cip_write32(cmd_data, reg_base, I2CIP_CMD_DATA_REG_OFFSET);
return 0;
}
static inline uint32_t i2cip_r_clr_tx_over(uint32_t reg_base)
{
return i2cip_read32(reg_base, I2CIP_CLR_TX_OVER_REG_OFFSET);
}
static inline uint32_t i2cip_r_clr_rx_over(uint32_t reg_base)
{
return i2cip_read32(reg_base, I2CIP_CLR_RX_OVER_REG_OFFSET);
}
static inline uint32_t i2cip_r_clr_rx_under(uint32_t reg_base)
{
return i2cip_read32(reg_base, I2CIP_CLR_RX_UNDER_REG_OFFSET);
}
static inline uint32_t i2cip_r_clr_stop_det(uint32_t reg_base)
{
return i2cip_read32(reg_base, I2CIP_CLR_STOP_DET_REG_OFFSET);
}
static inline uint32_t i2cip_r_clr_start_det(uint32_t reg_base)
{
return i2cip_read32(reg_base, I2CIP_CLR_START_DET_REG_OFFSET);
}
static inline uint32_t i2cip_r_clr_tx_abrt(uint32_t reg_base)
{
return i2cip_read32(reg_base, I2CIP_CLR_TX_ABRT_REG_OFFSET);
}
static inline uint32_t i2cip_r_clr_activity(uint32_t reg_base)
{
return i2cip_read32(reg_base, I2CIP_CLR_ACTIVITY_REG_OFFSET);
}
static inline uint32_t i2cip_r_clr_all_intr(uint32_t reg_base)
{
return i2cip_read32(reg_base, I2CIP_CLR_ALL_INTR_REG_OFFSET);
}
static inline uint32_t i2cip_r_clr_rd_req(uint32_t reg_base)
{
return i2cip_read32(reg_base, I2CIP_CLR_RD_REQ_REG_OFFSET);
}
static inline uint32_t i2cip_r_clr_rx_done(uint32_t reg_base)
{
return i2cip_read32(reg_base, I2CIP_CLR_RX_DONE_REG_OFFSET);
}
static inline uint32_t i2cip_r_cmd_data(uint32_t reg_base)
{
return i2cip_read32(reg_base, I2CIP_CMD_DATA_REG_OFFSET);
}
static inline uint32_t i2cip_r_status(uint32_t reg_base)
{
return i2cip_read32(reg_base, I2CIP_STATUS_REG_OFFSET);
}
static inline uint32_t i2cip_r_int_status(uint32_t reg_base)
{
return i2cip_read32(reg_base, I2CIP_INT_STATUS_REG_OFFSET);
}
static inline uint32_t i2cip_r_raw_int_status(uint32_t reg_base)
{
return i2cip_read32(reg_base, I2CIP_RAW_INT_STATUS_REG_OFFSET);
}
static inline uint32_t i2cip_r_enable_status(uint32_t reg_base)
{
return i2cip_read32(reg_base, I2CIP_ENABLE_STATUS_REG_OFFSET);
}
static inline uint32_t i2cip_r_tx_fifo_level(uint32_t reg_base)
{
return i2cip_read32(reg_base, I2CIP_TX_FIFO_LEVEL_REG_OFFSET);
}
static inline uint32_t i2cip_r_rx_fifo_level(uint32_t reg_base)
{
return i2cip_read32(reg_base, I2CIP_RX_FIFO_LEVEL_REG_OFFSET);
}
static inline uint32_t i2cip_r_tx_abrt_source(uint32_t reg_base)
{
return i2cip_read32(reg_base, I2CIP_TX_ABRT_SOURCE_REG_OFFSET);
}
static inline uint32_t i2cip_w_tx_dma_enable(uint32_t reg_base, uint8_t enable)
{
uint32_t val = 0;
val = i2cip_read32(reg_base, I2CIP_DMA_CR_REG_OFFSET);
if (enable)
val |= I2CIP_DMA_CR_TDMAE_MASK;
else
val &= ~I2CIP_DMA_CR_TDMAE_MASK;
i2cip_write32(val, reg_base, I2CIP_DMA_CR_REG_OFFSET);
return 0;
}
static inline uint32_t i2cip_w_rx_dma_enable(uint32_t reg_base, uint8_t enable)
{
uint32_t val = 0;
val = i2cip_read32(reg_base, I2CIP_DMA_CR_REG_OFFSET);
if (enable)
val |= I2CIP_DMA_CR_RDMAE_MASK;
else
val &= ~I2CIP_DMA_CR_RDMAE_MASK;
i2cip_write32(val, reg_base, I2CIP_DMA_CR_REG_OFFSET);
return 0;
}
static inline uint32_t i2cip_w_tx_dma_tl(uint32_t reg_base, uint32_t val)
{
return i2cip_write32(val, reg_base, I2CIP_DMA_TX_TL_REG_OFFSET);
}
static inline uint32_t i2cip_w_rx_dma_tl(uint32_t reg_base, uint32_t val)
{
return i2cip_write32(val, reg_base, I2CIP_DMA_RX_TL_REG_OFFSET);
}
static inline uint32_t i2cip_w_sda_hold_time(uint32_t reg_base, uint32_t val)
{
return i2cip_write32(val, reg_base, I2CIP_SDA_HOLD_REG_OFFSET);
}
static inline uint32_t i2cip_r_ic_enable_status(uint32_t reg_base)
{
return i2cip_read32(reg_base, I2CIP_IC_ENABLE_STATUS_REG_OFFSET);
}
static inline uint32_t i2cip_w_fs_spklen(uint32_t reg_base, uint32_t val)
{
return i2cip_write32(val, reg_base, I2CIP_IC_FS_SPKLEN_REG_OFFSET);
}
static inline uint32_t i2cip_w_hs_spklen(uint32_t reg_base, uint32_t val)
{
return i2cip_write32(val, reg_base, I2CIP_IC_HS_SPKLEN_REG_OFFSET);
}
static inline uint32_t i2cip_w_data_to_vad(uint32_t reg_base, uint32_t val)
{
i2cip_write32(val ? 1 : 0, reg_base, I2CIP_IC_VAD_PATH_REG_OFFSET);
return 0;
}
#ifdef __cplusplus
}
#endif
#endif /* __HAL_I2CIP_H__ */