#ifndef __NPU__H__
#define __NPU__H__

/**!
 * npu配置参数，在启动npu之前输入
*/
typedef struct npuCfgParam
{
    uint32_t bottom;                         //! data数组的底部地址
    uint32_t top;                            //! data数组的顶部地址
    uint32_t current;                        //! 当前data在数组中地址
    uint32_t ping;                           //! ping地址
    uint32_t pong;                           //! pong地址
    uint32_t cfg;                            //! 配置区地址
    uint32_t bias;                           //! bias区地址
    uint32_t output;                         //! 结果输出地址
    uint16_t tableLen;                       //! ping/pong数据的长度(单位：字节)
    uint16_t layer;                          //! 当前需要计算的层数
} npuStartParam_s;


/*!
 * npu events structure
 * Used to notify mcu  of  npu events
 */
typedef struct sNpuListener
{
    /*!
     * \brief  NPU table的探针函数
     *
     */
    void (*npuTableListener)(void);

    /*!
     * \brief  NPU Done的探针函数，取NPU Done吐出的运算结果
     *
     * \param
     */
    void (*npuDoneListener)(void);

} npuListener_s;

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

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

/*!
* \brief 在上层准备好之后，重新启动npu
*/
void reStartNpu(void);

/*!
* \brief 查看当前npu的是否仍然是enable状态，若不在enable，则表明此时npu已经工作结束，处于空闲状态
*/
uint8_t getNpuEn(void);
#endif
