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