#ifndef _BSP_DMA_H_
#define _BSP_DMA_H_

#ifdef __cplusplus
extern "C" {
#endif 

#include "kit_macro.h"


typedef enum
{
    kDmaDev_1, 
    kDmaDev_2,    
    kDmaDev_End,
}DmaDev;    

typedef enum
{
    kDma1Stream_0 = 0,
    kDma1Stream_1,
    kDma1Stream_2,
    kDma1Stream_3,
    kDma1Stream_4,
    kDma1Stream_5,
    kDma1Stream_6,
    kDma1Stream_7,
    kDma2Stream_0,
    kDma2Stream_1,
    kDma2Stream_2,
    kDma2Stream_3,
    kDma2Stream_4,
    kDma2Stream_5,
    kDma2Stream_6,
    kDma2Stream_7,
    kDmaStream_End,
}DmaStream;

typedef enum
{
    kDmaChannel_0 = 0,
    kDmaChannel_1,
    kDmaChannel_2,
    kDmaChannel_3,
    kDmaChannel_4,
    kDmaChannel_5,
    kDmaChannel_6,
    kDmaChannel_7,
    kDmaChannel_End,
}DmaChannel;


#define DMA_CFG_DATA_DIR_P2M        KIT_BIT_MASK_32(0) //数据方向 外设到内存
#define DMA_CFG_DATA_DIR_M2P        KIT_BIT_MASK_32(1)
#define DMA_CFG_DATA_DIR_M2M        KIT_BIT_MASK_32(2)
#define DMA_CFG_CYCLE_NONE          KIT_BIT_MASK_32(3) //循环模式 不循环
#define DMA_CFG_CYCLE_EXE           KIT_BIT_MASK_32(4) 
#define DMA_CFG_DATA_M_N            KIT_BIT_MASK_32(5) //数据地址增长 内存不增长 外设不增长
#define DMA_CFG_DATA_M_I            KIT_BIT_MASK_32(6) //数据地址增长 内存不增长 外设增长
#define DMA_CFG_DATA_P_N            KIT_BIT_MASK_32(7) 
#define DMA_CFG_DATA_P_I            KIT_BIT_MASK_32(8) 
#define DMA_CFG_DATA_LEN_1B         KIT_BIT_MASK_32(9) //数据长度 1字节
#define DMA_CFG_DATA_LEN_2B         KIT_BIT_MASK_32(10) 
#define DMA_CFG_DATA_LEN_4B         KIT_BIT_MASK_32(11)



kit_ret_e drv_dma_init(DmaStream stream_idx, DmaChannel channel, uint32_t dma_config, uint32_t addr);
void      drv_dma_set_buf_with_call(DmaStream ch_idx,uint8_t* buf, uint16_t len, UintArgFunCall call);
void      drv_dma_set_interrupt(DmaStream ch_idx, uint8_t priority, KitIrqCall call);
void      drv_dma_set_buf(DmaStream ch_idx,uint8_t* buf, uint16_t len);
kit_ret_e drv_dma_rx_tx(DmaStream dma_rx_ch,  DmaStream dma_tx_ch, uint8_t *tx_buf, uint16_t tx_len, uint8_t *rx_buf, uint16_t rx_len, uint16_t timeout);
kit_ret_e drv_dma_async_rx_tx(DmaStream dma_rx_ch,  DmaStream dma_tx_ch, uint8_t *tx_buf, uint16_t tx_len, uint8_t *rx_buf, uint16_t rx_len);
kit_ret_e drv_dma_send(DmaStream dma_tx_ch, uint8_t *tx_buf, uint16_t tx_len);
kit_ret_e drv_dma_receive(DmaStream dma_rx_ch, DmaStream dma_tx_ch, uint8_t *rx_buf, uint16_t rx_len);
#ifdef __cplusplus
}
#endif

#endif