rt-thread/bsp/phytium/libraries/standalone/drivers/dma/fddma/fddma.h

169 lines
6.0 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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) 2022 Phytium Information Technology, Inc.
* All Rights Reserved.
*
* This program is OPEN SOURCE software: you can redistribute it and/or modify it
* under the terms of the Phytium Public License as published by the Phytium Technology Co.,Ltd,
* either version 1.0 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the Phytium Public License for more details.
*
*
* FilePath: fddma.h
* Date: 2022-02-10 14:53:42
* LastEditTime: 2022-02-18 08:24:52
* Description:  This files is for ddma interface definition
*
* Modify History:
* Ver   Who        Date         Changes
* ----- ------     --------    --------------------------------------
* 1.0 Zhugengyu 2022/5/13 init commit
*/
#ifndef DRIVER_FDDMA_H
#define DRIVER_FDDMA_H
#ifdef __cplusplus
extern "C"
{
#endif
/***************************** Include Files *********************************/
#include "ftypes.h"
#include "ferror_code.h"
/************************** Constant Definitions *****************************/
typedef enum
{
FDDMA_CHAN_0 = 0,
FDDMA_CHAN_1,
FDDMA_CHAN_2,
FDDMA_CHAN_3,
FDDMA_CHAN_4,
FDDMA_CHAN_5,
FDDMA_CHAN_6,
FDDMA_CHAN_7,
FDDMA_NUM_OF_CHAN
} FDdmaChanIndex; /* DDMA channel index */
typedef enum
{
FDDMA_CHAN_REQ_RX = 0,
FDDMA_CHAN_REQ_TX,
} FDdmaChanRequst; /* DDMA channel direction */
typedef enum
{
FDDMA_CHAN_EVT_REQ_DONE = 0,
FDDMA_CHAN_EVT_FIFO_EMPTY,
FDDMA_CHAN_EVT_FIFO_FULL,
FDDMA_NUM_OF_CHAN_EVT
} FDdmaChanEvt; /* DDMA channel interrupt event */
#define FDDMA_SUCCESS FT_SUCCESS
#define FDDMA_ERR_NOT_INIT FT_MAKE_ERRCODE(ErrModBsp, ErrDdma, 0)
#define FDDMA_ERR_CHAN_BINDED FT_MAKE_ERRCODE(ErrModBsp, ErrDdma, 1)
#define FDDMA_ERR_CHAN_RUNNING FT_MAKE_ERRCODE(ErrModBsp, ErrDdma, 2)
#define FDDMA_ERR_INVALID_TRANS_SIZE FT_MAKE_ERRCODE(ErrModBsp, ErrDdma, 3)
#define FDDMA_ERR_WAIT_TIMEOUT FT_MAKE_ERRCODE(ErrModBsp, ErrDdma, 4)
#define FDDMA_ERR_INVALID_DDR_ADDR FT_MAKE_ERRCODE(ErrModBsp, ErrDdma, 5)
/**************************** Type Definitions *******************************/
typedef struct FDdma_ FDdma;
typedef struct FDdmaChan_ FDdmaChan;
typedef void (*FDdmaChanEvtHandler)(FDdmaChan *const dma_chan, void *arg); /* DMA interrupt event handler */
typedef struct
{
u32 id; /* DDMA ctrl id */
uintptr base_addr; /* DDMA ctrl base address */
u32 irq_num; /* DDMA ctrl interrupt id */
u32 irq_prority; /* DDMA ctrl interrupt priority */
} FDdmaConfig; /* DDMA instance configuration */
typedef struct
{
FDdmaChanIndex id; /* DMA channel index */
u32 slave_id; /* Perpherial slave id for DDMA */
FDdmaChanRequst req_mode; /* DMA transfer direction */
uintptr ddr_addr; /* DMA channel DDR address, could be source or destination */
u32 dev_addr; /* DMA channel Perpherial, could be source or destination */
u32 trans_len; /* DMA channel transfer length */
#define FDDMA_MAX_TRANSFER_LEN 64 /* max bytes in transfer */
#define FDDMA_MIN_TRANSFER_LEN 4 /* min bytes in transfer */
u32 timeout; /* timeout = 0 means no use DMA timeout */
} FDdmaChanConfig; /* DDMA channel instance */
typedef struct FDdmaChan_
{
FDdmaChanConfig config; /* DDMA channel configuration */
boolean is_used; /* TRUE means channel is in use */
FDdma *dma; /* DMA instance of this channel */
FDdmaChanEvtHandler evt_handler[FDDMA_NUM_OF_CHAN_EVT]; /* interrupt evt */
void *evt_handler_args[FDDMA_NUM_OF_CHAN_EVT]; /* interrupt evt args */
} FDdmaChan; /* DDMA channel instance */
typedef struct FDdma_
{
FDdmaConfig config; /* DDMA instance configuration */
FDdmaChan *chan[FDDMA_NUM_OF_CHAN]; /* DDMA channel instance, NULL means channel not yet allocate */
u32 is_ready; /* TRUE means DDMA init ok */
u32 bind_status; /* channel bind status, BIT(n) = 1 means channel n is allocated */
} FDdma; /* DDMA instance */
/************************** Variable Definitions *****************************/
/***************** Macros (Inline Functions) Definitions *********************/
#define FDDMA_DDR_ADDR_ALIGMENT 128 /* DMA DDR Buffer need align wiht 128 bytes */
/************************** Function Prototypes ******************************/
/* 获取DDMA实例默认配置 */
const FDdmaConfig *FDdmaLookupConfig(u32 instance_id);
/* 初始化DDMA控制器 */
FError FDdmaCfgInitialization(FDdma *const instance, const FDdmaConfig *input_config);
/* 去初始化DDMA控制器 */
void FDdmaDeInitialization(FDdma *const instance);
/* 按照配置分配DDMA通道 */
FError FDdmaAllocateChan(FDdma *const instance, FDdmaChan *const dma_chan, const FDdmaChanConfig *dma_chan_config);
/* 释放之前分配的DDMA通道 */
FError FDdmaDellocateChan(FDdmaChan *const dma_chan);
/* 使能指定的DDMA通道调用FDdmaAllocateChan后无需调用此函数 */
FError FDdmaActiveChan(FDdmaChan *const dma_chan);
/* 去使能DDMA通道 */
FError FDdmaDeactiveChan(FDdmaChan *const dma_chan);
/* 启动DDMA控制器并开始传输 */
FError FDdmaStart(FDdma *const instance);
/* 停止DDMA控制器 */
FError FDdmaStop(FDdma *const instance);
/* DDMA中断处理函数 */
void FDdmaIrqHandler(s32 vector, void *args);
/* 注册DDMA通道中断响应事件函数 */
void FDdmaRegisterChanEvtHandler(FDdmaChan *const dma_chan,
FDdmaChanEvt evt,
FDdmaChanEvtHandler handler,
void *handler_arg);
/* DDMA控制器寄存器自检测试 */
void FDdmaDumpRegisters(uintptr base_addr);
void FDdmaDumpChanRegisters(uintptr base_addr, FDdmaChanIndex chan);
#ifdef __cplusplus
}
#endif
#endif