
#ifndef __DSP__H__
#define __DSP__H__

#define FFT_MODE_IFFT (0x00100000)
#define FFT_128_CFG (0x0004f391)
#define IFFT_128_CFG (FFT_128_CFG | FFT_MODE_IFFT)
#define FFT_256_CFG (0x0000f391)
#define IFFT_256_CFG (FFT_256_CFG | FFT_MODE_IFFT)
#define FFT_512_CFG (0x0000f512)
#define IFFT_512_CFG (FFT_512_CFG | FFT_MODE_IFFT)
#define FFT_1024_CFG (0x000f1024)
#define IFFT_1024_CFG (FFT_1024_CFG | FFT_MODE_IFFT)

#define FBANK_CFG (0x00408008)
#define MFCC_CFG (0x00000000)
/**!
 * dsp配置参数，在启动dsp之前输入
 */
typedef struct dspCfgParam
{
    uint32_t cfg;     //! uDsp cfg配置,详情请参照uDsp datasheet
    uint32_t ctl;     //! uDsp ctrl配置,详情请参照uDsp datasheet
    uint32_t mode;    //! 当前的模式
    uint32_t src;     //! 运算的源数据地址
    uint32_t srcLen;  //! 源数据地址长度
    uint32_t dest;    //! 结果输出地址
    uint16_t destLen; //! 需要输出的数据长度
    uint32_t table;   //! spx fft initial need
    uint32_t win;     //! 窗函数地址，对512点及以下的正向FFT有效
} dspStartParam_s;

/*!
 * dsp events structure
 * Used to notify mcu  of  dsp events
 */
typedef struct sDspListener
{
    /*!
     * \brief  DSP的探针函数，取DSP吐出的audio数据
     *
     * \param
     */
    void (*dspListener)(void);
} dspListener_s;

/*!
 * \brief 根据申请单中传来的参数配置dsp,并启动dsp
 * \param
 *        startParam       : dsp的配置参数
 */
uint8_t startDsp(dspStartParam_s *startParam);

/*!
 * \brief dsp初始化函数,外界可调,主要功能
 *        a. 变量初始化
 *        b. 为调度器下探指针提供接口
 */
void dspInit(dspListener_s *dspListener);

#endif
