1 /**************************************************************************//** 2 * 3 * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. 4 * 5 * SPDX-License-Identifier: Apache-2.0 6 * 7 * Change Logs: 8 * Date Author Notes 9 * 2020-2-7 Wayne First version 10 * 11 ******************************************************************************/ 12 13 #ifndef __DRV_PDMA_H__ 14 #define __DRV_PDMA_H__ 15 16 #include <rtconfig.h> 17 #include <rtthread.h> 18 #include "NuMicro.h" 19 #include <board.h> 20 21 #define NU_PDMA_CAP_NONE (0 << 0) 22 23 #define NU_PDMA_EVENT_ABORT (1 << 0) 24 #define NU_PDMA_EVENT_TRANSFER_DONE (1 << 1) 25 #define NU_PDMA_EVENT_ALIGNMENT (1 << 2) 26 #define NU_PDMA_EVENT_TIMEOUT (1 << 3) 27 #define NU_PDMA_EVENT_ALL (NU_PDMA_EVENT_ABORT | NU_PDMA_EVENT_TRANSFER_DONE | NU_PDMA_EVENT_TIMEOUT) 28 #define NU_PDMA_EVENT_MASK NU_PDMA_EVENT_ALL 29 #define NU_PDMA_UNUSED (-1) 30 31 #define NU_PDMA_SG_LIMITED_DISTANCE (BOARD_SDRAM_SIZE) 32 #define NU_PDMA_MAX_TXCNT ((PDMA_DSCT_CTL_TXCNT_Msk>>PDMA_DSCT_CTL_TXCNT_Pos) + 1) 33 34 typedef enum 35 { 36 eMemCtl_SrcFix_DstFix, 37 eMemCtl_SrcFix_DstInc, 38 eMemCtl_SrcInc_DstFix, 39 eMemCtl_SrcInc_DstInc, 40 eMemCtl_Undefined = (-1) 41 } nu_pdma_memctrl_t; 42 43 typedef DSCT_T *nu_pdma_desc_t; 44 45 typedef void (*nu_pdma_cb_handler_t)(void *, uint32_t); 46 47 typedef enum 48 { 49 eCBType_Event, 50 eCBType_Trigger, 51 eCBType_Disable, 52 eCBType_Undefined = (-1) 53 } nu_pdma_cbtype_t; 54 55 struct nu_pdma_chn_cb 56 { 57 nu_pdma_cbtype_t m_eCBType; 58 nu_pdma_cb_handler_t m_pfnCBHandler; 59 void *m_pvUserData; 60 uint32_t m_u32Reserved; 61 }; 62 typedef struct nu_pdma_chn_cb *nu_pdma_chn_cb_t; 63 64 int nu_pdma_channel_allocate(int32_t i32PeripType); 65 rt_err_t nu_pdma_channel_free(int i32ChannID); 66 rt_err_t nu_pdma_callback_register(int i32ChannID, nu_pdma_chn_cb_t psChnCb); 67 rt_err_t nu_pdma_transfer(int i32ChannID, uint32_t u32DataWidth, uint32_t u32AddrSrc, uint32_t u32AddrDst, uint32_t i32TransferCnt, uint32_t u32IdleTimeout_us); 68 int nu_pdma_transferred_byte_get(int32_t i32ChannID, int32_t i32TriggerByteLen); 69 void nu_pdma_channel_terminate(int i32ChannID); 70 nu_pdma_memctrl_t nu_pdma_channel_memctrl_get(int i32ChannID); 71 rt_err_t nu_pdma_channel_memctrl_set(int i32ChannID, nu_pdma_memctrl_t eMemCtrl); 72 73 nu_pdma_cb_handler_t nu_pdma_callback_hijack(int i32ChannID, nu_pdma_cbtype_t eCBType, nu_pdma_chn_cb_t psChnCb_Hijack); 74 rt_err_t nu_pdma_filtering_set(int i32ChannID, uint32_t u32EventFilter); 75 uint32_t nu_pdma_filtering_get(int i32ChannID); 76 nu_pdma_desc_t nu_pdma_get_channel_desc(int32_t i32ChannID); 77 78 // For scatter-gather DMA 79 rt_err_t nu_pdma_desc_setup(int i32ChannID, nu_pdma_desc_t dma_desc, uint32_t u32DataWidth, uint32_t u32AddrSrc, uint32_t u32AddrDst, int32_t TransferCnt, nu_pdma_desc_t next, uint32_t u32BeSilent); 80 rt_err_t nu_pdma_sg_transfer(int i32ChannID, nu_pdma_desc_t head, uint32_t u32IdleTimeout_us); 81 rt_err_t nu_pdma_sgtbls_allocate(nu_pdma_desc_t *ppsSgtbls, int num); 82 void nu_pdma_sgtbls_free(nu_pdma_desc_t *ppsSgtbls, int num); 83 84 // For memory actor 85 void *nu_pdma_memcpy(void *dest, void *src, unsigned int count); 86 rt_size_t nu_pdma_mempush(void *dest, void *src, uint32_t data_width, unsigned int transfer_count); 87 88 #endif // __DRV_PDMA_H___ 89