NIOS2随笔——DMA(1)

1. NIOS2 DMA控制器结构框图

与其它IP外设一样,DMA控制器也是通过AVALON MM总线,实现寄存器配置,数据读写功能。

2. NIOS2 DMA三种传输方式

3. NIOS2 DMA API函数

NIOS2 DMA的API函数原型都定义在alt_dma.h头文件中,常用的API函数如下:

alt_dma_txchan alt_dma_txchan_open (const char* name);
static ALT_INLINE int alt_dma_txchan_send (alt_dma_txchan dma, 
             const void* from, 
             alt_u32 length,
             alt_txchan_done* done, 
             void* handle)
{
  return dma ? dma->dma_send (dma, 
        from, 
        length,
        done, 
        handle) : -ENODEV;
}
static ALT_INLINE int alt_dma_txchan_ioctl (alt_dma_txchan dma, 
              int            req, 
              void*          arg)
{
  return dma ? dma->ioctl (dma, req, arg) : -ENODEV;
}
alt_dma_rxchan alt_dma_rxchan_open (const char* dev);
static ALT_INLINE int alt_dma_rxchan_prepare (alt_dma_rxchan   dma, 
                                              void*            data,
                                              alt_u32          len,
                                              alt_rxchan_done* done,  
                                              void*            handle)
{
  return dma ? dma->prepare (dma, data, len, done, handle) : -ENODEV;
}
static ALT_INLINE int alt_dma_rxchan_ioctl (alt_dma_rxchan dma, 
              int            req, 
              void*          arg)
{
  return dma ? dma->ioctl (dma, req, arg) : -ENODEV;
}

4. 参考设计——OnchipMenmory to SDRAM

1) Qsys设置

NIOS2代码运行在SDRAM中,OnchipMemory作为一个片上存储外设。

下面两个图是QSYS中的IP设置,图中可以看出DMA支持BURST读写模式,这样效率会大大提高。

在第二张图片中,博主勾选了show signals选项,可以看到,DMA组件定义的信号接口,有一个AVALON MM SLAVE端口,用于配制寄存器,两个AVALON MM MASTER分别实现读写功能,还有一个IRQ中断输出,向CPU产生中断信号。

2)软件源码

//file name:	main.c
//date:		2016.8.15
//author:	shugen.yin
//function:	DMA, onchip memory to sdram/ddr2
//log:

#include <stdio.h>
#include <string.h>
#include <sys/alt_irq.h>
#include "system.h"
#include "alt_types.h"
#include "sys/alt_dma.h"

#define DAT_LEN 32

unsigned int buffer0[DAT_LEN/4];
unsigned int *point=ONCHIP_MEMORY1_0_BASE;

static void DMA_Init(void); //初始化DMA
unsigned int dma_end_flag = 0;

alt_dma_txchan tx;
alt_dma_rxchan rx;

void dma_done()
{
	dma_end_flag++;
}

static void DMA_Init(void)
{
	tx = alt_dma_txchan_open("/dev/dma_0");

	if(tx != NULL)
	{
		printf("DMA transition start\n");
	}

	alt_dma_txchan_ioctl(tx,ALT_DMA_SET_MODE_32,NULL);

	//point是源地址、传输数据块长度是DAT_LEN
	alt_dma_txchan_send(tx, point, DAT_LEN, NULL, NULL);

	rx = alt_dma_rxchan_open("/dev/dma_0");

	alt_dma_rxchan_ioctl(rx,ALT_DMA_SET_MODE_32,NULL);

	//buffer0是目标地址、传输数据块长度是DAT_LEN、dma_done()是DMA完成后被调用的回调函数
	alt_dma_rxchan_prepare(rx, buffer0 , DAT_LEN, dma_done, NULL);
}

int main()
{
	int i;

	for(i=0;i<DAT_LEN/4;i++)
		buffer0[i] = 0;

	for(i=0;i<DAT_LEN/4;i++)
		*(point+i) = i+1;

	//初始化DMA
	DMA_Init();
	//等待中断结束,说明传输完成
	while(dma_end_flag == 0)
	{
	}
	//打印接收地址的数据
	for(i=0;i<DAT_LEN/4;i++)
	{
		printf("buffer0[%d]=%d\t",i,buffer0[i]);
	}

	alt_dma_txchan_close(tx);
	alt_dma_rxchan_close(rx);

	return 0;
}




时间: 2024-10-25 01:28:12

NIOS2随笔——DMA(1)的相关文章

NIOS2随笔——JPEG解码与VGA显示

1. 系统概述 本设计采用NIOS2 32位处理器,通过SPI接口将SD/TF卡中的JPEG图片数据读取到内存中,SD/TF卡的文件系统为FAT32,NIOS2软件实现JPEG解码后,启动framereader和Clocked Video Output模块,最终在VGA显示器上显示JPEG图像,系统框图如下: 2. JPEG格式 JPEG(Joint Photographic Experts Group)是第一个国际图像压缩标准,提供了良好的压缩性能的同时,具有较好的图像质量,被广泛应用电子产品

NIOS2随笔——FAT32文件系统

1. 概述 FAT32是Windows系统硬盘分区格式的一种,最大单文件大小为4GB. FAT32由下面3个部分组成: MBR: Master Boot Record, 512KB, 硬盘的物理0地址,以0x55aa结束分区: FAT: File Allocation Table, 512*2KB, 32位的文件分配表,最大单文件大小为4GB,以0x55aa结束分区: File and Directory Data:数据与目录区域. 比如,一个42B的文件会占用2K=4个sector(512KB

NIOS2随笔——自定义IP(DPRAM)

AVALON总线分类 在QSYS下,一个简单的组件包含了许多接口,它们实现了不同的功能,大致有下面几种: Avalon-MM Avalon-ST Avalon Conduit Avalon-TC Avalon Interrupt Avalon Clock. 这些标准是开源的,不需要license就可以开发使用.下图是一个总线应用的示意图: 2. AVALON MM总线 这里以AVALON MM为例,设计一个用户自定义的DPRAM组件,并用DMA方式将DPRAM PORTB中的数据搬移到内存SDR

NIOS2随笔——JPEG图片的UART传输显示

1. 系统概述 本设计采用NIOS2 32位处理器,通过SPI接口将SD/TF卡中的JPEG图片数据读取到内存中,SD/TF卡的文件系统为FAT32,NIOS2软件实现将JPEG图片通过UART串口发送给上位机显示,系统框图如下: 2. UART介绍 UART(Universal Asynchronous Receiver/Transmitter)是一种异步收发传输器,工作原理是将传输数据的每个字符一位接一位地传输. UART在空闲时为逻辑1状态,其各位的的意义如下: 起始位:先发出一个逻辑"0

EDMA3随笔

最近查DM814x上两个M3莫名其妙挂掉的问题查了将近两周,最后发现居然是各个模块的dma乱用引起的. A8上的音频mcasp用了两个dma通道…… TI给的simcop里面imx实现的swosd又用了一串的dma通道…… M3上面的cover业务又用了一个…… 后面dsp上加跑的算法又用了两个,然后就开始出现死机了,诶…… 查到最后,发现是有些模块的edma通道都用冲突了,dsp上算法用的qdma通道随便拿了几个paRamSet,tcc也完全随意指定的. 记得以前开发648的时候,这些东西都是

C#博客随笔之六:数据绑定

这一篇随笔记录的是在完成程序中遇到的一些情况 首先要讲的是MVVM 所谓MVVM就是Model,View,ViewModel 下面是MVVM的优点(引用自百度百科): MVVM模式和MVC模式一样,主要目的是分离视图(View)和模型(Model),有几大优点1. 低耦合.视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的"View"上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变.2. 可重用性.你可以把一些视图

kobox : dma_s3c.ko -v1 操作寄存器方式操作S3C2440的DMA

平台:TQ2440 linux版本:Linux EmbedSky 3.16.1-svn57 #56 Sat Oct 18 21:46:22 PDT 2014 armv4tl GNU/Linux 目标:v2中改成s3c2410_dma_xxx方式来操作DMA,看这里的寄存器映射是怎么使用系统接口来操作的! #include "dma.h" #define MEM_CPY_NO_DMA 0 #define MEM_CPY_DMA 1 //#define BUF_SIZE (512*1024

Abby&#39;s 学习php5随笔

2017.6.27 Abby's cakephp2 学习之旅 下载了XAMPP集成开发环境,然后配置其数据库,参考学习教程, 1.建立表单. 配置完信息如下,Cache Apache默认在windows下是system用户,所以权限最高,但xampp集成环境中的apache确是administor 如何更改apache用户为system 静默开发.(一种开发方法,番茄ToDo中的学霸模式有些相似) 如何设置.ctp的显示 http://cakephp2.local/posts/index怎么就可

java基础随笔 字符数据类型char的单引号

public class Love{ public static void main(String[] args){ System.out.println('*'+'\t'+'*'); System.out.println("*"+"\t"+"*") } } 运行结果   第一行为  93 第二行为  *        * 原因 第一行中'\t' 单引号  识别为字符数据类型char,char类型是可以运算的,在第一行中+做了运算符. 第二行&q