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
|