/***********************************************************************
 * Copyright (c)  2017 - 2022, Unicmicro Co.,Ltd .
 * All rights reserved.
 * Filename    : dma.c
 * Description : dma driver source file
 * Author(s)   : Hackett
 * version     : V1.0
 * Modify date : 2022-7-11
 ***********************************************************************/
#ifndef __DMA_H__
#define __DMA_H__

#include  "um321xF.h"


/********* DMA源地址和目的地址传输数据位宽 **********/
#define DMA_TR_WIDTH_8									((uint32_t)0<<30)			//8位数据位宽
#define DMA_TR_WIDTH_16									((uint32_t)1<<30)			//16位数据位宽	
#define DMA_TR_WIDTH_32									((uint32_t)2<<30)			//32位数据位宽

/******** DMA传输模式 *************/
#define DMA_MEM_TO_MEM                  				(0<<12)			//memory to memory
#define DMA_MEM_TO_PERIP                				(1<<12)			//memory to peripheral
#define DMA_PERIP_TO_MEM                				(2<<12)			//peripheral to memory
#define DMA_PERIP_TO_PERIP              				(3<<12)			//peripheral to peripheral

/***********SRC_INC**********/
#define DMA_SINC_INC		            				(1<<1)			//源地址递增	
#define DMA_SINC_DEC		            				(2<<1)			//源地址递减		
#define DMA_SINC_NOC		            				(0<<1)			//源地址不变	
				
/***********DST_INC**********/																				
#define DMA_DINC_INC		            				(1<<3)			//目的地址递增		
#define DMA_DINC_DEC		            				(2<<3)			//目的地址递减 
#define DMA_DINC_NOC		            				(0<<3)			//目的地址不变

/***********源外设硬件握手信号SRC_PER**********/
#define DMA_SRC_PER_MEMORY								(0<<0)
#define DMA_SRC_PER_SPI0_RX								(1<<0)			//SPI0接收
#define DMA_SRC_PER_SPI1_RX								(3<<0)			//SPI1接收
#define DMA_SRC_PER_UART1_RX							(5<<0)			//UART1接收
#define DMA_SRC_PER_ADC_RX								(6<<0)			//ADC接收
#define DMA_SRC_PER_GPIO0_GTIMER						(7<<0)			//GPIO0_GTIMER中断信号
#define DMA_SRC_PER_LPTIMER3_RX2						(8<<0)
#define DMA_SRC_PER_LPTIMER3_RX1						(9<<0)
#define DMA_SRC_PER_LPTIMER2_RX2						(10<<0)
#define DMA_SRC_PER_LPTIMER2_RX1						(11<<0)
#define DMA_SRC_PER_LPTIMER1_RX2						(12<<0)
#define DMA_SRC_PER_LPTIMER1_RX1						(13<<0)
#define DMA_SRC_PER_LPTIMER0_RX2						(14<<0)
#define DMA_SRC_PER_LPTIMER0_RX1						(15<<0)
#define DMA_SRC_PER_ATIMER_CTU							(16<<0)
#define DMA_SRC_PER_ATIMER_CC4							(17<<0)
#define DMA_SRC_PER_ATIMER_CC3							(18<<0)
#define DMA_SRC_PER_ATIMER_CC2							(19<<0)
#define DMA_SRC_PER_ATIMER_CC1							(20<<0)

/***********目的外设硬件握手信号DST_PER**********/
#define DMA_DST_PER_SPI0_TX								(0<<0)
#define DMA_DST_PER_SPI1_TX								(2<<0)			//SPI0接收
#define DMA_DST_PER_UART1_TX							(4<<0)			//SPI1接收
#define DMA_DST_PER_GPIO0_GTIMER						(7<<0)			//GPIO0_GTIMER中断信号
#define DMA_DST_PER_ATIMER_CTU							(16<<0)
#define DMA_DST_PER_ATIMER_CC4							(17<<0)
#define DMA_DST_PER_ATIMER_CC3							(18<<0)
#define DMA_DST_PER_ATIMER_CC2							(19<<0)
#define DMA_DST_PER_ATIMER_CC1							(20<<0)


#define DMA_IRQ_ENABLE									(1)
#define DMA_IRQ_DISABLE                                 (0)

/*******************************************************************
* Function		: dmac_int
* Description	: dmac_int				DMA初始化
* Input			: uint8_t channel_index	DMA通道号
*				  uint32_t data_widt	配置数据位宽
*				  uint32_t flow_type	传输模式
* Output		: none
* Return		: none
********************************************************************/
void dma_init(uint8_t channel_index, uint32_t data_width, uint32_t flow_type);

/*******************************************************************
* Function		: dma_source_config
* Description	: dma_source_config			DMA源配置
* Input			: uint8_t channel_index		DMA通道号
*				  uint8_t source_per		源握手信号
*				  uint32_t source_direction	源方向（DMA_SINC_INC/DMA_SINC_DEC/DMA_SINC_NOC）
* Output		: none
* Return		: none
********************************************************************/
void dma_source_config(uint8_t channel_index, uint8_t source_per, uint32_t source_direction);

/*******************************************************************
* Function		: dma_destination_config
* Description	: dma_destination_config		DMA源配置
* Input			: uint8_t channel_index			DMA通道号
*				  uint8_t destination_per		目的握手信号
*				  uint32_t destination_direction目的方向（DMA_DINC_INC/DMA_DINC_DEC/DMA_DINC_NOC）
* Output		: none
* Return		: none
********************************************************************/
void dma_destination_config(uint8_t channel_index, uint8_t destination_per, uint32_t destination_direction);

/*******************************************************************
* Function		: dma_irq_init
* Description	: dma_irq_init DMA中断初始化
* Input			: uint8_t channel_index   DMA通道号
*                 uint8_t irq_enable      DMA中断使能开关
*                 void (*pfunc_tc)()      DMA中断回调函数
* Output		: none
* Return		: none
********************************************************************/
void dma_irq_init(uint8_t channel_index,uint8_t irq_enable,void (*pfunc_tc)());

/*******************************************************************
* Function		: dma_controler_enable
* Description	: dma_controler_enable	dma控制器使能
* Input			: none
* Output		: none
* Return		: none
********************************************************************/
void dma_controler_enable(void);

/*******************************************************************
* Function		: dma_controler_disable
* Description	: dma_controler_disable	dma控制器失能
* Input			: none
* Output		: none
* Return		: none
********************************************************************/
void dma_controler_disable(void);

/************************************************************************
 * Function   	: dma_irq_transfer
 * Description	: dma_irq_transfe			中断方式时使用此函数启动DMA转换
 * Input 		:  uint8_t channel_index	DMA通道编号
 *         		   uint32_t src_addr		源地址
 *                 uint32_t dest_addr		目的地址
 *  	           uint16_t length			传输数据长度，最大为2^15-1
 * Output		: none
 * Return		: none
 ************************************************************************/
void dma_irq_transfer(uint8_t channel_index, uint32_t src_addr, uint32_t dest_addr, uint16_t length);
 
/************************************************************************
 * Function   	: dma_poll_transfer
 * Description	: dma_poll_transfer			查询方式时使用此函数启动DMA转换
 * Input 		:  uint8_t channel_index	DMA通道编号
 *         		   uint32_t src_addr		源地址
 *                 uint32_t dest_addr		目的地址
 *  	           uint16_t length			传输数据长度，最大为2^15-1
 * Output		: none
 * Return		: none
 ************************************************************************/
void dma_poll_transfer(uint8_t channel_index, uint32_t src_addr, uint32_t dest_addr, uint16_t length);

#endif

