mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
127 lines
4.5 KiB
C
127 lines
4.5 KiB
C
|
// Copyright 2020 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 <stddef.h>
|
||
|
#include "esp_err.h"
|
||
|
|
||
|
/**
|
||
|
* @brief Handle of CP_DMA driver
|
||
|
*
|
||
|
*/
|
||
|
typedef struct cp_dma_driver_context_s *cp_dma_driver_t;
|
||
|
|
||
|
/**
|
||
|
* @brief CP_DMA event ID
|
||
|
*
|
||
|
*/
|
||
|
typedef enum {
|
||
|
CP_DMA_EVENT_M2M_DONE, /*!< One or more memory copy transactions are done */
|
||
|
} cp_dma_event_id_t;
|
||
|
|
||
|
/**
|
||
|
* @brief Type defined for CP_DMA event object (including event ID, event data)
|
||
|
*
|
||
|
*/
|
||
|
typedef struct {
|
||
|
cp_dma_event_id_t id; /*!< Event ID */
|
||
|
void *data; /*!< Event data */
|
||
|
} cp_dma_event_t;
|
||
|
|
||
|
/**
|
||
|
* @brief Type defined for cp_dma ISR callback function
|
||
|
*
|
||
|
* @param drv_hdl Handle of CP_DMA driver
|
||
|
* @param event Event object, which contains the event ID, event data, and so on
|
||
|
* @param cb_args User defined arguments for the callback function. It's passed in cp_dma_memcpy function
|
||
|
* @return Whether a high priority task is woken up by the callback function
|
||
|
*
|
||
|
*/
|
||
|
typedef bool (*cp_dma_isr_cb_t)(cp_dma_driver_t drv_hdl, cp_dma_event_t *event, void *cb_args);
|
||
|
|
||
|
/**
|
||
|
* @brief Type defined for configuration of CP_DMA driver
|
||
|
*
|
||
|
*/
|
||
|
typedef struct {
|
||
|
uint32_t max_out_stream; /*!< maximum number of out link streams that can work simultaneously */
|
||
|
uint32_t max_in_stream; /*!< maximum number of in link streams that can work simultaneously */
|
||
|
uint32_t flags; /*!< Extra flags to control some special behaviour of CP_DMA, OR'ed of CP_DMA_FLAGS_xxx macros */
|
||
|
} cp_dma_config_t;
|
||
|
|
||
|
#define CP_DMA_FLAGS_WORK_WITH_CACHE_DISABLED (1 << 0) /*!< CP_DMA can work even when cache is diabled */
|
||
|
|
||
|
/**
|
||
|
* @brief Default configuration for CP_DMA driver
|
||
|
*
|
||
|
*/
|
||
|
#define CP_DMA_DEFAULT_CONFIG() \
|
||
|
{ \
|
||
|
.max_out_stream = 8, \
|
||
|
.max_in_stream = 8, \
|
||
|
.flags = 0, \
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief Install CP_DMA driver
|
||
|
*
|
||
|
* @param[in] config Configuration of CP_DMA driver
|
||
|
* @param[out] drv_hdl Returned handle of CP_DMA driver or NULL if driver installation failed
|
||
|
* @return
|
||
|
* - ESP_OK: Install CP_DMA driver successfully
|
||
|
* - ESP_ERR_INVALID_ARG: Install CP_DMA driver failed because of some invalid argument
|
||
|
* - ESP_ERR_NO_MEM: Install CP_DMA driver failed because there's no enough capable memory
|
||
|
* - ESP_FAIL: Install CP_DMA driver failed because of other error
|
||
|
*/
|
||
|
esp_err_t cp_dma_driver_install(const cp_dma_config_t *config, cp_dma_driver_t *drv_hdl);
|
||
|
|
||
|
/**
|
||
|
* @brief Uninstall CP_DMA driver
|
||
|
*
|
||
|
* @param[in] drv_hdl Handle of CP_DMA driver that returned from cp_dma_driver_install
|
||
|
* @return
|
||
|
* - ESP_OK: Uninstall CP_DMA driver successfully
|
||
|
* - ESP_ERR_INVALID_ARG: Uninstall CP_DMA driver failed because of some invalid argument
|
||
|
* - ESP_FAIL: Uninstall CP_DMA driver failed because of other error
|
||
|
*/
|
||
|
esp_err_t cp_dma_driver_uninstall(cp_dma_driver_t drv_hdl);
|
||
|
|
||
|
/**
|
||
|
* @brief Send an asynchronous memory copy request
|
||
|
*
|
||
|
* @param[in] drv_hdl Handle of CP_DMA driver that returned from cp_dma_driver_install
|
||
|
* @param[in] dst Destination address (copy to)
|
||
|
* @param[in] src Source address (copy from)
|
||
|
* @param[in] n Number of bytes to copy
|
||
|
* @param[in] cb_isr Callback function, which got invoked in ISR context. A NULL pointer here can bypass the callback.
|
||
|
* @param[in] cb_args User defined argument to be passed to the callback function
|
||
|
* @return
|
||
|
* - ESP_OK: Send memcopy request successfully
|
||
|
* - ESP_ERR_INVALID_ARG: Send memcopy request failed because of some invalid argument
|
||
|
* - ESP_FAIL: Send memcopy request failed because of other error
|
||
|
*
|
||
|
* @note The callback function is invoked in ISR context, please never handle heavy load in the callback.
|
||
|
* The default ISR handler is placed in IRAM, please place callback function in IRAM as well by applying IRAM_ATTR to it.
|
||
|
*/
|
||
|
esp_err_t cp_dma_memcpy(cp_dma_driver_t drv_hdl, void *dst, void *src, size_t n, cp_dma_isr_cb_t cb_isr, void *cb_args);
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|