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 20 #ifndef NU_PDMA_SGTBL_POOL_SIZE 21 #define NU_PDMA_SGTBL_POOL_SIZE (16) 22 #endif 23 24 #define NU_PDMA_CAP_NONE (0 << 0) 25 26 #define NU_PDMA_EVENT_ABORT (1 << 0) 27 #define NU_PDMA_EVENT_TRANSFER_DONE (1 << 1) 28 #define NU_PDMA_EVENT_TIMEOUT (1 << 2) 29 #define NU_PDMA_EVENT_ALL (NU_PDMA_EVENT_ABORT | NU_PDMA_EVENT_TRANSFER_DONE | NU_PDMA_EVENT_TIMEOUT) 30 #define NU_PDMA_EVENT_MASK NU_PDMA_EVENT_ALL 31 #define NU_PDMA_UNUSED (-1) 32 33 #define NU_PDMA_SG_LIMITED_DISTANCE ((PDMA_DSCT_NEXT_NEXT_Msk>>PDMA_DSCT_NEXT_NEXT_Pos)+1) 34 #define NU_PDMA_MAX_TXCNT ((PDMA_DSCT_CTL_TXCNT_Msk>>PDMA_DSCT_CTL_TXCNT_Pos) + 1) 35 36 typedef enum 37 { 38 eMemCtl_SrcFix_DstFix, 39 eMemCtl_SrcFix_DstInc, 40 eMemCtl_SrcInc_DstFix, 41 eMemCtl_SrcInc_DstInc, 42 eMemCtl_Undefined = (-1) 43 } nu_pdma_memctrl_t; 44 45 typedef DSCT_T *nu_pdma_desc_t; 46 47 typedef void (*nu_pdma_cb_handler_t)(void *, uint32_t); 48 49 int nu_pdma_channel_allocate(int32_t i32PeripType); 50 rt_err_t nu_pdma_channel_free(int i32ChannID); 51 rt_err_t nu_pdma_callback_register(int i32ChannID, nu_pdma_cb_handler_t pfnHandler, void *pvUserData, uint32_t u32EventFilter); 52 rt_err_t nu_pdma_transfer(int i32ChannID, uint32_t u32DataWidth, uint32_t u32AddrSrc, uint32_t u32AddrDst, int32_t i32TransferCnt, uint32_t u32IdleTimeout_us); 53 int nu_pdma_transferred_byte_get(int32_t i32ChannID, int32_t i32TriggerByteLen); 54 void nu_pdma_channel_terminate(int i32ChannID); 55 nu_pdma_memctrl_t nu_pdma_channel_memctrl_get(int i32ChannID); 56 rt_err_t nu_pdma_channel_memctrl_set(int i32ChannID, nu_pdma_memctrl_t eMemCtrl); 57 58 nu_pdma_cb_handler_t nu_pdma_callback_hijack(int i32ChannID, nu_pdma_cb_handler_t *ppfnHandler_Hijack, 59 void **ppvUserData_Hijack, uint32_t *pu32EventFilter_Hijack); 60 61 // For scatter-gather DMA 62 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); 63 rt_err_t nu_pdma_sg_transfer(int i32ChannID, nu_pdma_desc_t head, uint32_t u32IdleTimeout_us); 64 rt_err_t nu_pdma_sgtbls_allocate(nu_pdma_desc_t *ppsSgtbls, int num); 65 void nu_pdma_sgtbls_free(nu_pdma_desc_t *ppsSgtbls, int num); 66 67 68 // For memory actor 69 void *nu_pdma_memcpy(void *dest, void *src, unsigned int count); 70 rt_size_t nu_pdma_mempush(void *dest, void *src, uint32_t data_width, unsigned int transfer_count); 71 72 #endif // __DRV_PDMA_H___ 73