rmt_hal.c 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. /*
  2. * SPDX-FileCopyrightText: 2019-2022 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include "hal/rmt_hal.h"
  7. #include "hal/rmt_ll.h"
  8. #include "soc/soc_caps.h"
  9. void rmt_hal_init(rmt_hal_context_t *hal)
  10. {
  11. hal->regs = &RMT;
  12. rmt_ll_power_down_mem(hal->regs, false); // turn on RMTMEM power domain
  13. rmt_ll_enable_mem_access_nonfifo(hal->regs, true); // APB access the RMTMEM in nonfifo mode
  14. rmt_ll_enable_interrupt(hal->regs, UINT32_MAX, false); // disable all interupt events
  15. rmt_ll_clear_interrupt_status(hal->regs, UINT32_MAX); // clear all pending events
  16. #if SOC_RMT_SUPPORT_TX_SYNCHRO
  17. rmt_ll_tx_clear_sync_group(hal->regs);
  18. #endif // SOC_RMT_SUPPORT_TX_SYNCHRO
  19. }
  20. void rmt_hal_deinit(rmt_hal_context_t *hal)
  21. {
  22. rmt_ll_enable_interrupt(hal->regs, UINT32_MAX, false); // disable all interupt events
  23. rmt_ll_clear_interrupt_status(hal->regs, UINT32_MAX); // clear all pending events
  24. rmt_ll_power_down_mem(hal->regs, true); // turn off RMTMEM power domain
  25. hal->regs = NULL;
  26. }
  27. void rmt_hal_tx_channel_reset(rmt_hal_context_t *hal, uint32_t channel)
  28. {
  29. rmt_ll_tx_reset_channels_clock_div(hal->regs, 1 << channel);
  30. rmt_ll_tx_reset_pointer(hal->regs, channel);
  31. #if SOC_RMT_SUPPORT_TX_LOOP_COUNT
  32. rmt_ll_tx_reset_loop_count(hal->regs, channel);
  33. #endif // SOC_RMT_SUPPORT_TX_LOOP_COUNT
  34. rmt_ll_enable_interrupt(hal->regs, RMT_LL_EVENT_TX_MASK(channel), false);
  35. rmt_ll_clear_interrupt_status(hal->regs, RMT_LL_EVENT_TX_MASK(channel));
  36. }
  37. void rmt_hal_rx_channel_reset(rmt_hal_context_t *hal, uint32_t channel)
  38. {
  39. rmt_ll_rx_reset_channels_clock_div(hal->regs, 1 << channel);
  40. rmt_ll_rx_reset_pointer(hal->regs, channel);
  41. rmt_ll_enable_interrupt(hal->regs, RMT_LL_EVENT_RX_MASK(channel), false);
  42. rmt_ll_clear_interrupt_status(hal->regs, RMT_LL_EVENT_RX_MASK(channel));
  43. }