After RMT driver refactor, two breaking change are introduced: 1. Users needs to call `rmt_driver_install` before `rmt_config`. 2. Do not support memory block count > 1, fix this two issues closes https://github.com/espressif/esp-idf/issues/4664 closes https://github.com/espressif/esp-idf/issues/4959
136 lines
4.5 KiB
C
136 lines
4.5 KiB
C
// Copyright 2019 Espressif Systems (Shanghai) PTE LTD
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
#pragma once
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include "soc/rmt_struct.h"
|
|
#include "soc/rmt_caps.h"
|
|
|
|
/**
|
|
* @brief HAL context type of RMT driver
|
|
*
|
|
*/
|
|
typedef struct {
|
|
rmt_dev_t *regs; /*!< RMT Register base address */
|
|
rmt_mem_t *mem; /*!< RMT Memory base address */
|
|
} rmt_hal_context_t;
|
|
|
|
#define RMT_MEM_OWNER_SW (0) /*!< RMT Memory ownership belongs to software side */
|
|
#define RMT_MEM_OWNER_HW (1) /*!< RMT Memory ownership belongs to hardware side */
|
|
|
|
/**
|
|
* @brief Initialize the RMT HAL driver
|
|
*
|
|
* @param hal: RMT HAL context
|
|
*/
|
|
void rmt_hal_init(rmt_hal_context_t *hal);
|
|
|
|
/**
|
|
* @brief Reset RMT Channel specific HAL driver
|
|
*
|
|
* @param hal: RMT HAL context
|
|
* @param channel: RMT channel number
|
|
*/
|
|
void rmt_hal_channel_reset(rmt_hal_context_t *hal, uint32_t channel);
|
|
|
|
/**
|
|
* @brief Set counter clock for RMT channel
|
|
*
|
|
* @param hal: RMT HAL context
|
|
* @param channel: RMT channel number
|
|
* @param base_clk_hz: base clock for RMT internal channel (counter clock will divide from it)
|
|
* @param counter_clk_hz: target counter clock
|
|
*/
|
|
void rmt_hal_set_counter_clock(rmt_hal_context_t *hal, uint32_t channel, uint32_t base_clk_hz, uint32_t counter_clk_hz);
|
|
|
|
/**
|
|
* @brief Get counter clock for RMT channel
|
|
*
|
|
* @param hal: RMT HAL context
|
|
* @param channel: RMT channel number
|
|
* @param base_clk_hz: base clock for RMT internal channel (counter clock will divide from it)
|
|
* @return counter clock in Hz
|
|
*/
|
|
uint32_t rmt_hal_get_counter_clock(rmt_hal_context_t *hal, uint32_t channel, uint32_t base_clk_hz);
|
|
|
|
/**
|
|
* @brief Set carrier clock for RMT channel
|
|
*
|
|
* @param hal: RMT HAL context
|
|
* @param channel: RMT channel number
|
|
* @param base_clk_hz: base clock for RMT carrier generation (carrier clock will divide from it)
|
|
* @param carrier_clk_hz: target carrier clock
|
|
* @param carrier_clk_duty: duty ratio of carrier clock
|
|
*/
|
|
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);
|
|
|
|
/**
|
|
* @brief Get carrier clock for RMT channel
|
|
*
|
|
* @param hal: RMT HAL context
|
|
* @param channel: RMT channel number
|
|
* @param base_clk_hz: base clock for RMT carrier generation
|
|
* @param carrier_clk_hz: target carrier clock
|
|
* @param carrier_clk_duty: duty ratio of carrier clock
|
|
*/
|
|
void rmt_hal_get_carrier_clock(rmt_hal_context_t *hal, uint32_t channel, uint32_t base_clk_hz, uint32_t *carrier_clk_hz, float *carrier_clk_duty);
|
|
|
|
/**
|
|
* @brief Set filter threshold for RMT Receive channel
|
|
*
|
|
* @param hal: RMT HAL context
|
|
* @param channel: RMT channel number
|
|
* @param base_clk_hz: base clock for RMT receive filter
|
|
* @param thres_us: threshold of RMT receive filter, in us
|
|
*/
|
|
void rmt_hal_set_rx_filter_thres(rmt_hal_context_t *hal, uint32_t channel, uint32_t base_clk_hz, uint32_t thres_us);
|
|
|
|
/**
|
|
* @brief Set idle threshold for RMT Receive channel
|
|
*
|
|
* @param hal: RMT HAL context
|
|
* @param channel: RMT channel number
|
|
* @param base_clk_hz: base clock for RMT receive channel
|
|
* @param thres_us: IDLE threshold for RMT receive channel
|
|
*/
|
|
void rmt_hal_set_rx_idle_thres(rmt_hal_context_t *hal, uint32_t channel, uint32_t base_clk_hz, uint32_t thres_us);
|
|
|
|
/**
|
|
* @brief Receive a frame from RMT channel
|
|
*
|
|
* @param hal: RMT HAL context
|
|
* @param channel: RMT channel number
|
|
* @param buf: buffer to store received RMT frame
|
|
* @return number of items that get received
|
|
*/
|
|
uint32_t rmt_hal_receive(rmt_hal_context_t *hal, uint32_t channel, rmt_item32_t *buf);
|
|
|
|
/**
|
|
* @brief Transmit a from by RMT
|
|
*
|
|
* @param hal: RMT HAL context
|
|
* @param channel: RMT channel number
|
|
* @param src: RMT items to transmit
|
|
* @param length: length of RMT items to transmit
|
|
* @param offset: offset of RMT internal memory to store the items.
|
|
* Note: the caller should ensure that (length + offset) <= (memory block * SOC_RMT_CHANNEL_MEM_WORDS).
|
|
*/
|
|
void rmt_hal_transmit(rmt_hal_context_t *hal, uint32_t channel, const rmt_item32_t *src, uint32_t length, uint32_t offset);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|