This repository has been archived on 2023-07-17. You can view files and clone it, but cannot push or open issues or pull requests.
bl_mcu_sdk/drivers/lhal/include/bflb_dma.h
jzlv a77b0dc866 [update][lhal] update lhal
* update lhal api comments
* add cam driver
* add efuse driver
* add iso11898 driver
2022-12-21 20:20:40 +08:00

497 lines
15 KiB
C

#ifndef _BFLB_DMA_H
#define _BFLB_DMA_H
#include "bflb_core.h"
/** @addtogroup LHAL
* @{
*/
/** @addtogroup DMA
* @{
*/
/** @defgroup DMA_DIRECTION dma transfer direction definition
* @{
*/
#define DMA_MEMORY_TO_MEMORY 0
#define DMA_MEMORY_TO_PERIPH 1
#define DMA_PERIPH_TO_MEMORY 2
#define DMA_PERIPH_TO_PERIPH 3
/**
* @}
*/
/** @defgroup DMA_ADDR_INCREMENT dma source and destination address increment definition
* @{
*/
#define DMA_ADDR_INCREMENT_DISABLE 0
#define DMA_ADDR_INCREMENT_ENABLE 1
/**
* @}
*/
/** @defgroup DMA_DATA_WIDTH dma data width definition
* @{
*/
#define DMA_DATA_WIDTH_8BIT 0
#define DMA_DATA_WIDTH_16BIT 1
#define DMA_DATA_WIDTH_32BIT 2
/**
* @}
*/
/** @defgroup DMA_BURST_COUNT dma burst increment count definition
* @{
*/
#define DMA_BURST_INCR1 0
#define DMA_BURST_INCR4 1
#define DMA_BURST_INCR8 2
#define DMA_BURST_INCR16 3
/**
* @}
*/
#if defined(BL702) || defined(BL602) || defined(BL702L)
/** @defgroup DMA_PERIPHERAL_REGBASE dma peripheral data register address definition
* @{
*/
#define DMA_ADDR_UART0_TDR (0x4000A000 + 0x88)
#define DMA_ADDR_UART0_RDR (0x4000A000 + 0x8C)
#if !defined(BL702L)
#define DMA_ADDR_UART1_TDR (0x4000A100 + 0x88)
#define DMA_ADDR_UART1_RDR (0x4000A100 + 0x8C)
#endif
#define DMA_ADDR_I2C0_TDR (0x4000A300 + 0x88)
#define DMA_ADDR_I2C0_RDR (0x4000A300 + 0x8C)
#define DMA_ADDR_SPI0_TDR (0x4000A200 + 0x88)
#define DMA_ADDR_SPI0_RDR (0x4000A200 + 0x8C)
#if !defined(BL702L)
#define DMA_ADDR_I2S_TDR (0x4000AA00 + 0x88)
#define DMA_ADDR_I2S_RDR (0x4000AA00 + 0x8C)
#endif
#define DMA_ADDR_ADC_RDR (0x40002000 + 0x04)
#if !defined(BL702L)
#define DMA_ADDR_DAC_TDR (0x40002000 + 0x48)
#endif
#if defined(BL702L)
#define DMA_ADDR_IR_TDR (0x4000A600 + 0x88)
#endif
/**
* @}
*/
/** @defgroup DMA_PERIPHERAL_REQUEST dma peripheral request definition
* @{
*/
#define DMA_REQUEST_NONE 0x00000000
#define DMA_REQUEST_UART0_RX 0x00000000
#define DMA_REQUEST_UART0_TX 0x00000001
#if !defined(BL702L)
#define DMA_REQUEST_UART1_RX 0x00000002
#define DMA_REQUEST_UART1_TX 0x00000003
#endif
#define DMA_REQUEST_I2C0_RX 0x00000006
#define DMA_REQUEST_I2C0_TX 0x00000007
#if defined(BL702L)
#define DMA_REQUEST_IR_TX 0x00000008
#endif
#define DMA_REQUEST_SPI0_RX 0x0000000A
#define DMA_REQUEST_SPI0_TX 0x0000000B
#if !defined(BL702L)
#define DMA_REQUEST_I2S_RX 0x00000014
#define DMA_REQUEST_I2S_TX 0x00000015
#endif
#define DMA_REQUEST_ADC 0x00000016
#if !defined(BL702L)
#define DMA_REQUEST_DAC 0x00000017
#endif
/**
* @}
*/
#elif defined(BL616)
/** @defgroup DMA_PERIPHERAL_REGBASE dma peripheral data register address definition
* @{
*/
#define DMA_ADDR_UART0_TDR (0x2000A000 + 0x88)
#define DMA_ADDR_UART0_RDR (0x2000A000 + 0x8C)
#define DMA_ADDR_UART1_TDR (0x2000A100 + 0x88)
#define DMA_ADDR_UART1_RDR (0x2000A100 + 0x8C)
#define DMA_ADDR_I2C0_TDR (0x2000A300 + 0x88)
#define DMA_ADDR_I2C0_RDR (0x2000A300 + 0x8C)
#define DMA_ADDR_SPI0_TDR (0x2000A200 + 0x88)
#define DMA_ADDR_SPI0_RDR (0x2000A200 + 0x8C)
#define DMA_ADDR_I2S_TDR (0x2000AB00 + 0x88)
#define DMA_ADDR_I2S_RDR (0x2000AB00 + 0x8C)
#define DMA_ADDR_ADC_RDR (0x20002000 + 0x04)
#define DMA_ADDR_DAC_TDR (0x20002000 + 0x48)
#define DMA_ADDR_AUDAC_TDR (0x20055000 + 0x94)
#define DMA_ADDR_AUADC_RDR (0x2000A000 + 0xC88)
/**
* @}
*/
/** @defgroup DMA_PERIPHERAL_REQUEST dma peripheral request definition
* @{
*/
#define DMA_REQUEST_NONE 0x00000000
#define DMA_REQUEST_UART0_RX 0x00000000
#define DMA_REQUEST_UART0_TX 0x00000001
#define DMA_REQUEST_UART1_RX 0x00000002
#define DMA_REQUEST_UART1_TX 0x00000003
#define DMA_REQUEST_I2C0_RX 0x00000006
#define DMA_REQUEST_I2C0_TX 0x00000007
#define DMA_REQUEST_SPI0_RX 0x0000000A
#define DMA_REQUEST_SPI0_TX 0x0000000B
#define DMA_REQUEST_AUDIO_TX 0x0000000D
#define DMA_REQUEST_I2S_RX 0x00000010
#define DMA_REQUEST_I2S_TX 0x00000011
#define DMA_REQUEST_ADC 0x00000016
#define DMA_REQUEST_DAC 0x00000017
#define DMA_REQUEST_PEC0_SM0_RX 0x00000018
#define DMA_REQUEST_PEC0_SM1_RX 0x00000019
#define DMA_REQUEST_PEC0_SM2_RX 0x0000001A
#define DMA_REQUEST_PEC0_SM3_RX 0x0000001B
#define DMA_REQUEST_PEC0_SM0_TX 0x0000001C
#define DMA_REQUEST_PEC0_SM1_TX 0x0000001D
#define DMA_REQUEST_PEC0_SM2_TX 0x0000001E
#define DMA_REQUEST_PEC0_SM3_TX 0x0000001F
/**
* @}
*/
#elif defined(BL808) || defined(BL606P)
/** @defgroup DMA_PERIPHERAL_REGBASE dma peripheral data register address definition
* @{
*/
#define DMA_ADDR_UART0_TDR (0x2000A000 + 0x88)
#define DMA_ADDR_UART0_RDR (0x2000A000 + 0x8C)
#define DMA_ADDR_UART1_TDR (0x2000A100 + 0x88)
#define DMA_ADDR_UART1_RDR (0x2000A100 + 0x8C)
#define DMA_ADDR_UART2_TDR (0x2000AA00 + 0x88)
#define DMA_ADDR_UART2_RDR (0x2000AA00 + 0x8C)
#define DMA_ADDR_UART3_TDR (0x30002000 + 0x88)
#define DMA_ADDR_UART3_RDR (0x30002000 + 0x8C)
#define DMA_ADDR_I2C0_TDR (0x2000A300 + 0x88)
#define DMA_ADDR_I2C0_RDR (0x2000A300 + 0x8C)
#define DMA_ADDR_I2C1_TDR (0x2000A900 + 0x88)
#define DMA_ADDR_I2C1_RDR (0x2000A900 + 0x8C)
#define DMA_ADDR_I2C2_TDR (0x30003000 + 0x88)
#define DMA_ADDR_I2C2_RDR (0x30003000 + 0x8C)
#define DMA_ADDR_I2C3_TDR (0x30004000 + 0x88)
#define DMA_ADDR_I2C3_RDR (0x30004000 + 0x8C)
#define DMA_ADDR_SPI0_TDR (0x2000A200 + 0x88)
#define DMA_ADDR_SPI0_RDR (0x2000A200 + 0x8C)
#define DMA_ADDR_SPI1_TDR (0x30008000 + 0x88)
#define DMA_ADDR_SPI1_RDR (0x30008000 + 0x8C)
#define DMA_ADDR_I2S_TDR (0x2000AB00 + 0x88)
#define DMA_ADDR_I2S_RDR (0x2000AB00 + 0x8C)
#define DMA_ADDR_ADC_RDR (0x20002000 + 0x04)
#define DMA_ADDR_DAC_TDR (0x20002000 + 0x48)
#define DMA_ADDR_IR_TDR (0x2000A600 + 0x88)
/**
* @}
*/
/** @defgroup DMA_PERIPHERAL_REQUEST dma peripheral request definition
* @{
*/
#define DMA_REQUEST_NONE 0x00000000
#define DMA_REQUEST_UART0_RX 0x00000000
#define DMA_REQUEST_UART0_TX 0x00000001
#define DMA_REQUEST_UART1_RX 0x00000002
#define DMA_REQUEST_UART1_TX 0x00000003
#define DMA_REQUEST_UART2_RX 0x00000004
#define DMA_REQUEST_UART2_TX 0x00000005
#define DMA_REQUEST_I2C0_RX 0x00000006
#define DMA_REQUEST_I2C0_TX 0x00000007
#define DMA_REQUEST_IR_TX 0x00000008
#define DMA_REQUEST_SPI0_RX 0x0000000A
#define DMA_REQUEST_SPI0_TX 0x0000000B
#define DMA_REQUEST_AUDIO_RX 0x0000000C
#define DMA_REQUEST_AUDIO_TX 0x0000000D
#define DMA_REQUEST_I2C1_RX 0x0000000E
#define DMA_REQUEST_I2C1_TX 0x0000000F
#define DMA_REQUEST_I2S_RX 0x00000010
#define DMA_REQUEST_I2S_TX 0x00000011
#define DMA_REQUEST_ADC 0x00000016
#define DMA_REQUEST_DAC 0x00000017
/* Only support dma2 */
#define DMA_REQUEST_UART3_RX 0x00000000
#define DMA_REQUEST_UART3_TX 0x00000001
#define DMA_REQUEST_SPI1_RX 0x00000002
#define DMA_REQUEST_SPI1_TX 0x00000003
#define DMA_REQUEST_I2C2_RX 0x00000006
#define DMA_REQUEST_I2C2_TX 0x00000007
#define DMA_REQUEST_I2C3_RX 0x00000008
#define DMA_REQUEST_I2C3_TX 0x00000009
/**
* @}
*/
#elif defined(BL628)
/** @defgroup DMA_PERIPHERAL_REGBASE dma peripheral data register address definition
* @{
*/
#define DMA_ADDR_UART0_TDR (0x20010000 + 0x88)
#define DMA_ADDR_UART0_RDR (0x20010000 + 0x8C)
#define DMA_ADDR_UART1_TDR (0x20011000 + 0x88)
#define DMA_ADDR_UART1_RDR (0x20011000 + 0x8C)
#define DMA_ADDR_UART2_TDR (0x20012000 + 0x88)
#define DMA_ADDR_UART2_RDR (0x20012000 + 0x8C)
#define DMA_ADDR_I2C0_TDR (0x20014000 + 0x88)
#define DMA_ADDR_I2C0_RDR (0x20014000 + 0x8C)
#define DMA_ADDR_I2C1_TDR (0x20015000 + 0x88)
#define DMA_ADDR_I2C1_RDR (0x20015000 + 0x8C)
#define DMA_ADDR_SPI0_TDR (0x20018000 + 0x88)
#define DMA_ADDR_SPI0_RDR (0x20018000 + 0x8C)
#define DMA_ADDR_I2S_TDR (0x2001E000 + 0x88)
#define DMA_ADDR_I2S_RDR (0x2001E000 + 0x8C)
#define DMA_ADDR_ADC_RDR (0x20002000 + 0x04)
#define DMA_ADDR_DAC_TDR (0x20002000 + 0x48)
/**
* @}
*/
/** @defgroup DMA_PERIPHERAL_REQUEST dma peripheral request definition
* @{
*/
#define DMA_REQUEST_NONE 0x00000000
#define DMA_REQUEST_UART0_RX 0x00000000
#define DMA_REQUEST_UART0_TX 0x00000001
#define DMA_REQUEST_UART1_RX 0x00000002
#define DMA_REQUEST_UART1_TX 0x00000003
#define DMA_REQUEST_UART2_RX 0x00000004
#define DMA_REQUEST_UART2_TX 0x00000005
#define DMA_REQUEST_I2C0_RX 0x00000006
#define DMA_REQUEST_I2C0_TX 0x00000007
#define DMA_REQUEST_I2C1_RX 0x00000008
#define DMA_REQUEST_I2C1_TX 0x00000009
#define DMA_REQUEST_SPI0_RX 0x0000000A
#define DMA_REQUEST_SPI0_TX 0x0000000B
#define DMA_REQUEST_I2S_RX 0x00000010
#define DMA_REQUEST_I2S_TX 0x00000011
#define DMA_REQUEST_ADC 0x00000016
#define DMA_REQUEST_DAC 0x00000017
/**
* @}
*/
#endif
/** @defgroup DMA_CMD dma feature control cmd definition
* @{
*/
#define DMA_CMD_SET_SRCADDR_INCREMENT (0x01)
#define DMA_CMD_SET_DSTADDR_INCREMENT (0x02)
#define DMA_CMD_SET_ADD_MODE (0x03)
#define DMA_CMD_SET_REDUCE_MODE (0x04)
/**
* @}
*/
union bflb_dma_lli_control_s {
struct
{
uint32_t TransferSize : 12; /* [11: 0], r/w, 0x0 */
uint32_t SBSize : 2; /* [13:12], r/w, 0x1 */
uint32_t dst_min_mode : 1; /* [ 14], r/w, 0x0 */
uint32_t DBSize : 2; /* [16:15], r/w, 0x1 */
uint32_t dst_add_mode : 1; /* [ 17], r/w, 0x0 */
uint32_t SWidth : 2; /* [19:18], r/w, 0x2 */
uint32_t reserved_20 : 1; /* [ 20], rsvd, 0x0 */
uint32_t DWidth : 2; /* [22:21], r/w, 0x2 */
uint32_t fix_cnt : 2; /* [24:23], r/w, 0x0 */
uint32_t SLargerD : 1; /* [ 25], r/w, 0x0 */
uint32_t SI : 1; /* [ 26], r/w, 0x1 */
uint32_t DI : 1; /* [ 27], r/w, 0x1 */
uint32_t Prot : 3; /* [30:28], r/w, 0x0 */
uint32_t I : 1; /* [ 31], r/w, 0x0 */
} bits;
uint32_t WORD;
};
/**
* @brief DMA channel lli pool structure
*
* @param src_addr DMA source address
* @param dst_addr DMA destination address
* @param nextlli DMA next lli address
* @param control DMA lli config
*/
struct bflb_dma_channel_lli_pool_s {
uint32_t src_addr;
uint32_t dst_addr;
uint32_t nextlli;
union bflb_dma_lli_control_s control;
};
/**
* @brief DMA channel lli transfer structure
*
* @param src_addr DMA source address
* @param dst_addr DMA destination address
* @param nbytes How many bytes should be transferred
*/
struct bflb_dma_channel_lli_transfer_s {
uint32_t src_addr;
uint32_t dst_addr;
uint32_t nbytes;
};
/**
* @brief DMA configuration structure
*
* @param direction DMA transfer direction, use @ref DMA_DIRECTION
* @param src_req DMA source request, use @ref DMA_PERIPHERAL_REQUEST
* @param dst_req DMA destination request, use @ref DMA_PERIPHERAL_REQUEST
* @param src_addr_inc DMA source address increment, use @ref DMA_ADDR_INCREMENT
* @param dst_addr_inc DMA destination address increment, use @ref DMA_ADDR_INCREMENT
* @param src_burst_count DMA source burst count, use @ref DMA_BURST_COUNT
* @param dst_burst_count DMA destination burst count, use @ref DMA_BURST_COUNT
* @param src_width DMA source data width, use @ref DMA_DATA_WIDTH
* @param dst_width DMA destination data width, use @ref DMA_DATA_WIDTH
*/
struct bflb_dma_channel_config_s {
uint8_t direction;
uint32_t src_req;
uint32_t dst_req;
uint8_t src_addr_inc;
uint8_t dst_addr_inc;
uint8_t src_burst_count;
uint8_t dst_burst_count;
uint8_t src_width;
uint8_t dst_width;
};
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief Initialize dma channel.
*
* @param [in] dev device handle
* @param [in] config pointer to save dma channel configuration
*/
void bflb_dma_channel_init(struct bflb_device_s *dev, const struct bflb_dma_channel_config_s *config);
/**
* @brief Deinitialize dma channel.
*
* @param [in] dev device handle
*/
void bflb_dma_channel_deinit(struct bflb_device_s *dev);
/**
* @brief Start dma channel transfer.
*
* @param [in] dev device handle
*/
void bflb_dma_channel_start(struct bflb_device_s *dev);
/**
* @brief Stop dma channel transfer.
*
* @param [in] dev device handle
*/
void bflb_dma_channel_stop(struct bflb_device_s *dev);
/**
* @brief Check if dma channel is in busy.
*
* @param [in] dev device handle
* @return true means dma channel does not transfer completely, otherwise transfers completely.
*/
bool bflb_dma_channel_isbusy(struct bflb_device_s *dev);
/**
* @brief Register dma channel transmission completion interrupt callback.
*
* @param [in] dev device handle
* @param [in] callback interrupt callback
* @param [in] arg user data
*/
void bflb_dma_channel_irq_attach(struct bflb_device_s *dev, void (*callback)(void *arg), void *arg);
/**
* @brief Unregister dma channel transmission completion interrupt callback.
*
* @param [in] dev device handle
*/
void bflb_dma_channel_irq_detach(struct bflb_device_s *dev);
/**
* @brief Config dma channel lli.
*
* @param [in] dev device handle
* @param [in] lli_pool pointer to lli pool
* @param [in] max_lli_count lli pool size
* @param [in] transfer pointer to transfer structure
* @param [in] count transfer count.
* @return A negated errno value on failure, otherwise means number of used lli.
*/
int bflb_dma_channel_lli_reload(struct bflb_device_s *dev,
struct bflb_dma_channel_lli_pool_s *lli_pool, uint32_t max_lli_count,
struct bflb_dma_channel_lli_transfer_s *transfer, uint32_t count);
/**
* @brief Enable lli continueous mode.
*
* @param [in] dev device handle
* @param [in] lli_pool pointer to lli pool
* @param [in] used_lli_count number of used lli.
*/
void bflb_dma_channel_lli_link_head(struct bflb_device_s *dev,
struct bflb_dma_channel_lli_pool_s *lli_pool,
uint32_t used_lli_count);
/**
* @brief Control dma feature.
*
* @param [in] dev device handle
* @param [in] cmd feature command. use @ref DMA_CMD
* @param [in] arg user data
* @return A negated errno value on failure.
*/
int bflb_dma_feature_control(struct bflb_device_s *dev, int cmd, size_t arg);
/**
* @brief Enable or disable dma channel transmission completion interrupt.
*
* @param [in] dev device handle
* @param [in] mask true means disable, false means enable
*/
void bflb_dma_channel_tcint_mask(struct bflb_device_s *dev, bool mask);
/**
* @brief Check if dma channel transfers completely.
*
* @param [in] dev device handle
* @return true means yes, false means no.
*/
bool bflb_dma_channel_get_tcint_status(struct bflb_device_s *dev);
/**
* @brief Clear dma channel transmission completion interrupt status.
*
* @param [in] dev device handle
*/
void bflb_dma_channel_tcint_clear(struct bflb_device_s *dev);
#ifdef __cplusplus
}
#endif
/**
* @}
*/
/**
* @}
*/
#endif