/*******************************************************************************
* Copyright (C) 2021-2022, All Rights Reserved.
*
* File:        hal_spi_slave.h
* Description  spi slave hal file
* Version      V0.1
* Date         2021-10-23
* Author       lzy
*******************************************************************************/
#ifndef __HAL_SPI_SLAVE_H__
#define __HAL_SPI_SLAVE_H__

/*******************************************************************************
* 1.Included files
*******************************************************************************/
#include "tau_dsi_datatype.h"
#include "tau_common.h"

/*******************************************************************************
* 2.Global constant and macro definitions using #define
*******************************************************************************/

/*******************************************************************************
* 3.Global structures, unions and enumerations using typedef
*******************************************************************************/
/*
自动模式event eg:rx_buffer_size=8, host发送16个byte数据,
收到前面8byte数据时产生SPI_EVENT_RCV_FULL事件,后续的事件丢弃,
传输完成后host拉高CS,产生SPI_EVENT_RCV_CS_HIGH事件
*/
typedef enum
{
    SPI_EVENT_RCV_DATA            = 0,    /* 手动模式下，SPIS 接受每接收一个数据即产生事件 */
    SPI_EVENT_RCV_FULL,                   /* 自动模式下    ，SPIS 接收数据等于buffer size后产生事件 */
    SPI_EVENT_RCV_CS_HIGH,                /* 自动模式下    ，SPIS 收到CS 拉高的信号   */
} hal_spis_event_e;

typedef struct hal_spi_packet_info_t
{
    uint8_t           *rx_buffer;          /* 接收buffer   */
    uint32_t           rx_buffer_size;     /* 接收buffer size   */
    bool               rx_circle;          /* 接收circle mode   */
    const uint8_t     *tx_buffer;          /* 发送buffer   */
    uint32_t           tx_buffer_size;     /* 发送buffer size   */
    bool               tx_circle;          /* 发送circle mode */
    uint32_t           packet_size;        /* packet size */
} hal_spi_packet_info_t;

typedef void (*hal_spi_slave_cb)(hal_spis_event_e event, hal_spi_packet_info_t *packet_info);

/*******************************************************************************
* 4.Global variable extern declarations
*******************************************************************************/

/*******************************************************************************
* 5.Global function prototypes
*******************************************************************************/
/**
* @brief  初始化spi slave 模块
* @param  cpha: 相位配置
* @param  cpol: 极性配置
* @param  dma:  自动模式下DMA enable
* @retval true/false
*/
bool hal_spi_slave_init(uint8_t cpha, uint8_t cpol, bool dma);

/**
* @brief  spi slave 模块去初始化
* @param  none
* @retval true/false
*/
bool hal_spi_slave_deinit(void);

/**
* @brief  spi slave 注册回调函数
* @param  cb：call back
* @retval true/false
*/
bool hal_spi_slave_register_callback(hal_spi_slave_cb cb);

/**
* @brief  spi slave enable
* @param  none
* @retval true/false
*/
bool hal_spi_slave_enable(void);

/**
* @brief  spi slave disable
* @param  none
* @retval true/false
*/
bool hal_spi_slave_disable(void);

/**
* @brief  spi slave 配置自动接收buffer, 底层自动接收数据后调用callback, buffer为NULL时为自动接收模式
* @param  buffer：自动模式数据接收buffer
* @param  size：   自动模式数据接收buffer size
* @param  circle：circle mode，packet size 大于buffer size 时从offset 0重新写(暂不支持)
* @retval true/false
*/
bool hal_spi_slave_set_auto_rx_buffer(uint8_t *buffer, uint32_t size, bool circle);

/**
* @brief  spi slave 配置自动发送buffer
* @param  buffer：自动模式数据发送buffer, buffer为NULL为切换为自动模式
* @param  size：   自动模式数据发收buffer size
* @param  circle：circle mode，重复发送buffer的数据
* @retval true/false
*/
bool hal_spi_slave_set_auto_tx_buffer(const uint8_t *buffer, uint32_t size, bool circle);

/**
* @brief  spi slave 启动自动传输
* @param  none
* @retval true/false
*/
bool hal_spi_slave_auto_transfer_start(void);

/**
* @brief  spi slave 停止自动传输(circle mode 下packet结束可使用)
* @param  none
* @retval true/false
*/
bool hal_spi_slave_auto_transfer_abort(void);

/**
* @brief  spi slave flush fifo(circle mode 下packet结束后可使用)
* @param  none
* @retval true/false
*/
bool hal_spi_slave_flush_fifo(void);

/**
* @brief  reset spis tx,在启动spis后重新配置输出数据
* @param  buffer：自动模式数据发送buffer
* @param  size：   自动模式数据发收buffer size
* @param  circle：circle mode，重复发送buffer的数据
* @retval true/false
*/
bool hal_spi_slave_reset_tx(const uint8_t *buffer, uint32_t size, bool circle);

/**
* @brief  check spi slave busy(CS status)
* @param  none
* @retval true/false
*/
bool hal_spi_slave_busy(void);

/**
* @brief  获取rx fifo 非空
* @param  none
* @retval true/false
*/
bool hal_spi_slave_get_rxfifo_notempty(void);

/**
* @brief  手动模式下从rx fifo 读取数据
* @param  none
* @retval true/false
*/
bool hal_spi_slave_read_data(uint32_t *data);

/**
* @brief  手动模式下往tx fifo 写数据
* @param  none
* @retval true/false
*/
bool hal_spi_slave_write_data(const uint8_t data);

/**************************************************************************
* @name : hal_spi_s_set_high_impedance
* @brief : 将 SPI 从机的IO口设置为高阻态
* @param[in] :
* @return :
* @retval :
**************************************************************************/
void hal_spi_s_set_high_impedance(void);

#endif /* __HAL_SPI_SLAVE_H__*/

