145 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			145 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | /****************************************************************************
 | ||
|  | 
 | ||
|  | Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED. | ||
|  | 
 | ||
|  | This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT | ||
|  | be copied by any method or incorporated into another program without | ||
|  | the express written consent of Aerospace C.Power. This Information or any portion | ||
|  | thereof remains the property of Aerospace C.Power. The Information contained herein | ||
|  | is believed to be accurate and Aerospace C.Power assumes no responsibility or | ||
|  | liability for its use in any way and conveys no license or title under | ||
|  | any patent or copyright and makes no representation or warranty that this | ||
|  | Information is free from patent or copyright infringement. | ||
|  | 
 | ||
|  | ****************************************************************************/ | ||
|  | 
 | ||
|  | #ifndef _APB_DMA_H_
 | ||
|  | #define _APB_DMA_H_
 | ||
|  | 
 | ||
|  | #include "iot_config.h"
 | ||
|  | #include "dma_reg.h"
 | ||
|  | #include "apb_dma_hw.h"
 | ||
|  | 
 | ||
|  | #ifdef __cplusplus
 | ||
|  | extern "C" { | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #ifndef OK
 | ||
|  | #define OK (0)
 | ||
|  | #define ERROR (-1)
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | typedef int STATUS; | ||
|  | 
 | ||
|  | enum dma_verify_mode | ||
|  | { | ||
|  |     DMA_NONE, /* Disable this function */ | ||
|  |     DMA_CHKSUM, | ||
|  |     DMA_CRC8, | ||
|  |     DMA_CRC16, | ||
|  |     DMA_CRC24, | ||
|  |     DMA_CRC32 | ||
|  | }; | ||
|  | 
 | ||
|  | enum dma_crc_mode | ||
|  | { | ||
|  |     DMA_CRC_NOR, | ||
|  |     DMA_CRC_XOR, | ||
|  |     DMA_CRC_INV, | ||
|  |     DMA_CRC_RAW, | ||
|  |     DMA_CRC_REVERSE, | ||
|  | }; | ||
|  | 
 | ||
|  | enum dma_crc_polynomial | ||
|  | { | ||
|  |     DMA_CRC8_POLY =  0x00000031, | ||
|  |     DMA_CRC16_POLY = 0x00008005, | ||
|  |     DMA_CRC24_POLY = 0x00800063, | ||
|  |     DMA_CRC32_POLY = 0x04C11DB7 | ||
|  | }; | ||
|  | 
 | ||
|  | #define DESC_BUF_MAX_LEN    0x0FFF
 | ||
|  | #define DESC_OWNER_CPU      0x0
 | ||
|  | #define DESC_OWNER_DMA      0x1
 | ||
|  | 
 | ||
|  | typedef void (*dma_int_handler)(int device, int int_status); | ||
|  | 
 | ||
|  | typedef struct dma_tx_data_verify { | ||
|  |     enum dma_verify_mode ver_mode; | ||
|  |     /* if ver_mode = DMA_CHKSUM , no need to fill the following items. */ | ||
|  |     enum dma_crc_mode crc_mode; | ||
|  |     int crc_init_a0; /* if crc_init_a0 = true, the default value of crc will be 0x0, otherwize will be 0xFFFFFFFF */ | ||
|  |     int crc_polynomial; | ||
|  | } dma_verify; | ||
|  | 
 | ||
|  | typedef struct dma_int_config { | ||
|  |     dma_int_handler isr; | ||
|  |     int vector; | ||
|  |     int iot_hdl; | ||
|  | } dma_int; | ||
|  | 
 | ||
|  | typedef struct dma_entity { | ||
|  |     int base; | ||
|  |     int apb; | ||
|  |     int device; | ||
|  |     desc_t* tx; | ||
|  |     desc_t* rx; | ||
|  |     dma_int int_cfg; | ||
|  |     int verify_value; | ||
|  |     int verify_length; | ||
|  |     dma_verify verify_cfg; | ||
|  | } dma_dev; | ||
|  | 
 | ||
|  | typedef struct dma_sw_entity { | ||
|  |     int base; | ||
|  |     int device; | ||
|  |     desc_sw_t* tx; | ||
|  |     desc_sw_t* rx; | ||
|  |     dma_int_handler isr; | ||
|  |     int verify_value; | ||
|  |     int verify_length; | ||
|  |     dma_verify verify_cfg; | ||
|  | } dma_sw_dev; | ||
|  | 
 | ||
|  | typedef struct dma_hw_entity { | ||
|  |     int base; | ||
|  |     int device; | ||
|  |     desc_t* tx; | ||
|  |     desc_t* rx; | ||
|  |     dma_int_handler isr; | ||
|  | } dma_hw_dev; | ||
|  | 
 | ||
|  | STATUS dma_sw_open(int dev, dma_int_handler isr, dma_verify *verify); | ||
|  | STATUS dma_sw_close(int dev); | ||
|  | 
 | ||
|  | int dma_sw_ctrl(int dev, int cmd, int data); | ||
|  | int dma_sw_verify_value_get(int dev); | ||
|  | 
 | ||
|  | void dma_hw_init(dma_int_handler isr); | ||
|  | void dma_hw_deinit(int dev); | ||
|  | STATUS dma_hw_open(int dev, dma_int_handler isr, dma_verify *verify); | ||
|  | STATUS dma_hw_close(int dev); | ||
|  | STATUS dma_hw_start_send(int dev, desc_t* lst); | ||
|  | STATUS dma_hw_start_recieve_ext(int dev, desc_t* lst, uint8_t int_en); | ||
|  | void dma_hw_stop_recieve(int dev); | ||
|  | int dma_hw_ctrl(int dev, int cmd, int data); | ||
|  | void dma_hw_rx_octect_num_precise_ctl(int dev, uint8_t en); | ||
|  | 
 | ||
|  | #define dma_hw_start_recieve(dev, lst) \
 | ||
|  |     dma_hw_start_recieve_ext(dev, lst, 1) | ||
|  | 
 | ||
|  | /* brief dma_get_link_addr - get dma hw link addr. after dma starts,
 | ||
|  |  *  link_addr_reg always points to the next desc address. | ||
|  |  * @param dev :  dma drive. | ||
|  |  * @param dir :  1->DMA_HW_RX_LINK_ADDR | ||
|  |  *               0->DMA_HW_TX_LINK_ADDR | ||
|  |  */ | ||
|  | uint32_t IRAM_ATTR dma_get_link_addr_reg(int dev, uint8_t dir); | ||
|  | 
 | ||
|  | #ifdef __cplusplus
 | ||
|  | } | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #endif
 | ||
|  | 
 |