drv_pdma.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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. #ifndef __DRV_PDMA_H__
  13. #define __DRV_PDMA_H__
  14. #include <rtconfig.h>
  15. #include <rtthread.h>
  16. #include "NuMicro.h"
  17. #ifndef NU_PDMA_SGTBL_POOL_SIZE
  18. #define NU_PDMA_SGTBL_POOL_SIZE (16)
  19. #endif
  20. #define NU_PDMA_CAP_NONE (0 << 0)
  21. #define NU_PDMA_EVENT_ABORT (1 << 0)
  22. #define NU_PDMA_EVENT_TRANSFER_DONE (1 << 1)
  23. #define NU_PDMA_EVENT_ALIGNMENT (1 << 2)
  24. #define NU_PDMA_EVENT_TIMEOUT (1 << 3)
  25. #define NU_PDMA_EVENT_ALL (NU_PDMA_EVENT_ABORT | NU_PDMA_EVENT_TRANSFER_DONE | NU_PDMA_EVENT_TIMEOUT)
  26. #define NU_PDMA_EVENT_MASK NU_PDMA_EVENT_ALL
  27. #define NU_PDMA_UNUSED (-1)
  28. #define NU_PDMA_SG_LIMITED_DISTANCE ((PDMA_DSCT_NEXT_NEXT_Msk>>PDMA_DSCT_NEXT_NEXT_Pos)+1)
  29. #define NU_PDMA_MAX_TXCNT ((PDMA_DSCT_CTL_TXCNT_Msk>>PDMA_DSCT_CTL_TXCNT_Pos) + 1)
  30. typedef enum
  31. {
  32. eMemCtl_SrcFix_DstFix,
  33. eMemCtl_SrcFix_DstInc,
  34. eMemCtl_SrcInc_DstFix,
  35. eMemCtl_SrcInc_DstInc,
  36. eMemCtl_Undefined = (-1)
  37. } nu_pdma_memctrl_t;
  38. typedef DSCT_T *nu_pdma_desc_t;
  39. typedef void (*nu_pdma_cb_handler_t)(void *, uint32_t);
  40. typedef enum
  41. {
  42. eCBType_Event,
  43. eCBType_Trigger,
  44. eCBType_Disable,
  45. eCBType_Undefined = (-1)
  46. } nu_pdma_cbtype_t;
  47. struct nu_pdma_chn_cb
  48. {
  49. nu_pdma_cbtype_t m_eCBType;
  50. nu_pdma_cb_handler_t m_pfnCBHandler;
  51. void *m_pvUserData;
  52. uint32_t m_u32Reserved;
  53. };
  54. typedef struct nu_pdma_chn_cb *nu_pdma_chn_cb_t;
  55. int nu_pdma_channel_allocate(int32_t i32PeripType);
  56. rt_err_t nu_pdma_channel_free(int i32ChannID);
  57. rt_err_t nu_pdma_callback_register(int i32ChannID, nu_pdma_chn_cb_t psChnCb);
  58. rt_err_t nu_pdma_transfer(int i32ChannID, uint32_t u32DataWidth, uint32_t u32AddrSrc, uint32_t u32AddrDst, uint32_t i32TransferCnt, uint32_t u32IdleTimeout_us);
  59. int nu_pdma_transferred_byte_get(int32_t i32ChannID, int32_t i32TriggerByteLen);
  60. void nu_pdma_channel_terminate(int i32ChannID);
  61. nu_pdma_memctrl_t nu_pdma_channel_memctrl_get(int i32ChannID);
  62. rt_err_t nu_pdma_channel_memctrl_set(int i32ChannID, nu_pdma_memctrl_t eMemCtrl);
  63. nu_pdma_cb_handler_t nu_pdma_callback_hijack(int i32ChannID, nu_pdma_cbtype_t eCBType, nu_pdma_chn_cb_t psChnCb_Hijack);
  64. rt_err_t nu_pdma_filtering_set(int i32ChannID, uint32_t u32EventFilter);
  65. uint32_t nu_pdma_filtering_get(int i32ChannID);
  66. // For scatter-gather DMA
  67. 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);
  68. rt_err_t nu_pdma_sg_transfer(int i32ChannID, nu_pdma_desc_t head, uint32_t u32IdleTimeout_us);
  69. rt_err_t nu_pdma_sgtbls_allocate(nu_pdma_desc_t *ppsSgtbls, int num);
  70. void nu_pdma_sgtbls_free(nu_pdma_desc_t *ppsSgtbls, int num);
  71. // For memory actor
  72. void *nu_pdma_memcpy(void *dest, void *src, unsigned int count);
  73. rt_size_t nu_pdma_mempush(void *dest, void *src, uint32_t data_width, unsigned int transfer_count);
  74. #endif // __DRV_PDMA_H___