cp_dma_hal.c 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. /*
  2. * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include "soc/soc_caps.h"
  7. #include "hal/cp_dma_hal.h"
  8. #include "hal/cp_dma_ll.h"
  9. void cp_dma_hal_init(cp_dma_hal_context_t *hal, const cp_dma_hal_config_t *config)
  10. {
  11. hal->dev = &CP_DMA;
  12. cp_dma_ll_enable_clock(hal->dev, true);
  13. cp_dma_ll_reset_in_link(hal->dev);
  14. cp_dma_ll_reset_out_link(hal->dev);
  15. cp_dma_ll_reset_cmd_fifo(hal->dev);
  16. cp_dma_ll_reset_fifo(hal->dev);
  17. cp_dma_ll_enable_intr(hal->dev, UINT32_MAX, false);
  18. cp_dma_ll_clear_intr_status(hal->dev, UINT32_MAX);
  19. cp_dma_ll_enable_owner_check(hal->dev, true);
  20. }
  21. void cp_dma_hal_set_desc_base_addr(cp_dma_hal_context_t *hal, intptr_t outlink_base, intptr_t inlink_base)
  22. {
  23. /* set base address of the first descriptor */
  24. cp_dma_ll_tx_set_descriptor_base_addr(hal->dev, outlink_base);
  25. cp_dma_ll_rx_set_descriptor_base_addr(hal->dev, inlink_base);
  26. }
  27. void cp_dma_hal_deinit(cp_dma_hal_context_t *hal)
  28. {
  29. cp_dma_ll_enable_clock(hal->dev, false);
  30. hal->dev = NULL;
  31. }
  32. void cp_dma_hal_start(cp_dma_hal_context_t *hal)
  33. {
  34. // enable DMA engine
  35. cp_dma_ll_start_rx(hal->dev, true);
  36. cp_dma_ll_start_tx(hal->dev, true);
  37. // enable RX EOF interrupt
  38. cp_dma_ll_enable_intr(hal->dev, CP_DMA_LL_EVENT_RX_EOF, true);
  39. }
  40. void cp_dma_hal_stop(cp_dma_hal_context_t *hal)
  41. {
  42. // disable interrupt
  43. cp_dma_ll_enable_intr(hal->dev, CP_DMA_LL_EVENT_RX_EOF, false);
  44. // disable DMA
  45. cp_dma_ll_start_rx(hal->dev, false);
  46. cp_dma_ll_start_tx(hal->dev, false);
  47. }
  48. uint32_t cp_dma_hal_get_intr_status(cp_dma_hal_context_t *hal)
  49. {
  50. return cp_dma_ll_get_intr_status(hal->dev);
  51. }
  52. void cp_dma_hal_clear_intr_status(cp_dma_hal_context_t *hal, uint32_t mask)
  53. {
  54. cp_dma_ll_clear_intr_status(hal->dev, mask);
  55. }
  56. void cp_dma_hal_restart_tx(cp_dma_hal_context_t *hal)
  57. {
  58. cp_dma_ll_restart_tx(hal->dev);
  59. }
  60. void cp_dma_hal_restart_rx(cp_dma_hal_context_t *hal)
  61. {
  62. cp_dma_ll_restart_rx(hal->dev);
  63. }