| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268 | 
							- /**************************************************************************************************
 
-  
 
-   Phyplus Microelectronics Limited confidential and proprietary. 
 
-   All rights reserved.
 
-   IMPORTANT: All rights of this software belong to Phyplus Microelectronics 
 
-   Limited ("Phyplus"). Your use of this Software is limited to those 
 
-   specific rights granted under  the terms of the business contract, the 
 
-   confidential agreement, the non-disclosure agreement and any other forms 
 
-   of agreements as a customer or a partner of Phyplus. You may not use this 
 
-   Software unless you agree to abide by the terms of these agreements. 
 
-   You acknowledge that the Software may not be modified, copied, 
 
-   distributed or disclosed unless embedded on a Phyplus Bluetooth Low Energy 
 
-   (BLE) integrated circuit, either as a product or is integrated into your 
 
-   products.  Other than for the aforementioned purposes, you may not use, 
 
-   reproduce, copy, prepare derivative works of, modify, distribute, perform, 
 
-   display or sell this Software and/or its documentation for any purposes.
 
-   YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE
 
-   PROVIDED AS IS WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,
 
-   INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,
 
-   NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL
 
-   PHYPLUS OR ITS SUBSIDIARIES BE LIABLE OR OBLIGATED UNDER CONTRACT,
 
-   NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER
 
-   LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES
 
-   INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE
 
-   OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT
 
-   OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
 
-   (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
 
-   
 
- **************************************************************************************************/
 
- #include <string.h>
 
- #include "ap_cp.h"
 
- #include "clock.h"
 
- #include "pwrmgr.h"
 
- #include "error.h"
 
- #include "log.h"
 
- #include "dma.h"
 
- typedef struct{
 
-   bool init_flg;
 
-   
 
- }dma_ctx_t;
 
- const static AP_DMACH_TypeDef* spDMACh[8] = {
 
- 		AP_DMACH0,	// GPDMA Channel 0
 
- 		AP_DMACH1,	// GPDMA Channel 1
 
- 		AP_DMACH2,	// GPDMA Channel 2
 
- 		AP_DMACH3,	// GPDMA Channel 3
 
- 		AP_DMACH4,	// GPDMA Channel 4
 
- 		AP_DMACH5,	// GPDMA Channel 5
 
- 		AP_DMACH6,	// GPDMA Channel 6
 
- 		AP_DMACH7,	// GPDMA Channel 7
 
- };
 
- dma_ctx_t s_dma_ctx = {
 
-   .init_flg = FALSE,
 
- };
 
- /**
 
-  * @brief Optimized Peripheral Source and Destination burst size
 
-  */
 
- const uint8_t DMA_LUTPerBurst[] = {
 
- 		DMA_BSIZE_1,				// Memory
 
- 		DMA_BSIZE_32,				// SD Card
 
- 		DMA_BSIZE_4,				// SSP0 Tx
 
- 		DMA_BSIZE_4,				// SSP0 Rx
 
- 		DMA_BSIZE_4,				// SSP1 Tx
 
- 		DMA_BSIZE_4,				// SSP1 Rx
 
- 		DMA_BSIZE_4,				// SSP2 Tx
 
- 		DMA_BSIZE_4,				// SSP2 Rx
 
- 		DMA_BSIZE_4,				// ADC
 
- 		DMA_BSIZE_1,				// DAC
 
- 		DMA_BSIZE_1,				// UART0 Tx
 
- 		DMA_BSIZE_1,				// UART0 Rx
 
- 		DMA_BSIZE_1,				// UART1 Tx
 
- 		DMA_BSIZE_1,				// UART1 Rx
 
- 		DMA_BSIZE_1,				// UART2 Tx
 
- 		DMA_BSIZE_1,				// UART2 Rx
 
- 		DMA_BSIZE_1,				// MAT0.0
 
- 		DMA_BSIZE_1,				// MAT0.1
 
- 		DMA_BSIZE_1,				// MAT1.0
 
- 		DMA_BSIZE_1,				// MAT1.1
 
- 		DMA_BSIZE_1,				// MAT2.0
 
- 		DMA_BSIZE_1,				// MAT2.1
 
- 		DMA_BSIZE_32, 			// I2S channel 0
 
- 		DMA_BSIZE_32, 			// I2S channel 1
 
- 		0,							// Reserved
 
- 		0, 							// Reserved
 
- 		DMA_BSIZE_1,				// UART3 Tx
 
- 		DMA_BSIZE_1,				// UART3 Rx
 
- 		DMA_BSIZE_1,				// UART4 Tx
 
- 		DMA_BSIZE_1,				// UART4 Rx
 
- 		DMA_BSIZE_1,				// MAT3.0
 
- 		DMA_BSIZE_1,				// MAT3.1
 
- };
 
- /**
 
-  * @brief Optimized Peripheral Source and Destination transfer width
 
-  */
 
- const uint8_t DMA_LUTPerWid[] = {
 
- 		DMA_WIDTH_WORD,				// memory
 
- 		DMA_WIDTH_WORD,				// SD Card
 
- 		DMA_WIDTH_BYTE,				// SSP0 Tx
 
- 		DMA_WIDTH_BYTE,				// SSP0 Rx
 
- 		DMA_WIDTH_BYTE,				// SSP1 Tx
 
- 		DMA_WIDTH_BYTE,				// SSP1 Rx
 
- 		DMA_WIDTH_BYTE,				// SSP2 Tx
 
- 		DMA_WIDTH_BYTE,				// SSP2 Rx
 
- 		DMA_WIDTH_WORD,				// ADC
 
- 		DMA_WIDTH_BYTE,				// DAC
 
- 		DMA_WIDTH_BYTE,				// UART0 Tx
 
- 		DMA_WIDTH_BYTE,				// UART0 Rx
 
- 		DMA_WIDTH_BYTE,				// UART1 Tx
 
- 		DMA_WIDTH_BYTE,				// UART1 Rx
 
- 		DMA_WIDTH_BYTE,				// UART2 Tx
 
- 		DMA_WIDTH_BYTE,				// UART2 Rx
 
- 		DMA_WIDTH_WORD,				// MAT0.0
 
- 		DMA_WIDTH_WORD,				// MAT0.1
 
- 		DMA_WIDTH_WORD,				// MAT1.0
 
- 		DMA_WIDTH_WORD,				// MAT1.1
 
- 		DMA_WIDTH_WORD,				// MAT2.0
 
- 		DMA_WIDTH_WORD,				// MAT2.1
 
- 		DMA_WIDTH_WORD, 				// I2S channel 0
 
- 		DMA_WIDTH_WORD, 				// I2S channel 1
 
- 		0,								// Reserved
 
- 		0, 								// Reserved
 
- 		DMA_WIDTH_BYTE,				// UART3 Tx
 
- 		DMA_WIDTH_BYTE,				// UART3 Rx
 
- 		DMA_WIDTH_BYTE,				// UART4 Tx
 
- 		DMA_WIDTH_BYTE,				// UART4 Rx
 
- 		DMA_WIDTH_WORD,				// MAT3.0
 
- 		DMA_WIDTH_WORD,				// MAT3.1
 
- };
 
- int dma_config_channel(dma_ch_t ch, dma_ch_cfg_t* cfg)
 
- {
 
- 	AP_DMACH_TypeDef *pdma;
 
- 	uint32_t cctrl = 0;
 
- 	uint32_t transf_type = DMA_TRANSFERTYPE_M2M;
 
- 	uint32_t src_bsize = DMA_BSIZE_1;
 
- 	uint32_t dst_bsize = DMA_BSIZE_1;
 
- 	uint32_t src_wide = DMA_WIDTH_WORD;
 
- 	uint32_t dst_wide = DMA_WIDTH_WORD;
 
-   if(!s_dma_ctx.init_flg)
 
-     return PPlus_ERR_NOT_REGISTED;
 
- 	clk_gate_enable(MOD_DMA);
 
- 	
 
- 	if (AP_DMA->EnbldChns & (DMA_DMACEnbldChns_Ch(ch))) {
 
- 		// This channel is enabled, return ERROR, need to release this channel first
 
- 		return PPlus_ERR_BUSY;
 
- 	}
 
- 	// Get Channel
 
- 	pdma = (AP_DMACH_TypeDef *) spDMACh[ch];
 
- 	// Reset the Interrupt status
 
- 	AP_DMA->IntTCClear = DMA_DMACIntTCClear_Ch(ch);
 
- 	AP_DMA->IntErrClr = DMA_DMACIntErrClr_Ch(ch);
 
- 	// Clear DMA configure
 
- 	pdma->CControl = 0x00;
 
- 	pdma->CConfig = 0x00;
 
- 	/* Assign Linker List Item value */
 
- 	pdma->CLLI = cfg->lli;
 
- 	if(cfg->src_conn && cfg->dst_conn){
 
- 	  transf_type = DMA_TRANSFERTYPE_P2P;
 
- 	  src_bsize = DMA_LUTPerBurst[cfg->src_conn];
 
- 	  dst_bsize = DMA_LUTPerBurst[cfg->dst_conn];
 
-   	src_wide = DMA_LUTPerWid[cfg->src_conn];
 
-   	dst_wide = DMA_LUTPerWid[cfg->dst_conn];
 
- 	}
 
- 	else if(cfg->src_conn){
 
- 	  transf_type = DMA_TRANSFERTYPE_P2M;
 
- 	  src_bsize = DMA_LUTPerBurst[cfg->src_conn];
 
-   	src_wide = DMA_LUTPerWid[cfg->src_conn];
 
- 	}
 
- 	else if(cfg->dst_conn){
 
- 	  transf_type = DMA_TRANSFERTYPE_M2P;
 
- 	  dst_bsize = DMA_LUTPerBurst[cfg->dst_conn];
 
-   	dst_wide = DMA_LUTPerWid[cfg->dst_conn];
 
- 	}
 
-   pdma->CSrcAddr = cfg->src_addr;
 
- 	pdma->CDestAddr = cfg->dst_addr;
 
- 	
 
- 	//pdma->CControl =  0x8c480005;//DMA_DMACCxControl_TransferSize(cfg->transf_size)| 
 
- 	cctrl =  DMA_DMACCxControl_TransferSize(cfg->transf_size)| \
 
-            DMA_DMACCxControl_SBSize(src_bsize)| \
 
-            DMA_DMACCxControl_DBSize(dst_bsize)| \
 
-            DMA_DMACCxControl_SWidth(src_wide)| \
 
-            DMA_DMACCxControl_DWidth(dst_wide);
 
-   if(cfg->di)
 
-     cctrl |= DMA_DMACCxControl_DI;
 
-   if(cfg->si)
 
-     cctrl |= DMA_DMACCxControl_SI;
 
- 		
 
- 	if(cfg->enable_int)
 
- 		cctrl |= DMA_DMACCxControl_I;
 
-   pdma->CControl = cctrl;
 
- 	/* Enable DMA channels, little endian */
 
- 	AP_DMA->Config = DMA_DMACConfig_E;
 
- 	while (!(AP_DMA->Config & DMA_DMACConfig_E));
 
- 	// Configure DMA Channel, enable Error Counter and Terminate counter
 
- 	//pdma->CConfig = DMA_DMACCxConfig_IE | DMA_DMACCxConfig_ITC|DMA_DMACCxConfig_TransferType(transf_type)
 
- 	pdma->CConfig = DMA_DMACCxConfig_TransferType(transf_type)| \
 
-                   DMA_DMACCxConfig_SrcPeripheral(cfg->src_conn)| \
 
-                   DMA_DMACCxConfig_DestPeripheral(cfg->dst_conn);	
 
- 	if(cfg->enable_int)
 
-   	pdma->CConfig |= DMA_DMACCxConfig_IE | DMA_DMACCxConfig_ITC;
 
-   return PPlus_SUCCESS;
 
- }
 
- int dma_start_channel(dma_ch_t ch, bool enable)
 
- {
 
- 	AP_DMACH_TypeDef *pDMAch;
 
-   if(!s_dma_ctx.init_flg)
 
-     return PPlus_ERR_NOT_REGISTED;
 
- 	
 
- 	// Get Channel pointer
 
- 	pDMAch = (AP_DMACH_TypeDef *) spDMACh[ch];
 
-   if(enable){
 
- 		pDMAch->CConfig |= DMA_DMACCxConfig_E;
 
- 	} else {
 
- 		pDMAch->CConfig &= ~DMA_DMACCxConfig_E;
 
- 	}
 
- 	return PPlus_SUCCESS;
 
- }
 
- int dma_wait_channel_complete(dma_ch_t ch)
 
- {
 
-   if(!s_dma_ctx.init_flg)
 
-     return PPlus_ERR_NOT_REGISTED;
 
-   return PPlus_SUCCESS;
 
- }
 
- int dma_init(void)
 
- {
 
-   s_dma_ctx.init_flg = TRUE;
 
-   return PPlus_SUCCESS;
 
- }
 
 
  |