rmt_hal.c 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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. hal->mem = &RMTMEM;
  13. }
  14. void rmt_hal_tx_channel_reset(rmt_hal_context_t *hal, uint32_t channel)
  15. {
  16. rmt_ll_tx_reset_pointer(hal->regs, channel);
  17. rmt_ll_tx_reset_loop(hal->regs, channel);
  18. rmt_ll_enable_tx_err_interrupt(hal->regs, channel, false);
  19. rmt_ll_enable_tx_end_interrupt(hal->regs, channel, false);
  20. rmt_ll_enable_tx_thres_interrupt(hal->regs, channel, false);
  21. rmt_ll_clear_tx_err_interrupt(hal->regs, channel);
  22. rmt_ll_clear_tx_end_interrupt(hal->regs, channel);
  23. rmt_ll_clear_tx_thres_interrupt(hal->regs, channel);
  24. }
  25. void rmt_hal_rx_channel_reset(rmt_hal_context_t *hal, uint32_t channel)
  26. {
  27. rmt_ll_rx_reset_pointer(hal->regs, channel);
  28. rmt_ll_enable_rx_err_interrupt(hal->regs, channel, false);
  29. rmt_ll_enable_rx_end_interrupt(hal->regs, channel, false);
  30. rmt_ll_clear_rx_err_interrupt(hal->regs, channel);
  31. rmt_ll_clear_rx_end_interrupt(hal->regs, channel);
  32. }
  33. void rmt_hal_tx_set_channel_clock(rmt_hal_context_t *hal, uint32_t channel, uint32_t base_clk_hz, uint32_t counter_clk_hz)
  34. {
  35. rmt_ll_tx_reset_channel_clock_div(hal->regs, channel);
  36. uint32_t counter_div = (base_clk_hz + counter_clk_hz / 2) / counter_clk_hz;
  37. rmt_ll_tx_set_channel_clock_div(hal->regs, channel, counter_div);
  38. }
  39. void rmt_hal_set_carrier_clock(rmt_hal_context_t *hal, uint32_t channel, uint32_t base_clk_hz, uint32_t carrier_clk_hz, float carrier_clk_duty)
  40. {
  41. uint32_t carrier_div = (base_clk_hz + carrier_clk_hz / 2) / carrier_clk_hz;
  42. uint32_t div_high = (uint32_t)(carrier_div * carrier_clk_duty);
  43. uint32_t div_low = carrier_div - div_high;
  44. rmt_ll_tx_set_carrier_high_low_ticks(hal->regs, channel, div_high, div_low);
  45. }
  46. void rmt_hal_set_rx_filter_thres(rmt_hal_context_t *hal, uint32_t channel, uint32_t base_clk_hz, uint32_t thres_us)
  47. {
  48. uint32_t thres = (uint32_t)(base_clk_hz / 1e6 * thres_us);
  49. rmt_ll_rx_set_filter_thres(hal->regs, channel, thres);
  50. }
  51. void rmt_hal_set_rx_idle_thres(rmt_hal_context_t *hal, uint32_t channel, uint32_t base_clk_hz, uint32_t thres_us)
  52. {
  53. uint32_t thres = (uint32_t)(base_clk_hz / 1e6 * thres_us);
  54. rmt_ll_rx_set_idle_thres(hal->regs, channel, thres);
  55. }