mcu_hi3321_watch/include/driver/dma.h
2025-05-26 20:15:20 +08:00

430 lines
16 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* Copyright (c) @CompanyNameMagicTag 2022-2022. All rights reserved. \n
*
* Description: Provides DMA driver api \n
* Author: @CompanyNameTag \n
* History: \n
* 2022-10-16 Create file. \n
*/
#ifndef DMA_H
#define DMA_H
#include <stdint.h>
#include "errcode.h"
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif /* __cplusplus */
#endif /* __cplusplus */
/**
* @defgroup drivers_driver_dma DMA
* @ingroup drivers_driver
* @{
*/
/**
* @if Eng
* @brief Memory-to-memory type of DMA channel user configuration.
* @else
* @brief 内存到内存类型的DMA通道用户配置。
* @endif
*/
typedef struct dma_ch_user_memory_config {
/** @if Eng The source address of this transfer.
* @else 传输源地址。
* @endif */
uint32_t src;
/** @if Eng The destination address of this transfer.
* @else 传输目的地址。
* @endif */
uint32_t dest;
/** @if Eng Transfer number.
* @else 传输数据量。
* @endif */
uint16_t transfer_num;
/** @if Eng Transfer priority of channel(Lowest: 0 and Highest: 3).
* @else 传输通道优先级(最低为0以及最高为3)。
* @endif */
uint8_t priority;
/** @if Eng Transfer data width:
* - 0: 1byte
* - 1: 2byte
* - 2: 4byte
* @else 传输数据宽度:
* - 0: 1字节
* - 1: 2字节
* - 2: 4字节
* @endif */
uint8_t width;
} dma_ch_user_memory_config_t;
/**
* @if Eng
* @brief Memory-to-periph or periph-to-memory type of DMA channel user configuration.
* @else
* @brief 内存到外设或外设到内存类型的DMA通道用户配置。
* @endif
*/
typedef struct dma_ch_user_peripheral_config {
/** @if Eng The source address of this transfer.
* @else 传输源地址。
* @endif */
uint32_t src;
/** @if Eng The destination address of this transfer.
* @else 传输目的地址。
* @endif */
uint32_t dest;
/** @if Eng Transfer number.
* @else 传输数据量。
* @endif */
uint16_t transfer_num;
/** @if Eng Hardware handshaking ID of the source. see @ref hal_dma_handshaking_source_t.
* @else 源端硬件握手号。 参考 @ref hal_dma_handshaking_source_t 。
* @endif */
uint16_t src_handshaking;
/** @if Eng Hardware handshaking ID of the destination. see @ref hal_dma_handshaking_source_t.
* @else 目的端硬件握手号。 参考 @ref hal_dma_handshaking_source_t 。
* @endif */
uint16_t dest_handshaking;
/** @if Eng Transfer type:
* - 0: memory to memory and DMA is flow controller
* - 1: memory to periph and DMA is flow controller
* - 2: periph to memory and DMA is flow controller
* - 3: periph to periph and DMA is flow controller
* - 4: periph to memory and periph is flow controller
* - 5: periph to periph and source periph is flow controller
* - 6: memory to periph and periph is flow controller
* - 7: periph to periph and destination periph is flow controller
* @else 传输类型:
* - 0: 内存到内存并且由DMA流控
* - 1: 内存到外设并且由DMA流控
* - 2: 外设到内存并且由DMA流控
* - 3: 外设到外设并且由DMA流控
* - 4: 外设到内存并且由外设流控
* - 5: 外设到外设并且由源端外设流控
* - 6: 内存到外设并且由外设流控
* - 7: 外设到外设并且由目的端外设流控
* @endif */
uint8_t trans_type;
/** @if Eng Transfer direction:
* - 0: memory to periph
* - 1: periph to memory
* - 2: periph to periph
* @else 传输方向:
* - 0: 内存到外设
* - 1: 外设到内存
* - 2: 外设到外设
* @endif */
uint8_t trans_dir;
/** @if Eng Transfer priority of channel(Lowest: 0 and Highest: 3).
* @else 传输通道优先级(最低为0以及最高为3)。
* @endif */
uint8_t priority;
/** @if Eng Transfer data width of the source:
* - 0: 1byte
* - 1: 2byte
* - 2: 4byte
* @else 源端传输数据宽度:
* - 0: 1字节
* - 1: 2字节
* - 2: 4字节
* @endif */
uint8_t src_width;
/** @if Eng Transfer data width of the destination:
* - 0: 1byte
* - 1: 2byte
* - 2: 4byte
* @else 目的端传输数据宽度:
* - 0: 1字节
* - 1: 2字节
* - 2: 4字节
* @endif */
uint8_t dest_width;
/** @if Eng Transfer burst length:
* - 0: burst length is 1
* - 1: burst length is 4
* - 2: burst length is 8
* - 3: burst length is 16
* @else 传输burst长度
* - 0: burst长度是1
* - 1: burst长度是4
* - 2: burst长度是8
* - 3: burst长度是16
* @endif */
uint8_t burst_length;
/** @if Eng Source address incremental mode
* - 0: increment
* - 1: decrement
* - 2: no change
* @else 源端地址增量模式:
* - 0: 递增
* - 1: 递减
* - 2: 不变
* @endif */
uint8_t src_increment;
/** @if Eng Destination address incremental mode:
* - 0: increment
* - 1: decrement
* - 2: no change
* @else 目的端地址增量模式:
* - 0: 递增
* - 1: 递减
* - 2: 不变
* @endif */
uint8_t dest_increment;
/** @if Eng DMA protection control bits used to drive the AHB HPROT[3:1] bus:
* - 0: HPROT[1]
* - 1: HPROT[2]
* - 2: HPROT[3]
* @else 保护控制位用于驱动AHB HPRO[3:1]总线:
* - 0: HPROT[1]
* - 1: HPROT[2]
* - 2: HPROT[3]
* @endif */
uint8_t protection;
} dma_ch_user_peripheral_config_t;
/**
* @if Eng
* @brief Pointer to the DMA channel transfer done/error callback function.
* @param [in] intr DMA interrupt type.
* @param [in] channel DMA channel.
* @param [in] arg DMA private param pointer passed by DMA caller.
* @else
* @brief DMA通道传输完成/错误所触发的回调函数指针。
* @param [in] intr DMA中断类型。
* @param [in] channel DMA通道。
* @param [in] arg 调用DMA传输时传递的私有参数指针。
* @endif
*/
typedef void (*dma_transfer_cb_t)(uint8_t intr, uint8_t channel, uintptr_t arg);
/**
* @if Eng
* @brief Initialize the DMA module.
* @retval ERRCODE_SUCC Success.
* @retval Other Failure. For details, see @ref errcode_t.
* @else
* @brief 初始化DMA模块。
* @retval ERRCODE_SUCC 成功。
* @retval Other 失败 参考 @ref errcode_t 。
* @endif
*/
errcode_t uapi_dma_init(void);
/**
* @if Eng
* @brief Deinitialize the DMA module.
* @retval ERRCODE_SUCC Success.
* @retval Other Failure. For details, see @ref errcode_t.
* @else
* @brief 去初始化DMA模块。
* @retval ERRCODE_SUCC 成功。
* @retval Other 失败 参考 @ref errcode_t 。
* @endif
*/
void uapi_dma_deinit(void);
/**
* @if Eng
* @brief Open the DMA module.
* @retval ERRCODE_SUCC Success.
* @retval Other Failure. For details, see @ref errcode_t.
* @else
* @brief 开启DMA模块。
* @retval ERRCODE_SUCC 成功。
* @retval Other 失败 参考 @ref errcode_t 。
* @endif
*/
errcode_t uapi_dma_open(void);
/**
* @if Eng
* @brief Close the DMA module.
* @else
* @brief 关闭DMA模块。
* @endif
*/
void uapi_dma_close(void);
/**
* @if Eng
* @brief Start DMA transfer of specific Channel.
* @param [in] channel DMA channel.
* @retval ERRCODE_SUCC Success.
* @retval Other Failure. For details, see @ref errcode_t.
* @else
* @brief 启动指定通道的DMA传输。
* @param [in] channel DMA通道。
* @retval ERRCODE_SUCC 成功。
* @retval Other 失败 参考 @ref errcode_t 。
* @endif
*/
errcode_t uapi_dma_start_transfer(uint8_t channel);
/**
* @if Eng
* @brief Stop DMA transfer of specific Channel.
* @param [in] channel DMA channel.
* @retval ERRCODE_SUCC Success.
* @retval Other Failure. For details, see @ref errcode_t.
* @else
* @brief 停止指定通道的DMA传输。
* @param [in] channel DMA通道。
* @retval ERRCODE_SUCC 成功。
* @retval Other 失败 参考 @ref errcode_t 。
* @endif
*/
errcode_t uapi_dma_end_transfer(uint8_t channel);
/**
* @if Eng
* @brief Get the number of data transferred by the DMA.
* @param [in] channel DMA channel.
* @retval The number of data transferred by the DMA.
* @else
* @brief 获取DMA传输的数据量。
* @param [in] channel DMA通道。
* @retval 获取DMA传输的数据量。
* @endif
*/
uint32_t uapi_dma_get_block_ts(uint8_t channel);
/**
* @if Eng
* @brief Transfer type memory-to-memory through DMA channel.
* @param [in] user_cfg DMA channel transfer configuration of user. For details, see @ref dma_ch_user_memory_config_t.
* @param [in] callback Channel transfer done/error callback function. For details, see @ref dma_transfer_cb_t.
* @param [in] arg Private param pointer for storing self information, which can be passed to DMA callback
* @ref dma_transfer_cb_t when transfer completed.
* @retval ERRCODE_SUCC Success.
* @retval Other Failure. For details, see @ref errcode_t.
* @else
* @brief 通过DMA通道传输类型为内存到内存的数据。
* @param [in] user_cfg 用户的DMA通道传输配置 For details, see @ref dma_ch_user_memory_config_t 。
* @param [in] callback 通道传输完成/错误回调函数 For details, see @ref dma_transfer_cb_t 。
* @param [in] arg 用于存储自定义信息的私有参数指针传输完成时回传给dma回调函数 @ref dma_transfer_cb_t 。
* @retval ERRCODE_SUCC 成功。
* @retval Other 失败 参考 @ref errcode_t 。
* @endif
*/
errcode_t uapi_dma_transfer_memory_single(const dma_ch_user_memory_config_t *user_cfg,
dma_transfer_cb_t callback, uintptr_t arg);
/**
* @if Eng
* @brief Transfer type memory-periph or periph-memory through DMA channel.
* @param [in] user_cfg DMA channel transfer configuration of user.
* For details, see @ref dma_ch_user_peripheral_config_t.
* @param [out] channel DMA channel selected.
* @param [in] callback Channel transfer done/error callback function. For details, see @ref dma_transfer_cb_t.
* @param [in] arg Private param pointer for storing self information, which can be passed to DMA callback
* @ref dma_transfer_cb_t when transfer completed.
* @retval ERRCODE_SUCC Success.
* @retval Other Failure. For details, see @ref errcode_t.
* @else
* @brief 通过DMA通道传输类型为内存到外设或外设到内存的数据。
* @param [in] user_cfg 用户的DMA通道传输配置 For details, see @ref dma_ch_user_peripheral_config_t 。
* @param [out] channel 获取被选择的通道。
* @param [in] callback 通道传输完成/错误回调函数 For details, see @ref dma_transfer_cb_t 。
* @param [in] arg 用于存储自定义信息的私有参数指针传输完成时回传给DMA回调函数 @ref dma_transfer_cb_t 。
* @retval ERRCODE_SUCC 成功。
* @retval Other 失败 参考 @ref errcode_t 。
* @endif
*/
errcode_t uapi_dma_configure_peripheral_transfer_single(const dma_ch_user_peripheral_config_t *user_cfg,
uint8_t *channel, dma_transfer_cb_t callback, uintptr_t arg);
#if defined(CONFIG_DMA_SUPPORT_LLI)
/**
* @if Eng
* @brief Get DMA linked list channel.
* @param [in] burst_length Dma burst transfer length.
* @param [in] handshaking Dma Transfer periph.
* @retval ERRCODE_SUCC Success.
* @retval The DMA channel.
* @else
* @brief 获取DMA链表传输通道。
* @param [in] burst_length DMA的burst传输长度。
* @param [in] handshaking DMA传输外设种类。
* @retval DMA通道
* @endif
*/
uint8_t uapi_dma_get_lli_channel(uint8_t burst_length, uint8_t handshaking);
/**
* @if Eng
* @brief Transfer type memory-to-memory in linked list mode through DMA channel.
* @param [in] channel DMA channel.
* @param [in] user_cfg DMA channel transfer configuration of user. For details, see @ref dma_ch_user_memory_config_t.
* @param [in] callback Channel transfer done/error callback function. For details, see @ref dma_transfer_cb_t.
* @retval ERRCODE_SUCC Success.
* @retval Other Failure. For details, see @ref errcode_t.
* @else
* @brief 通过DMA通道以链表模式传输类型为内存到内存的数据。
* @param [in] channel DMA通道。
* @param [in] user_cfg 用户的DMA通道传输配置 For details, see @ref dma_ch_user_memory_config_t 。
* @param [in] callback 通道传输完成/错误回调函数 For details, see @ref dma_transfer_cb_t 。
* @retval ERRCODE_SUCC 成功。
* @retval Other 失败 参考 @ref errcode_t 。
* @endif
*/
errcode_t uapi_dma_transfer_memory_lli(uint8_t channel, const dma_ch_user_memory_config_t *user_cfg,
dma_transfer_cb_t callback);
/**
* @if Eng
* @brief Transfer type memory-periph or periph-memory in linked list mode through DMA channel.
* @param [in] channel DMA channel.
* @param [in] user_cfg DMA channel transfer configuration of user.
* For details, see @ref dma_ch_user_peripheral_config_t.
* @param [in] callback Channel transfer done/error callback function. For details, see @ref dma_transfer_cb_t.
* @retval ERRCODE_SUCC Success.
* @retval Other Failure. For details, see @ref errcode_t.
* @else
* @brief 通过DMA通道以链表模式传输类型为内存到外设或外设到内存的数据。
* @param [in] channel DMA通道。
* @param [in] user_cfg 用户的DMA通道传输配置 For details, see @ref dma_ch_user_peripheral_config_t 。
* @param [in] callback 通道传输完成/错误回调函数 For details, see @ref dma_transfer_cb_t 。
* @retval ERRCODE_SUCC 成功。
* @retval Other 失败 参考 @ref errcode_t 。
* @endif
*/
errcode_t uapi_dma_configure_peripheral_transfer_lli(uint8_t channel, const dma_ch_user_peripheral_config_t *user_cfg,
dma_transfer_cb_t callback);
/**
* @if Eng
* @brief Enable DMA linked list transfer.
* @param [in] channel DMA channel.
* @param [in] callback Channel transfer done/error callback function. For details, see @ref dma_transfer_cb_t.
* @param [in] arg Private param pointer for storing self information, which can be passed to DMA callback
* @ref dma_transfer_cb_t when transfer completed.
* @retval ERRCODE_SUCC Success.
* @retval Other Failure. For details, see @ref errcode_t.
* @else
* @brief 启用DMA链表传输。
* @param [in] channel DMA通道。
* @param [in] callback 通道传输完成/错误回调函数 For details, see @ref dma_transfer_cb_t 。
* @param [in] arg 用于存储自定义信息的私有参数指针传输完成时回传给dma回调函数 @ref dma_transfer_cb_t 。
* @retval ERRCODE_SUCC 成功。
* @retval Other 失败 参考 @ref errcode_t 。
* @endif
*/
errcode_t uapi_dma_enable_lli(uint8_t channel, dma_transfer_cb_t callback, uintptr_t arg);
#endif /* CONFIG_DMA_SUPPORT_LLI */
/**
* @}
*/
#ifdef __cplusplus
#if __cplusplus
}
#endif /* __cplusplus */
#endif /* __cplusplus */
#endif