在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 ...
随机推荐
- ss server端配置
关于ss server的配置,可以参考一个网址 关于服务器的购买可以上VIRMACH购买 和本地安装ss类似,首先安装ss,pip install shadowsocks 配置服务器参数,vim /e ...
- Map集合与转化
|--Hashtable:底层是哈希表数据结构,是线程同步的.不可以存储null键,null值. |--HashMap:底层是哈希表数据结构,是线程不同步的.可以存储null键,null值.替代了Ha ...
- github如何删除新建仓库(致新手)
github作为开发人员的必备用具.那么,作为一个新手如何删除github中建立的仓库呢? 1.以删除My test为例
- 修改select样式
CSS就可以解决,原理是将浏览器默认的下拉框样式清除,然后应用上自己的,再附一张向右对齐小箭头的图片即可. select { /*Chrome和Firefox里面的边框是不一样的,所以复写了一下*/ ...
- vue elementui 写的一个后台管理页面模板
https://github.com/PanJiaChen/vue-element-admin
- centos 端口开放及关闭 【转】
之前有讲过公司新买的服务器使用的是CentOS 5.5,部署好Tomcat之后却发现输入114.80.*.*:8080(即ip:8080)却无法显示Tomcat默认的首页.因为以前部署在Win Ser ...
- gogs打造自己的git
推荐docker安装 //下载镜像 docker pull gogs/gogs // 创建容器 docker run -d --name=gogs -p 10022:22 -p 3000:3000 - ...
- 《DSP using MATLAB》Problem 5.5
代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...
- [工作记录] NDK: AKEYCODE_DEL not notified
https://code.google.com/p/android/issues/detail?id=42904#makechanges 我们游戏的输入系统是自己渲染(通过跨平台渲染接口)的. 首先有 ...
- skipper lua 添加luarocks 包管理
skipper 支持基于lua 的script 扩展,同时设计比较方便的filter模型,让我们可以方便 进行request.response的扩展,结合lua 社区的包我们可以快速的进行新功能的开发 ...