HI3531由DMA 发起PCIe 事务
Hi3531 PCIe 控制器内含DMA 控制器,DMA 控制器包含有两个DMA 通道(一个
DMA 读通道和一个DMA 写通道)。PCIe 控制器内包含的DMA 控制器用于大数据量
的存储器读写事务,以提高数据传输的速率。
DMA 控制器可以实现如下的存储器读写事务:
DMA 控制寄存器
软件可通过DMA 控制寄存器来配置DMA 传输,也可以通过DMA 控制寄存器启动和
停止DMA 传输。DMA 控制寄存器位于PCIe 控制器的配置寄存器空间内,DMA 控制
寄存器的定义请参考本章的PCIe 寄存器描述。
注意中提到的部分DMA 控制寄存器包含:
DMA_CH_CTRL 寄存器;
DMA_TRANS_SIZE 寄存器;
DMA_SAR_LOW 和DMA_SAR_HIGH 寄存器;
DMA_DAR_LOW 和DMA_DAR_HIGH 寄存器;
DMA_LINK_PT_LOW 和DMA_LINK_PT_HIGH 寄存器。
1. 软件设置DMA_CH_INDEX[ch_dir]=1,表明后续操作目标寄存器为读通道控制寄存
器。
2. 软件设置DMA_TRANS_SIZE=0x400,表明传输长度为1024Byte。
DMA 读/写通道使能
DMA 通道在系统复位后默认是没有使能的,要使用PCIe 的DMA 通道,需使能DMA
的读写通道。
通过设置DMA_RD_ENGINE_EN[dma_rd_engine_en]为1,使能DMA 读通道。
通过设置DMA_WR_ENGINE_EN[dma_wr_engine_en]为1,使能DMA 写通道。
DMA 源地址和目标地址
DMA 写:源地址(SAR)为本地内存空间,目标地址(DAR)为对端设备内存空间。
DMA 读:源地址(SAR)为对端设备内存空间,目标地址(DAR)为本地内存空间。
配置DMA 读或写通道的DMA_SAR_LOW 和DMA_SAR_HIGH 寄存器可以指定DMA
传输的源地址,配置DMA 读或写通道的DMA_DAR_LOW 和DMA_DAR_HIGH 寄存
器可以指定DMA 传输的目的地址。DMA 源地址和目的地址寄存器请参看PCIe DMA
控制寄存器定义。
DMA 传输过程中,源地址和目的地址寄存器随着传输过程而递增。可以通过读取源地
址和目的地址寄存器的值来确定DMA 当前传输所获取数据的源地址和当前所写数据
的目标地址。
DMA 源地址和DMA 目的地址都是双字节对齐的,因此最低两比特都必须设置为0。
在传输过程中此最低两比特也一直为0。
DMA 传输长度
DMA 读或写操作的传输长度由DMA 读或写通道的DMA_TRANS_SIZE 寄存器来指
定。该寄存器的值表示DMA 请求传输的数据的字节数。在DMA 传输过程,此寄存器
的值会随着传输过程递减,可以通过读取此寄存器确定当前还有多少字节未传输。传
输成功结束后此寄存器值应该为0。
DMA 传输长度取值范围为:最小为1 个字节,最大为4G 字节。
启动DMA 传输
在配置好DMA 读通道的控制寄存器之后,通过向
DMA_RD_DOORBELL[rd_doorbell_num]写入0 来启动DMA 读传输。
在配置好DMA 写通道的控制寄存器之后,通过向
DMA_WR_DOORBELL[wr_doorbell_num]写入0 来启动DMA 写传输。
停止DMA 传输
在DMA 传输过程中如果需要停止DMA 传输,可以通过如下寄存器控制来手动停止
DMA 读或者DMA 写传输:
通过向DMA_RD_DOORBELL[dma_rd_stop]写入1 来停止DMA 读传输。
通过向DMA_RD_DOORBELL[dma_wr_stop]写入1 来停止DMA 读传输。
如果DMA 传输过程中没有发生错误,DMA 传输将在所有的数据传输完成后自动停
止。
HI_MPI_SYS_SetReg(0x20800A6C,0x00000000);//bit31 0 WRITE DMA_CH_INDEX
HI_MPI_SYS_SetReg(0x20800A78,0x00000010);//DMA_TRANS_SIZE 10
HI_MPI_SYS_SetReg(0x2080097c,0x00000001);//使能写操作
HI_MPI_SYS_SetReg(0x20800A7c,0xc0000000);// 源地址—低位
HI_MPI_SYS_SetReg(0x20800A80,0x00000000);// 源地址—高位
HI_MPI_SYS_SetReg(0x20800A84,0x0544f000);// 目标地址—低位 PC机申请的物理地址
HI_MPI_SYS_SetReg(0x20800A88,0x00000000);// 目标地址—高位
HI_MPI_SYS_SetReg(0x20800980,0x00000000);//启动写操作
HI3531由DMA 发起PCIe 事务的更多相关文章
- PCIe事务层包TLP Header详解
1.事务层包的一般格式: 包的header为3DW(double word)或者4DW(一个DW代表4字节),数据负载为1~1024DW(即4~4096byte,最大4M),TLP Digest可选, ...
- PCIe事务层の详解(一)
PCIe总线的通信机制:当一个设备要想另一个设备进行读取通信时,请求方requester需要向另一个设备发送请求request,靶向方作为事件完成方completer,以complete Packet ...
- hi3531的pcie控制器使能
1. 关闭PCIe 控制器: 通过向系统控制寄存器PERIPHCTRL30[pcie0_app_ltssm_enabl]写入0 关闭PCIe0 控制 器. 通过向系统控制寄存器PERIPHCTRL77 ...
- FPGA与PCI-E
从并行到串行: PCI Express(又称PCIe)是一种高性能.高带宽串行通讯互连标准,取代了基于总线的通信架构,如:PCI.PCI Extended (PCI-X) 以及加速图形端口(AGP). ...
- 转载 大话pcie
原文https://blog.csdn.net/abcamus/article/details/76167747 一.PCIe DMA机制 PCIe控制器也提供DMA(Direct Memory ac ...
- 图解PCIE原理(从软件角度)
1 PCIE基本概念 1.1 PCIE拓扑架构图 1.2 PCIE Switch内部结构图 1.3 PCIE协议结构图 2 PCIE枚举原理 2.1 Type0&Type1配置头空间 ...
- Xilinx DMA的几种方式与架构
DMA是direct memory access,在FPGA系统中,常用的几种DMA需求: 1. 在PL内部无PS(CPU这里统一称为PS)持续干预搬移数据,常见的接口形态为AXIS与AXI,AXI与 ...
- [WCF编程]12.事务:事务传播
一.事务传播概述 WCF可以跨越服务边界传递事务.这可以让服务参与到客户端事务里,客户端还可以在同一个事务里调用多个服务.客户端本身不一定是WCF服务.客户端事务是否传播到服务端可以通过绑定和操作契约 ...
- (6)redis 事务
redis对事务的支持目前还比较简单.redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令. 由于redis是单线程来处理所有client的请求的所 ...
随机推荐
- 扩展 KMP
扩展KMP解决这样一些问题: 给定两个字符串 S 和 T(长度分别为 n 和 m),下标从 0 开始,定义extend[i]等于S[i]...S[n-1]与 T 的最长相同前缀的长度,求出所有的ext ...
- zlib库VS2015编译步骤
[点击这里下载zlib1.2.8源码](http://zlib.net/zlib128.zip) [点击这里下载zlib1.2.8编译动态库](http://zlib.net/zlib128-dll. ...
- ssh: Could not resolve hostname git.*****-inc.com : Temporary failure in name resolution fatal: The remote end hung up unexpectedly
问题出现的情景:使用git pull拉取开发的代码到测试服务器,报错: ssh: Could not resolve hostname git.****-inc.com : Temporary fai ...
- c++多态性---虚函数
虚函数与纯虚函数的区别: 1.拥有虚函数的类可以声明对象,但拥有纯虚函数的类不可以声明对象(只能声明一个指针,并且不能给其分配内存),并且将这个类称为抽象类 特点: 1.虚函数是动态绑定的基础. 2. ...
- C++11 标准库也有坑(time-chrono)
恰巧今天调试程序遇到时间戳问题, 于是又搜了搜关于取时间戳,以及时间戳转字符串的问题, 因为 time() 只能取到秒(win和linux) 想试试看能不能找到 至少可以取到毫秒的, 于是, 就找 ...
- Ansible playbook循环实践总结<一>
1.标准Loops 标准loops可以直接减少task的次数,如下: [root@zero01 playbook]# vi loops.yaml --- - hosts: all gather_fac ...
- Sql Server 常用事务处理总结
在数据库操作中,常用事务写法: 1. 通过 @@error 判断一批sql 执行完毕,是否有异常. @@error 为系统变量,每次执行完 sql 都会返回一个数值, 0 表示 执行成功 ,非0 ...
- datatables行编辑中,某个字段用户显示和用于行编辑名称不同时的处理。
比如tag这个字段,对应服务端bean的tag,但是在页面显示时需要为String类型的tagName,那么在行编辑时可以用以下的方式处理.
- CodeFirst+MySQL+.Net Core配置详情
EF 基础操作:http://www.cnblogs.com/M-LittleBird/p/5852395.html 一.使用CodeFirst模式 1.在需要添加的项目上右键点击选择添加ADD.NE ...
- 流式计算与计算抽象化------《Designing Data-Intensive Applications》读书笔记15
上篇的内容,我们探讨了分布式计算中的MapReduce与批处理.所以本篇我们将继续探索分布式计算优化的相关细节,并且分析MapReduce与批处理的局限性,看看流式计算是否能给我们在分布式计算层面提供 ...