pinebuds/platform/hal/hal_i2sip.h

237 lines
7.7 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_I2SIP_H__
#define __HAL_I2SIP_H__
#ifdef __cplusplus
extern "C" {
#endif
#include "plat_types.h"
#include "reg_i2sip.h"
#include "hal_i2s.h"
#define i2sip_read32(b,a) \
(*(volatile uint32_t *)(b+a))
#define i2sip_write32(v,b,a) \
((*(volatile uint32_t *)(b+a)) = v)
static inline void i2sip_w_enable_i2sip(uint32_t reg_base, uint32_t v)
{
uint32_t val = 0;
val = i2sip_read32(reg_base, I2SIP_ENABLE_REG_REG_OFFSET);
if (v)
val |= I2SIP_ENABLE_REG_I2S_ENABLE_MASK;
else
val &= ~I2SIP_ENABLE_REG_I2S_ENABLE_MASK;
i2sip_write32(val, reg_base, I2SIP_ENABLE_REG_REG_OFFSET);
}
#ifndef CHIP_BEST1000
static inline void i2sip_w_enable_slave_mode(uint32_t reg_base, uint32_t v)
{
uint32_t val = 0;
val = i2sip_read32(reg_base, I2SIP_ENABLE_REG_REG_OFFSET);
if (v)
val |= I2SIP_ENABLE_REG_SLAVE_MODE_MASK;
else
val &= ~I2SIP_ENABLE_REG_SLAVE_MODE_MASK;
i2sip_write32(val, reg_base, I2SIP_ENABLE_REG_REG_OFFSET);
}
#endif
static inline void i2sip_w_enable_clk_gen(uint32_t reg_base, uint32_t v)
{
if (v)
i2sip_write32(1, reg_base, I2SIP_CLK_GEN_ENABLE_REG_REG_OFFSET);
else
i2sip_write32(0, reg_base, I2SIP_CLK_GEN_ENABLE_REG_REG_OFFSET);
}
static inline uint32_t i2sip_r_clk_gen_enabled(uint32_t reg_base)
{
uint32_t v;
v = i2sip_read32(reg_base, I2SIP_CLK_GEN_ENABLE_REG_REG_OFFSET);
return !!(v & I2SIP_CLK_GEN_ENABLE_REG_ENABLE_MASK);
}
static inline void i2sip_w_enable_rx_block(uint32_t reg_base, uint32_t v)
{
if (v)
i2sip_write32(1, reg_base, I2SIP_RX_BLOCK_ENABLE_REG_REG_OFFSET);
else
i2sip_write32(0, reg_base, I2SIP_RX_BLOCK_ENABLE_REG_REG_OFFSET);
}
static inline void i2sip_w_enable_rx_channel(uint32_t reg_base, uint32_t chan, uint32_t v)
{
if (v)
i2sip_write32(1, reg_base, I2SIP_RX_ENABLE_REG_OFFSET(chan));
else
i2sip_write32(0, reg_base, I2SIP_RX_ENABLE_REG_OFFSET(chan));
}
static inline void i2sip_w_enable_tx_block(uint32_t reg_base, uint32_t v)
{
if (v)
i2sip_write32(1, reg_base, I2SIP_TX_BLOCK_ENABLE_REG_REG_OFFSET);
else
i2sip_write32(0, reg_base, I2SIP_TX_BLOCK_ENABLE_REG_REG_OFFSET);
}
static inline void i2sip_w_enable_tx_channel(uint32_t reg_base, uint32_t chan, uint32_t v)
{
if (v)
i2sip_write32(1, reg_base, I2SIP_TX_ENABLE_REG_OFFSET(chan));
else
i2sip_write32(0, reg_base, I2SIP_TX_ENABLE_REG_OFFSET(chan));
}
static inline void i2sip_w_tx_resolution(uint32_t reg_base, uint32_t chan, uint32_t v)
{
i2sip_write32(v<<I2SIP_TX_CFG_WLEN_SHIFT, reg_base, I2SIP_TX_CFG_REG_OFFSET(chan));
}
static inline void i2sip_w_rx_resolution(uint32_t reg_base, uint32_t chan, uint32_t v)
{
i2sip_write32(v<<I2SIP_RX_CFG_WLEN_SHIFT, reg_base, I2SIP_RX_CFG_REG_OFFSET(chan));
}
static inline void i2sip_w_clk_cfg_reg(uint32_t reg_base, uint32_t v)
{
i2sip_write32(v, reg_base, I2SIP_CLK_CFG_REG_OFFSET);
}
static inline void i2sip_w_tx_left_fifo(uint32_t reg_base, uint32_t chan, uint32_t v)
{
i2sip_write32(v, reg_base, I2SIP_LEFT_TX_BUFF_REG_OFFSET(chan));
}
static inline void i2sip_w_tx_right_fifo(uint32_t reg_base, uint32_t chan, uint32_t v)
{
i2sip_write32(v, reg_base, I2SIP_RIGHT_TX_BUFF_REG_OFFSET(chan));
}
static inline void i2sip_w_tx_fifo_threshold(uint32_t reg_base, uint32_t chan, uint32_t v)
{
i2sip_write32(v<<I2SIP_TX_FIFO_CFG_LEVEL_SHIFT, reg_base, I2SIP_TX_FIFO_CFG_REG_OFFSET(chan));
}
static inline void i2sip_w_rx_fifo_threshold(uint32_t reg_base, uint32_t chan, uint32_t v)
{
i2sip_write32(v<<I2SIP_RX_FIFO_CFG_LEVEL_SHIFT, reg_base, I2SIP_RX_FIFO_CFG_REG_OFFSET(chan));
}
static inline void i2sip_w_tx_fifo_reset(uint32_t reg_base, uint32_t chan)
{
i2sip_write32(I2SIP_TX_FIFO_FLUSH_MASK, reg_base, I2SIP_TX_FIFO_FLUSH_REG_OFFSET(chan));
}
static inline void i2sip_w_rx_fifo_reset(uint32_t reg_base, uint32_t chan)
{
i2sip_write32(I2SIP_RX_FIFO_FLUSH_MASK, reg_base, I2SIP_RX_FIFO_FLUSH_REG_OFFSET(chan));
}
static inline uint32_t i2sip_r_int_status(uint32_t reg_base, uint32_t chan)
{
return i2sip_read32(reg_base, I2SIP_INT_STATUS_REG_OFFSET(chan));
}
static inline void i2sip_w_enable_tx_dma(uint32_t reg_base, uint32_t v)
{
uint32_t val = 0;
val = i2sip_read32(reg_base, I2SIP_DMA_CTRL_REG_OFFSET);
if (v)
val |= I2SIP_DMA_CTRL_TX_ENABLE_MASK;
else
val &= ~I2SIP_DMA_CTRL_TX_ENABLE_MASK;
i2sip_write32(val, reg_base, I2SIP_DMA_CTRL_REG_OFFSET);
}
static inline void i2sip_w_enable_rx_dma(uint32_t reg_base, uint32_t v)
{
uint32_t val = 0;
val = i2sip_read32(reg_base, I2SIP_DMA_CTRL_REG_OFFSET);
if (v)
val |= I2SIP_DMA_CTRL_RX_ENABLE_MASK;
else
val &= ~I2SIP_DMA_CTRL_RX_ENABLE_MASK;
i2sip_write32(val, reg_base, I2SIP_DMA_CTRL_REG_OFFSET);
}
#ifndef CHIP_BEST1000
static inline void i2sp_w_enable_rx_dma_block(uint32_t reg_base, uint32_t v)
{
uint32_t val = 0;
val = i2sip_read32(reg_base, I2SIP_DMA_CTRL_REG_OFFSET);
if (v)
val |= I2SIP_DMA_CTRL_RX_DMA_BLK_EN_MASK;
else
val &= ~I2SIP_DMA_CTRL_RX_DMA_BLK_EN_MASK;
i2sip_write32(val, reg_base, I2SIP_DMA_CTRL_REG_OFFSET);
}
static inline void i2sip_w_rx_dma_blk_size(uint32_t reg_base, uint32_t v)
{
uint32_t val = 0;
val = i2sip_read32(reg_base, I2SIP_DMA_CTRL_REG_OFFSET);
val = SET_BITFIELD(val, I2SIP_DMA_CTRL_RX_DMA_BLK_SIZE, v);
i2sip_write32(val, reg_base, I2SIP_DMA_CTRL_REG_OFFSET);
}
#endif
static inline void i2sip_w_tx_sync_enable(uint32_t reg_base, enum HAL_I2S_SYNC_TYPE_T type)
{
uint32_t val = 0;
val = i2sip_read32(reg_base, I2SIP_EN_SEL_OFFSET);
val = SET_BITFIELD(val, I2SIP_TX_EN_SEL, type);
i2sip_write32(val, reg_base, I2SIP_EN_SEL_OFFSET);
}
static inline void i2sip_w_tx_sync_disable(uint32_t reg_base)
{
uint32_t val = 0;
val = i2sip_read32(reg_base, I2SIP_EN_SEL_OFFSET);
val = SET_BITFIELD(val, I2SIP_TX_EN_SEL, HAL_I2S_SYNC_TYPE_NONE);
i2sip_write32(val, reg_base, I2SIP_EN_SEL_OFFSET);
}
static inline void i2sip_w_rx_sync_enable(uint32_t reg_base, enum HAL_I2S_SYNC_TYPE_T type)
{
uint32_t val = 0;
val = i2sip_read32(reg_base, I2SIP_EN_SEL_OFFSET);
val = SET_BITFIELD(val, I2SIP_RX_EN_SEL, type);
i2sip_write32(val, reg_base, I2SIP_EN_SEL_OFFSET);
}
static inline void i2sip_w_rx_sync_disable(uint32_t reg_base)
{
uint32_t val = 0;
val = i2sip_read32(reg_base, I2SIP_EN_SEL_OFFSET);
val = SET_BITFIELD(val, I2SIP_RX_EN_SEL, HAL_I2S_SYNC_TYPE_NONE);
i2sip_write32(val, reg_base, I2SIP_EN_SEL_OFFSET);
}
static inline void i2sip_w_clk_sync_enable(uint32_t reg_base, enum HAL_I2S_SYNC_TYPE_T type)
{
uint32_t val = 0;
val = i2sip_read32(reg_base, I2SIP_EN_SEL_OFFSET);
val = SET_BITFIELD(val, I2SIP_CLK_EN_SEL, type);
i2sip_write32(val, reg_base, I2SIP_EN_SEL_OFFSET);
}
static inline void i2sip_w_clk_sync_disable(uint32_t reg_base)
{
uint32_t val = 0;
val = i2sip_read32(reg_base, I2SIP_EN_SEL_OFFSET);
val = SET_BITFIELD(val, I2SIP_CLK_EN_SEL, HAL_I2S_SYNC_TYPE_NONE);
i2sip_write32(val, reg_base, I2SIP_EN_SEL_OFFSET);
}
#ifdef __cplusplus
}
#endif
#endif /* __HAL_I2SIP_H__ */