在linux下使用am335x的DMA
[本文首发于cnblogs,作者:byeyear,Email:east3@163.com]
这几天在弄am3358的DMA,简化应用环境如下:
am3358的FSMC接了一片FPGA;
FPGA上接ADC;
am3358通过FPGA以DMA方式读取ADC数据。
事先在网上查找过相关资料,发现关于这方面工作的文章极少,即使TI官网上也没什么可靠资料,心里还是有些忐忑的,结果在实现过程中发现意外的简单,所以把过程写下来,希望有相似需求的同行可以少走弯路。
注意:阅读本文要求具备一定的linux设备驱动开发经验,如果您从没有做过linux驱动开发,那么阅读本文时可能会有一定的困难。
文章基于TI提供的Linux SDK 3.0。
1. 引脚配置
引脚配置分两块:FSMC引脚配置和外部DMA请求引脚配置。这里建议大家到TI网站上下载它的pinmux工具,点点鼠标就可以生成devicetree,非常直观简单,所以就不展开讲了。
2. 外部DMA请求形式
在TI的处理器手册上没有找到外部DMA引脚请求形式,不过一般来说不外乎上升沿或下降沿两种,所以我偷了个懒,使用一个1us宽度的正脉冲来提交DMA请求。
3. crossbar配置
crossbar的配置可以参照Linux内核文档Documentation/devicetree/bindings/dma/ti-dma-crossbar.txt。我使用了DMA Channel 58和Transfer Controller 1,所以我的devicetree文件有如下内容:
|
dmas=<&edma_xbar 58 1 28>; |
TI的EDMA Engine会根据上面这行内容为你配置好crossbar,几乎不需要在你自己的驱动里做任何工作。
4. linux下的DMA驱动程序框架
linux DMA驱动程序框架文档位于linux内核目录树下Documentation/dmaengine,主要看client.txt就可以了。在这篇文档里说明了该如何使用DMA Engine的API。原则上来说,只要根据这篇文档所述内容编程,就可以搞定了。另外我还参考了drivers/crypto/omap-aes.c,这个驱动也使用了DMA。不过针对具体的TI DMA控制器,这里还是有一些补充说明:
- addr_width:这个根据你外设情况设置。我的是16位ADC,所以我设置为DMA_SLAVE_BUSWIDTH_2_BYTES。
- maxburst:这个可设置为当你提交DMA请求时的可用数据量。我的FPGA里放了一个1k的FIFO,在累积到512数据点时提交DMA请求,所以将maxburst设置为512。maxburst的单位依据addr_width设定。比如addr_width是2bytes,那么一个burst就是512个数据点,或1024字节。
- 不同的DMA控制器需要厂家实现自己的dmaengine底层,TI的底层实现在drivers/dma/edma.c。
- 如果你将maxburst设置为1,TI的驱动将使用A Sync方式驱动EDMA;若maxburst大于1,就使用AB Sync方式。不管是哪种方式,acnt都等于addr_width所设定的数据量。
5. 嗯,就只有这么多了。
在linux下使用am335x的DMA的更多相关文章
- (转载)linux下各个文件夹的作用
linux下的文件结构,看看每个文件夹都是干吗用的/bin 二进制可执行命令 /dev 设备特殊文件 /etc 系统管理和配置文件 /etc/rc.d 启动的配置文件和脚本 /home 用户主目录的基 ...
- linux 下各文件夹的功能性介绍。(转载)
原文来自:http://www.cnblogs.com/wen858636827/archive/2012/12/26/2834373.html /opt 放置用户自己下载的软件 英文全称是op ...
- 【收集整理】Linux下的目录讲解
Linux下的目录介绍:在Linux系统中,一切东西都是存放在一个唯一的“虚拟文件系统”中的,这个“虚拟文件系统”是树状的结构以一个根目录开始.以文件来表示所有逻辑实体和非逻辑实体,逻辑实体指文件和目 ...
- linux下各文件夹的结构说明及用途介绍
linux下各文件夹的结构说明及用途介绍: /bin:二进制可执行命令. /dev:设备特殊文件. /etc:系统管理和配置文件. /etc/rc.d:启动的配 置文件和脚本. /ho ...
- C语言高级应用---操作linux下V4L2摄像头应用程序
我们都知道,想要驱动linux下的摄像头,其实很简单,照着V4L2的手册一步步来写,很快就可以写出来,但是在写之前我们要注意改变系统的一些配置,使系统支持framebuffer,在dev下产生fb0这 ...
- Linux下Power Management开发总结
本文作为一个提纲挈领的介绍性文档,后面会以此展开,逐渐丰富. 1. 前言 在 <开发流程>中介绍了PM开发的一般流程,重点是好的模型.简单有效的接口参数.可量化的测试环境以及可独性强的输出 ...
- Linux下,根据FHS定义出来的每个目录的作用
(下表摘自<鸟哥的Linux的私房菜>) 在Linux下,根据FHS定义出来的每个目录应该放置的档案内容为: 目录 应放置档案内容 / 根目录 root (/),一般建议在根目录底下只接目 ...
- Linux 下各个目录的作用及内容
在 Linux 下,我们看到的是文件夹(目录): 在早期的 UNIX 系统中,各个厂家各自定义了自己的 UNIX 系统文件目录,比较混乱.Linux 面世不久后,对文件目录进行了标准化,于1994年对 ...
- Linux下dmesg命令处理故障和收集系统信息的7种用法
目录: <syslog之一:Linux syslog日志系统详解> <syslog之二:syslog协议及rsyslog服务全解析> <syslog之三:建立Window ...
随机推荐
- Angular 201703
$http vm.auth = function() { return $http({ method: 'POST', url: 'sys/auth.json' }) } service.auth() ...
- BFS广度优先搜索 炸弹人
题面:一个人在一个坐标放炸弹,请问可以可以杀死的敌人数目最大是,并且输出该点的坐标 G代表敌人 .代表该位置可以走 "#"代表该位置存在障碍物 并且防止炸弹的蔓13 13 3 3 ...
- 实验吧—安全杂项——WP之 女神
点击链接下载压缩文件解压后得到 打开TXT文档: 能看出是base64,这么长,那就是转成图片喽~ 地址:http://www.vgot.net/test/image2base64.php? 然后就是 ...
- MySQL数据库-表内容操作
1.表内容增加 insert into 表 (列名,列名...) values (值,值,值...); 添加表内容添加一条数据 insert into 表 (列名,列名...) values (值,值 ...
- auto sudo password in shell
here is the example how to implement the auto password in shell script. Echo yourpasswordhere | sudo ...
- windows 8,关闭随意窗体都提示“已停止工作”的解决的方法
电脑用的好好的,突然出现了关闭随意窗体都提示"已停止工作",每次都是这样.想想也就是偶尔优化一下,近期也没有改动过什么系统设置呀,突然想到昨晚JLink_V8固件丢失 ...
- Python 学习书籍推荐
谁会成为AI 和大数据时代的第一开发语言? 这本已是一个不需要争论的问题.如果说三年前,Matlab.Scala.R.Java 和 Python还各有机会,局面尚且不清楚,那么三年之后,趋势已经非常明 ...
- 手动部署etcd-2018-0731
手动部署很简单,这里花了10分钟搞定 部署etcd 3台机器 etcd:由于 raft 算法的特性,集群的节点数必须是奇数 [root@linux-node1 ~]# cat /etc/hosts 1 ...
- git 项目配置用户名、邮箱的方法
git 项目配置用户名.邮箱的方法 单个仓库里,配置用户名.邮箱: git config user.name "姓名" git config user.email "邮箱 ...
- git忽略已提交的文件或目录
项目中的某个文件或目录已经被commit,并push到远程服务器server了. 这时发现要忽略该文件或目录,在.gitignore文件里面添加规则已经不起作用了.因为.gitignore只对从来没有 ...