AM5728通过GPMC接口与FPGA高速数据通信实现
硬件:AM5728开发板;Artix-7开发板
软件:Linux am57xx-evm 4.4.19;Vivado 2015.2
作者:杭州矢志信息科技有限公司
邮箱:admin@sysjoint.com
AM5728外设接口丰富,有V-PORT接口、PCIe、GPMC、USB、UART等等,通常与FPGA之间高速数据通信可以选择V-PORT、PCIe、GPMC,这里以实现起来最简单的GPMC为例,实现了从FPGA到AM5728的高速数据搬运。
AM5728的ARM端运行Linux 4.4内核操作系统,通过GPMC接口采用DMA的方式读取FPGA端的数据,读取32KB数据大概用了540us,即60MB/s左右的速度,实际上通过配置GPMC接口的时间参数和工作模式,速度还可以更快。
- GPMC接口介绍
GPMC的全称是 General-Purpose Memory Controller,即通用存储控制器,是TI的Sitara 系列处理器AM5728用来与外部存储设备例如NOR FLASH、NAND FLASH、SRAM等等通信的一个接口。这个接口并不是AM5728特有的,在BeagleBone Black、AM33XX等芯片上也有类似接口。
1.1 硬件连接方式
参考SPRUHZ6I 15.4.6.1.2 在AM5728中把GPMC接口配置为异步模式并设置NOR FLASH、非地址数据线复用的模式与FPGA通信,但只用16位数据线,不用地址线,即采用类似于FIFO的方式与FPGA通信。目前实际只使用到了如下I/O口,信号方向如下图所示。
GPMC_D[15:0]: 16位数据线
GPMC_nCS: 片选信号
GPMC_nOE: 输出使能时钟
FPGA_nRST: 用于通知FPGA读写指针复位
FPGA_nIRQ: 用于通知ARM读取一块数据

1.2 硬件接口协议
采用异步方式读取,即不使用GPMC_CLK,FPGA端在GPMC_nOE的下降沿把数据送出去。

目前这种工作模式下的GPMC接口,我们只需要关心以下几个时间:
即CS有效时间,OE有效时间,GPMC读取数据时间,GPMC单个读取周期。

- Linux驱动实现
Linux 4.4 版本内核采用设备树dts的方法编写驱动,与2.6版本时候有较大区别,4.4版本内核中关于GPMC接口的API几乎没有导出,通过API来操作不可行,必须使用编写设备树方法。关于设备树的编译请参考创龙的用户手册。
AM5728的dts文件路径:linux-4.4.19-g5e4091a-v1.3\arch\arm\boot\dts
内核实现的gpmc驱动在:linux-4.4.19-g5e4091a-v1.3\drivers\memory\omap-gpmc.c
关于 dts 的编程方法可以参考:
https://learn.adafruit.com/introduction-to-the-beaglebone-black-device-tree/overview
以及阅读Linux内核目录下的文档:
Documentation\devicetree\bindings\mtd\gpmc-nor.txt
配置方面主要包括与GPMC相关的7个配置寄存器CONFIG1-CONFIG7,GPMC端口初始化等等。
(1)首先确保在 文件dra7.dtsi中引入了GPMC控制器,如下:

(2)接着在 am57xx-beagle-x15-common.dtsi 加入 GPMC 管脚初始化配置

(3)最后在实现一个自己的GPMC设备节点,其中关键的时序参数如下,在这里我们设置GPMC的片选CS6地址为0x10000000,大小为16MB,GPMC的单个读取周期为30ns。

- 采用DMA传输
AM5728带有System DMA和Enhanced DMA,Linux 4.4 之后内核中 EDMA 相关的API不对外导出,因此暂时只能采用通用的DMA API操作,实现DMA搬运。
需要注意的是,DMA中配置的地址都为物理地址,即DMA传送到源端为外设的地址即GPMC的物理地址,目的地端为你申请的内存空间物理地址。

- 实验验证
(1)使用memread读取GPMC端口数据
memread中使用mmap方法把GPMC的物理地址0x10000000映射到用户空间。在用户空间通过CPU读取GPMC端口数据,抓取CS6n和OEn的波形如下,目前没有用到DMA传送,只是在Linux循环读取,可以看见每个周期里片选信号CS6n都会维持很长一段高电平的时间,GPMC一次的读取周期大概为200ns。

通道1为片选信号CS6n,通道2为输出使能信号OEn
这样的速率大概只有 16bit / 200ns = 10MB/s
(2)使用DMA传输
编译并使用insmod工具加载DMA驱动edmatest.ko,抓取CS6n和OEn的波形如下,使用DMA传送,这下读周期就小了很多了,大概只有30ns,和GPMC参数里设置的完全一致。读取32KB数据大概用了540us,即60MB/s左右的速度。实际上通过配置GPMC接口的时间参数和工作模式,速度还可以更快。

(3)FPGA端对应的代码,FPGA端的代码只要是实现在每个OEn信号下降沿来的时候,把16bit的数据送到GPMC_DATA端口,并自加一次。

(4)Linux端读取数据并做校验
校验通过,说明数据一致性正确!至此AM5728与FPGA通过GPMC接口用DMA实现数据高速传输,验证可行!

- 源代码下载
设备树文件:http://sysjoint.com/files/dts.zip
Linux 下 memread 参考代码:http://sysjoint.com/files/memread.zip
Linux 下 edmatest 参考代码:http://sysjoint.com/files/edmatest.zip
FPGA端对应代码比较简单就不上传了。
整个实验过程中涉及到的细节很多,如有错误之处请不吝指出!
参考资料:
https://e2e.ti.com/support/arm/sitara_arm/f/791/t/512464
https://e2e.ti.com/support/arm/sitara_arm/f/791/p/315716/1530903#pi316653=1
https://github.com/fpga-logi/logi-kernel/commit/42066f774425afb196dc0f8f1ad40f450da34115
http://valentfx.com/wiki/index.php?title=LOGI_-_BBB_GPMC_Bus-_HW
有任何问题,欢迎加入 TI DSP 技术交流 QQ 群:652563558
AM5728通过GPMC接口与FPGA高速数据通信实现的更多相关文章
- DM8168通过GPMC接口与FPGA高速数据通信实现
硬件:TI达芬奇TMS320DM8168(以下简称DSP).EP4CE6E22C8N(以下简称FPGA) 软件:linux-2.6.37 转载请注明出处- http://www.cnblogs.com ...
- CC1605&CC1604 usb3.0+FPGA 高速视频采集 双目相机测评
CC1605&CC1604 usb3.0+FPGA 高速视频采集 双目相机测评 摄像头配置:ov5640.OV5642.mt9p031.mt9m001c12stm OV5640 xclk:24 ...
- EMIF接口与FPGA的互联(转)
reference: https://blog.csdn.net/ruby97/article/details/7539151 DSP6455的EMIFA模块 之前介绍了DSP6455的GPIO和中断 ...
- FPGA高速ADC接口实战——250MSPS采样率ADC9481
一.前言 最近忙于硕士毕业设计和论文,没有太多时间编写博客,现总结下之前在某个项目中用到的一个高速ADC接口设计部分.ADC这一器件经常用于无线通信.传感.测试测量等领域.目前数字系统对高速数据采集的 ...
- 基于PXIe接口的CoaXpress高速相机图像采集、回放
PXIe简介 PCI eXtensions for Instrumentation or PXI is a computer-based hardware and software platform ...
- VC709E 基于FMC接口的FPGA XC7VX690T PCIeX8 接口卡
一.板卡概述 本板卡基于Xilinx公司的FPGA XC7VX690T-FFG1761 芯片,支持PCIeX8.两组 64bit DDR3容量8GByte,HPC的FMC连接器,板卡支持各种FMC子卡 ...
- Xilinx FPGA高速串行收发器简介
1 Overview 与传统的并行实现方法相比,基于串行I/O的设计具有很多优势,包括:器件引脚数较少.降低了板空间要求.印刷电路板(PCB)层数较少.可以轻松实现PCB设计.连接器较小.电磁干扰降低 ...
- spi master接口的fpga实现
前言 当你器件的引脚贼少的时候,需要主机和从机通信,spi就派上了用场,它可以一对多,但只是片选到的从机能和主机通信,其他的挂机. spi:serial peripheral interface 串行 ...
- spi slaver接口的fpga实现
前言 spi从机接口程序,数据位8bit,sck空闲时低电平,工作时第一个沿数据传输.只有一个从机,cs低电平片选,slaver开始工作. 流程: 接口定义: 编码实现:(版权所有,请勿用于商业用途, ...
随机推荐
- TDD: 解除依赖
1 A类依赖B 类,可以把B类提取成IB接口,解除AB 之间的依赖关系. 通过创建实现了IB接口的BStub 装代码,可以模拟B类进行测试. 这是针对接口编程的典型.适合构造代价大,变化多的情况.应 ...
- Entity Framework 一
本篇主要介绍:EntityFramework简介, 实体框架架构图, EF版本 实体框架: 编写和管理数据访问的ADO.Net代码是一件单调乏味的工作.微软已经提供了一个名为“实体框架”的O / RM ...
- Oracle PL/SQL中异常高级特性
在OraclePL/SQL语句块中exception的异常处理部分是非常重要的组成部分,它决定了在PL/SQL语句块内部可执行部分在发生异常错误时,程序是友好地提示:程序遇到某些错误而无法执行,还是抛 ...
- 牛B的swift屏幕旋转经验终结者(OC统一思路)
牛B的swift屏幕旋转经验终结者(OC统一思路) 1.AppDelegate (1)定义变量 var blockRotation: Bool = false (2)定义方法 Swift代码 func ...
- css3 RGBA 红色R+绿色G+蓝色B+Alpha通道
语法: R:红色值.正整数 | 百分数 G:绿色值.正整数 | 百分数 B:蓝色值.正整数| 百分数 A:透明度.取值0~1之间 取值: <length>:Hue(色调).0(或360)表 ...
- [JSOI2008]最大数(线段树基础)
题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制: L 不超过当前数列的长度.(L > ...
- <逆向学习第二天>如何手动脱UPX、Aspack壳
UPS.AsPack压缩壳介绍: UPX .AsPack是一款先进的可执行程序文件压缩器.压缩过的可执行文件体积缩小50%-70% ,这样减少了磁盘占用空间.网络上传下载的时间和其它分布以及存储费用. ...
- unity独立游戏开发日记2018/09/27
今天优化了下昨天的代码,并且添加了树木和其他资源的生成.还修复了接近石头后,挖掘图标不出现的bug.目前可以在unity中稳定60-70fps. 详看文章:https://www.cnblogs.co ...
- 嵌入式框架Zorb Framework搭建五:事件的实现
我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...
- BAT批处理
常用命令 查看目录内容命令dir 指定可执行文件搜索目录path 创建目录命令md 打开指定目录命令cd 删除当前指定的子目录命令rd 改变当前盘符命令d: 文件复制命令copy 显示文本文件内容命令 ...