mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
134 lines
4.4 KiB
C
134 lines
4.4 KiB
C
/*
|
|
* SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "driver/i2s_types.h"
|
|
#include "hal/i2s_types.h"
|
|
|
|
#include "esp_types.h"
|
|
#include "esp_err.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/**
|
|
* @brief LP_I2S max timeout value
|
|
*/
|
|
#define LP_I2S_MAX_DELAY UINT32_MAX
|
|
|
|
/**
|
|
* @brief LP I2S controller channel configuration
|
|
*/
|
|
typedef struct {
|
|
int id; /*!< LP I2S port id */
|
|
i2s_role_t role; /*!< LP I2S role, only I2S_ROLE_SLAVE supported */
|
|
size_t threshold; /*!< When LP I2S received bytes are bigger than this value, the `on_thresh_met` callback will be triggered. Must be in multiple of 4 */
|
|
} lp_i2s_chan_config_t;
|
|
|
|
/**
|
|
* @brief LP I2S event callbacks
|
|
*/
|
|
typedef struct {
|
|
lp_i2s_callback_t on_thresh_met; ///< Triggered when the received bytes are bigger than `lp_i2s_chan_config_t:threshold`
|
|
lp_i2s_callback_t on_request_new_trans; ///< Triggered when a new transaction buffer is needed, when this callback is registered, you don't need to use `lp_i2s_channel_read` to get data, you can get data via this callback asynchronously
|
|
} lp_i2s_evt_cbs_t;
|
|
|
|
/**
|
|
* @brief Allocate new LP I2S channel(s)
|
|
*
|
|
* @param[in] chan_cfg LP I2S controller channel configurations
|
|
* @param[out] ret_tx_handle LP I2S channel handler used for managing the sending channel(optional), this one is not supported and is kept here for future-proof.
|
|
* @param[out] ret_rx_handle LP I2S channel handler used for managing the receiving channel(optional)
|
|
* @return
|
|
* - ESP_OK Allocate new channel(s) success
|
|
* - ESP_ERR_NOT_SUPPORTED The communication mode is not supported on the current chip
|
|
* - ESP_ERR_INVALID_ARG NULL pointer or illegal parameter in lp_i2s_chan_config_t
|
|
* - ESP_ERR_NOT_FOUND No available LP I2S channel found
|
|
*/
|
|
esp_err_t lp_i2s_new_channel(const lp_i2s_chan_config_t *chan_cfg, lp_i2s_chan_handle_t *ret_tx_handle, lp_i2s_chan_handle_t *ret_rx_handle);
|
|
|
|
/**
|
|
* @brief Register LP I2S event callbacks
|
|
*
|
|
* @param[in] handle LP I2S channel handle
|
|
* @param[in] cbs Callbacks
|
|
* @param[in] user_data User data
|
|
*
|
|
* @return
|
|
* - ESP_OK: On success
|
|
* - ESP_ERR_INVALID_ARG: Invalid argument
|
|
* - ESP_ERR_INVALID_STATE: Invalid state
|
|
*/
|
|
esp_err_t lp_i2s_register_event_callbacks(lp_i2s_chan_handle_t handle, const lp_i2s_evt_cbs_t *cbs, void *user_data);
|
|
|
|
/**
|
|
* @brief Enable LP I2S driver
|
|
*
|
|
* @param[in] handle LP I2S channel handle
|
|
*
|
|
* @return
|
|
* - ESP_OK: On success
|
|
* - ESP_ERR_INVALID_ARG: Invalid argument
|
|
* - ESP_ERR_INVALID_STATE: Invalid state
|
|
*/
|
|
esp_err_t lp_i2s_channel_enable(lp_i2s_chan_handle_t chan);
|
|
|
|
/**
|
|
* @brief Read LP I2S received data
|
|
*
|
|
* @param[in] handle LP I2S channel handle
|
|
* @param[in] trans LP I2S transaction
|
|
* @param[in] timeout_ms Timeout in ms, set to `LP_I2S_MAX_DELAY` to wait until read is done
|
|
*
|
|
* @return
|
|
* - ESP_OK: On success
|
|
* - ESP_ERR_INVALID_ARG: Invalid argument
|
|
* - ESP_ERR_INVALID_STATE: Invalid state, e.g. `on_request_new_trans` callback is registered
|
|
*/
|
|
esp_err_t lp_i2s_channel_read(lp_i2s_chan_handle_t chan, lp_i2s_trans_t *trans, uint32_t timeout_ms);
|
|
|
|
/**
|
|
* @brief Read LP I2S received data until certain bytes
|
|
*
|
|
* @param[in] handle LP I2S channel handle
|
|
* @param[in] trans LP I2S transaction
|
|
*
|
|
* @return
|
|
* - ESP_OK: On success
|
|
* - ESP_ERR_INVALID_ARG: Invalid argument
|
|
* - ESP_ERR_INVALID_STATE: Invalid state, e.g. `on_request_new_trans` callback is registered
|
|
*/
|
|
esp_err_t lp_i2s_channel_read_until_bytes(lp_i2s_chan_handle_t chan, lp_i2s_trans_t *trans);
|
|
|
|
/**
|
|
* @brief Disable LP I2S driver
|
|
*
|
|
* @param[in] handle LP I2S channel handle
|
|
*
|
|
* @return
|
|
* - ESP_OK: On success
|
|
* - ESP_ERR_INVALID_ARG: Invalid argument
|
|
* - ESP_ERR_INVALID_STATE: Invalid state
|
|
*/
|
|
esp_err_t lp_i2s_channel_disable(lp_i2s_chan_handle_t chan);
|
|
|
|
/**
|
|
* @brief Delete the LP I2S channel
|
|
*
|
|
* @param[in] handle LP I2S channel handler
|
|
*
|
|
* @return
|
|
* - ESP_OK Delete successfully
|
|
* - ESP_ERR_INVALID_ARG NULL pointer
|
|
*/
|
|
esp_err_t lp_i2s_del_channel(lp_i2s_chan_handle_t handle);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|