255 lines
7.0 KiB
C
255 lines
7.0 KiB
C
/*
|
|
* This file is part of FH8620 BSP for RT-Thread distribution.
|
|
*
|
|
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
|
* All rights reserved
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 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
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*
|
|
* Visit http://www.fullhan.com to get contact with Fullhan.
|
|
*
|
|
* Change Logs:
|
|
* Date Author Notes
|
|
*/
|
|
|
|
#ifndef FH_DMA_H_
|
|
#define FH_DMA_H_
|
|
|
|
|
|
/****************************************************************************
|
|
* #include section
|
|
* add #include here if any
|
|
***************************************************************************/
|
|
|
|
#include <rtthread.h>
|
|
|
|
|
|
/*********************************
|
|
*
|
|
* DMA SOC define start
|
|
*
|
|
*********************************/
|
|
|
|
|
|
#define FH81_MAX_CHANNEL (4)
|
|
#define FH81_CHANNEL_MAX_TRANSFER_SIZE (4095)
|
|
|
|
|
|
|
|
|
|
enum DMA_HW_HS_MAP{
|
|
ACODEC_RX = 0,
|
|
ACODEC_TX,
|
|
SPI0_RX,
|
|
SPI0_TX,
|
|
SPI1_RX,
|
|
SPI1_TX,
|
|
UART0_RX,
|
|
UART0_TX,
|
|
UART1_RX,
|
|
UART1_TX,
|
|
DMA_HW_HS_END,
|
|
};
|
|
|
|
/*********************************
|
|
*
|
|
* DMA SOC define end
|
|
*
|
|
*********************************/
|
|
|
|
//user use the dma could use callback function,when the dma make the work done...
|
|
typedef void (*dma_complete_callback)(void *complete_para);
|
|
|
|
typedef void (*user_prepare)(void *prepare_para);
|
|
|
|
|
|
|
|
/**************************** i'm cut-off line ************************************/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//controller private para...
|
|
struct fh81_dma;
|
|
|
|
|
|
struct dw_lli {
|
|
/* values that are not changed by hardware */
|
|
rt_uint32_t sar;
|
|
rt_uint32_t dar;
|
|
rt_uint32_t llp; /* chain to next lli */
|
|
rt_uint32_t ctllo;
|
|
/* values that may get written back: */
|
|
rt_uint32_t ctlhi;
|
|
/* sstat and dstat can snapshot peripheral register state.
|
|
* silicon config may discard either or both...
|
|
*/
|
|
rt_uint32_t sstat;
|
|
rt_uint32_t dstat;
|
|
rt_uint32_t reserve;
|
|
|
|
};
|
|
|
|
//transfer use below
|
|
struct dma_transfer{
|
|
//this is private for the dma drive....app don't touch it,the driver will manger it
|
|
//link interface for more transfer to the controller...
|
|
rt_list_t transfer_list;
|
|
struct fh81_dma *dma_controller;
|
|
//this the mem add....the dma controller will load the setting to move data ....
|
|
//user don't touch it
|
|
struct dw_lli *first_lli;
|
|
rt_uint32_t lli_size;
|
|
//new add for allign get desc...
|
|
rt_uint32_t actual_lli_size;
|
|
|
|
|
|
//user could set paras below~~~
|
|
#define AUTO_FIND_CHANNEL (0xff)
|
|
//transfer with which dma channel...if the data is 0xff, the driver will auto find a free channel.
|
|
rt_uint32_t channel_number;
|
|
//which dma you want to use...for fh81....only 0!!!
|
|
rt_uint32_t dma_number;
|
|
|
|
|
|
//user should set the para below
|
|
#define DMA_M2M (0) // MEM <=> MEM
|
|
#define DMA_M2P (1) // MEM => peripheral A
|
|
#define DMA_P2M (2) // MEM <= peripheral A
|
|
#define DMA_P2P (3) // peripheral A <=> peripheral B
|
|
rt_uint32_t fc_mode;//ip->mem. mem->mem. mem->ip
|
|
|
|
|
|
|
|
|
|
#define DMA_HW_HANDSHAKING (0)
|
|
#define DMA_SW_HANDSHAKING (1)
|
|
rt_uint32_t src_hs; //src
|
|
//if use hw handshaking ,you need to set the hw handshaking number, this SOC defined
|
|
rt_uint32_t src_per; //src hw handshake number
|
|
//rt_uint32_t irq_mode;//for each transfer,irq maybe not same. suggest for the default(transfer isr)
|
|
|
|
#define DW_DMA_SLAVE_WIDTH_8BIT (0)
|
|
#define DW_DMA_SLAVE_WIDTH_16BIT (1)
|
|
#define DW_DMA_SLAVE_WIDTH_32BIT (2)
|
|
rt_uint32_t src_width;
|
|
|
|
//the user should reference the hw handshaking watermark..
|
|
#define DW_DMA_SLAVE_MSIZE_1 (0)
|
|
#define DW_DMA_SLAVE_MSIZE_4 (1)
|
|
#define DW_DMA_SLAVE_MSIZE_8 (2)
|
|
#define DW_DMA_SLAVE_MSIZE_16 (3)
|
|
#define DW_DMA_SLAVE_MSIZE_32 (4)
|
|
#define DW_DMA_SLAVE_MSIZE_64 (5)
|
|
#define DW_DMA_SLAVE_MSIZE_128 (6)
|
|
#define DW_DMA_SLAVE_MSIZE_256 (7)
|
|
rt_uint32_t src_msize;
|
|
rt_uint32_t src_add;
|
|
#define DW_DMA_SLAVE_INC (0)
|
|
#define DW_DMA_SLAVE_DEC (1)
|
|
#define DW_DMA_SLAVE_FIX (2)
|
|
rt_uint32_t src_inc_mode; //increase mode: increase or not change
|
|
|
|
|
|
//#define DMA_DST_HW_HANDSHAKING (0)
|
|
//#define DMA_DST_SW_HANDSHAKING (1)
|
|
rt_uint32_t dst_hs; //src
|
|
//if use hw handshaking ,you need to set the hw handshaking number, this SOC defined
|
|
rt_uint32_t dst_per; //dst hw handshake number
|
|
//#define DW_DMA_SLAVE_WIDTH_8BIT (0)
|
|
//#define DW_DMA_SLAVE_WIDTH_16BIT (1)
|
|
//#define DW_DMA_SLAVE_WIDTH_32BIT (2)
|
|
rt_uint32_t dst_width;
|
|
//#define DW_DMA_SLAVE_MSIZE_1 (0)
|
|
//#define DW_DMA_SLAVE_MSIZE_4 (1)
|
|
//#define DW_DMA_SLAVE_MSIZE_8 (2)
|
|
//#define DW_DMA_SLAVE_MSIZE_16 (3)
|
|
//#define DW_DMA_SLAVE_MSIZE_32 (4)
|
|
//#define DW_DMA_SLAVE_MSIZE_64 (5)
|
|
//#define DW_DMA_SLAVE_MSIZE_128 (6)
|
|
//#define DW_DMA_SLAVE_MSIZE_256 (7)
|
|
rt_uint32_t dst_msize;
|
|
rt_uint32_t dst_add;
|
|
//#define DW_DMA_SLAVE_INC (0)
|
|
//#define DW_DMA_SLAVE_DEC (1)
|
|
//#define DW_DMA_SLAVE_FIX (2)
|
|
rt_uint32_t dst_inc_mode; //increase mode: increase or not change
|
|
|
|
|
|
//total sizes, unit: src_width/DW_DMA_SLAVE_WIDTH_8BIT...
|
|
//exg: src_width = DW_DMA_SLAVE_WIDTH_32BIT. trans_len = 2...means that: the dma will transfer 2*4 bytes..
|
|
//exg: src_width = DW_DMA_SLAVE_WIDTH_8BIT. trans_len = 6...means that: the dma will transfer 1*6 bytes..
|
|
rt_uint32_t trans_len;
|
|
|
|
|
|
|
|
//this is used when dma finish transfer job
|
|
dma_complete_callback complete_callback;
|
|
void *complete_para; //for the driver data use the dma driver.
|
|
|
|
|
|
//this is used when dma before work..the user maybe need to set his own private para..
|
|
user_prepare prepare_callback;
|
|
void *prepare_para;
|
|
|
|
|
|
//add cyclic para...
|
|
//period len..
|
|
rt_uint32_t period_len;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
* #define section
|
|
* add constant #define here if any
|
|
***************************************************************************/
|
|
|
|
|
|
/****************************************************************************
|
|
* ADT section
|
|
* add Abstract Data Type definition here
|
|
***************************************************************************/
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
* extern variable declaration section
|
|
***************************************************************************/
|
|
|
|
/****************************************************************************
|
|
* section
|
|
* add function prototype here if any
|
|
***************************************************************************/
|
|
rt_err_t fh81_dma_register(struct fh81_dma * fh81_dma_p,
|
|
char * dma_name);
|
|
void rt_fh_dma_init(void);
|
|
/********************************End Of File********************************/
|
|
|
|
|
|
|
|
|
|
#endif /* FH81_DMA_H_ */
|
|
|