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