169 lines
6.0 KiB
C
169 lines
6.0 KiB
C
/*
|
||
* 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 |