/*
* Copyright (c) 2021 Huawei Device Co., Ltd.
*
* HDF is dual licensed: you can use it either under the terms of
* the GPL, or the BSD license, at your option.
* See the LICENSE file in the root of this repository for complete details.
*/
/**
* @addtogroup I2S
* @{
*
* @brief Defines standard APIs of the (I2S) capabilities.
*
* The I2S module abstracts the I2S capabilities of different system platforms to provide stable APIs
* for driver development.
* This module can create and destroy I2S device handles, read and write I2S data,
* and obtain and set configuration parameters.
*
* @since 1.0
*/
/**
* @file i2s_if.h
*
* @brief Defines standard I2S-specific interfaces for driver development.
*
* A driver needs to use the I2S-specific interfaces for data writing and reading
* before performing any operations on an I2S-compliant device.
*
* @since 1.0
*/
#ifndef I2S_IF_H
#define I2S_IF_H
#include "platform_if.h"
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endif /* __cplusplus */
/**
* @brief Defines the configuration of an I2S device.
*
* @attention The specific I2S controller determines which variables in this structure are supported.
*
* @since 1.0
*/
#define I2S_DATA_TRANSFER_PERIOD 20
enum I2sSampleRate {
I2S_SAMPLE_RATE_8K = 8,
I2S_SAMPLE_RATE_16K = 16,
I2S_SAMPLE_RATE_32K = 32,
I2S_SAMPLE_RATE_48K = 48,
I2S_SAMPLE_RATE_44_1K = 441, // 44.1k
I2S_SAMPLE_RATE_96K = 96,
I2S_SAMPLE_RATE_192K = 192,
};
enum I2sWordWidth {
I2S_WORDWIDTH_8BIT = 8,
I2S_WORDWIDTH_16BIT = 16,
I2S_WORDWIDTH_18BIT = 18,
I2S_WORDWIDTH_20BIT = 20,
I2S_WORDWIDTH_24BIT = 24,
I2S_WORDWIDTH_32BIT = 32,
};
enum I2sMode {
I2S_MODE_MASTER_TX_MODE,
I2S_MODE_MASTER_RX_MODE,
I2S_MODE_STANDBY_TX_MODE,
I2S_MODE_STANDBY_RX_MODE,
};
enum I2sLoopMode {
I2S_NORMAL_MODE,
I2S_LOOPBACK_MODE,
};
enum I2sChannel {
I2S_CHANNEL_LOW_LEFT,
I2S_CHANNEL_LOW_RIGHT,
};
enum I2sFrameLen {
I2S_FRAME_LEN_32BIT = 32,
I2S_FRAME_LEN_64BIT = 64,
};
enum I2sProtocolType {
I2S_PROTOCOL_I2S_STD,
I2S_PROTOCOL_I2S_MSB,
I2S_PROTOCOL_I2S_LSB,
I2S_PROTOCOL_PCM_STD,
I2S_PROTOCOL_PCM_SHORT,
I2S_PROTOCOL_PCM_LONG,
};
enum I2sPcmFscDelay {
I2S_PCM_START_1_CYCLE_BEFORE_MSB, /**< PCM FSC starts one cycle before MSB bit */
I2S_PCM_START_SYNC_MSB, /**< PCM FSC starts at the same time as MSB bit */
};
enum I2sDataSel {
I2S_RISING_EDGE_TX,
I2S_RISING_EDGE_RX,
I2S_FALLING_EDGE_TX,
I2S_FALLING_EDGE_RX,
};
enum I2sChannelMode {
I2S_CHANNEL_MODE_STEREO,
I2S_CHANNEL_MODE_MONO,
};
enum I2sChannelIfMode {
I2S_CHANNEL_IF_MODE_I2S,
I2S_CHANNEL_IF_MODE_PCM,
};
enum I2sWriteChannel {
I2S_WRITE_CHANNEL_AUDIO,
I2S_WRITE_CHANNEL_OUTPUT,
};
enum I2slFsSel {
I2SL_FS_SEL_1024_FS,
I2SL_FS_SEL_512_FS,
I2SL_FS_SEL_320_FS,
I2SL_FS_SEL_256_FS,
I2SL_FS_SEL_128_FS,
I2SL_FS_SEL_64_FS,
};
struct I2sCfg {
enum I2sSampleRate sampleRate; /**< I2S sample rate, 8k,16k,32k... */
enum I2sWordWidth width; /**< I2S word width, 8bit,16bit,20bit,24bit... */
enum I2sMode mode; /**< I2S mode, master/standby, tx/rx */
enum I2sPcmFscDelay syncMode; /**< pcm mode, FSC starts location */
enum I2sLoopMode loopMode; /**< is loopback */
enum I2sProtocolType type; /**< I2S protocol type */
enum I2sChannel channel;
enum I2sFrameLen frameLen;
enum I2sDataSel dataSel;
enum I2sChannelMode channelMode; /**< I2S mode,data channel */
uint8_t samplePrecision; /**< bit */
enum I2sChannelIfMode channelIfMode;
uint32_t mclk; /**< KHZ */
uint32_t bclk; /**< KHZ */
enum I2sWriteChannel writeChannel;
enum I2slFsSel i2slFsSel;
uint8_t Reserved[2];
};
/**
* @brief Defines the custom I2S transfer message.
*
* @attention The specific I2S controller determines whether speed, delayUs,
* and csChange are supported.
*
* @since 1.0
*/
struct I2sMsg {
uint8_t *wbuf; /**< Address of the write buffer */
uint8_t *rbuf; /**< Address of the read buffer */
uint32_t len; /**< Length of the read and write buffers. The read buffer and the write
* buffer have the same length. */
uint32_t *pRlen;
};
/**
* @brief Obtains the handle of an I2S controller.
*
* You must call this function before accessing the I2S bus.
*
* @param number Indicates the I2S controller ID.
*
* @return Returns the pointer to the {@link DevHandle} of the I2S controller if the operation is successful;
* returns NULL otherwise.
* @since 1.0
*/
DevHandle I2sOpen(int16_t number);
/**
* @brief Releases the handle of an I2S controller.
*
* If you no longer need to access the I2S controller, you should call this function to close its handle so as
* to release unused memory resources.
*
* @param handle Indicates the pointer to the device handle of the I2S controller.
*
* @since 1.0
*/
void I2sClose(DevHandle handle);
void I2sEnable(DevHandle handle);
void I2sDisable(DevHandle handle);
int32_t I2sWrite(DevHandle handle, uint8_t *buf, uint32_t len, uint32_t *pWlen);
int32_t I2sRead(DevHandle handle, uint8_t *buf, uint32_t len, uint32_t *pRlen);
void I2sStartWrite(DevHandle handle);
void I2sStopWrite(DevHandle handle);
void I2sStartRead(DevHandle handle);
void I2sStopRead(DevHandle handle);
void I2sSetCfg(DevHandle handle, struct I2sCfg *cfg);
void I2sGetCfg(DevHandle handle, struct I2sCfg *cfg);
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* __cplusplus */
#endif /* I2S_IF_H */
/** @} */