rmt_hal.c 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. // Copyright 2019 Espressif Systems (Shanghai) PTE LTD
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. #include "hal/rmt_hal.h"
  15. #include "hal/rmt_ll.h"
  16. void rmt_hal_init(rmt_hal_context_t *hal)
  17. {
  18. hal->regs = &RMT;
  19. hal->mem = &RMTMEM;
  20. }
  21. void rmt_hal_tx_channel_reset(rmt_hal_context_t *hal, uint32_t channel)
  22. {
  23. rmt_ll_tx_reset_pointer(hal->regs, channel);
  24. rmt_ll_enable_tx_err_interrupt(hal->regs, channel, false);
  25. rmt_ll_enable_tx_end_interrupt(hal->regs, channel, false);
  26. rmt_ll_enable_tx_thres_interrupt(hal->regs, channel, false);
  27. rmt_ll_clear_tx_err_interrupt(hal->regs, channel);
  28. rmt_ll_clear_tx_end_interrupt(hal->regs, channel);
  29. rmt_ll_clear_tx_thres_interrupt(hal->regs, channel);
  30. }
  31. void rmt_hal_rx_channel_reset(rmt_hal_context_t *hal, uint32_t channel)
  32. {
  33. rmt_ll_rx_reset_pointer(hal->regs, channel);
  34. rmt_ll_enable_rx_err_interrupt(hal->regs, channel, false);
  35. rmt_ll_enable_rx_end_interrupt(hal->regs, channel, false);
  36. rmt_ll_clear_rx_err_interrupt(hal->regs, channel);
  37. rmt_ll_clear_rx_end_interrupt(hal->regs, channel);
  38. }
  39. void rmt_hal_tx_set_counter_clock(rmt_hal_context_t *hal, uint32_t channel, uint32_t base_clk_hz, uint32_t counter_clk_hz)
  40. {
  41. rmt_ll_tx_reset_counter_clock_div(hal->regs, channel);
  42. uint32_t counter_div = (base_clk_hz + counter_clk_hz / 2) / counter_clk_hz;
  43. rmt_ll_tx_set_counter_clock_div(hal->regs, channel, counter_div);
  44. }
  45. 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)
  46. {
  47. uint32_t carrier_div = (base_clk_hz + carrier_clk_hz / 2) / carrier_clk_hz;
  48. uint32_t div_high = (uint32_t)(carrier_div * carrier_clk_duty);
  49. uint32_t div_low = carrier_div - div_high;
  50. rmt_ll_tx_set_carrier_high_low_ticks(hal->regs, channel, div_high, div_low);
  51. }
  52. void rmt_hal_set_rx_filter_thres(rmt_hal_context_t *hal, uint32_t channel, uint32_t base_clk_hz, uint32_t thres_us)
  53. {
  54. uint32_t thres = (uint32_t)(base_clk_hz / 1e6 * thres_us);
  55. rmt_ll_rx_set_filter_thres(hal->regs, channel, thres);
  56. }
  57. void rmt_hal_set_rx_idle_thres(rmt_hal_context_t *hal, uint32_t channel, uint32_t base_clk_hz, uint32_t thres_us)
  58. {
  59. uint32_t thres = (uint32_t)(base_clk_hz / 1e6 * thres_us);
  60. rmt_ll_rx_set_idle_thres(hal->regs, channel, thres);
  61. }
  62. uint32_t rmt_hal_receive(rmt_hal_context_t *hal, uint32_t channel, rmt_item32_t *buf)
  63. {
  64. uint32_t len = 0;
  65. rmt_ll_rx_set_mem_owner(hal->regs, channel, RMT_MEM_OWNER_SW);
  66. for (len = 0; len < SOC_RMT_CHANNEL_MEM_WORDS; len++) {
  67. buf[len].val = hal->mem->chan[channel].data32[len].val;
  68. if (!(buf[len].val & 0x7FFF)) {
  69. break;
  70. } else if (!(buf[len].val & 0x7FFF0000)) {
  71. len++;
  72. break;
  73. }
  74. }
  75. rmt_ll_rx_set_mem_owner(hal->regs, channel, RMT_MEM_OWNER_HW);
  76. rmt_ll_rx_reset_pointer(hal->regs, channel);
  77. return len;
  78. }