如何将DMA运用在LCDu盘显示请将磁盘上

2012年5月 Linux/Unix社区大版内专家分月排行榜第三2010年10月 Linux/Unix社区大版内专家分月排行榜第三2010年2月 Linux/Unix社区大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。[zz]DMA使用的几个概念,burst
一般芯片的dma有基本功能。
1、普通的内存、外设间互传数据,一次性的。
2、支持链表的,美其名曰“scatter”,内核有struct
scatter可以参考。
说一下注意点:
dma有burst、burst size、transfer的概念:
dma实际上是一次一次的申请总线,把要传的数据总量分成一个一个小的数据块。比如要传64个字节,那么dma内部可能分为2次,一次传
64/2=32个字节,这个2(a)次呢,就叫做burst。这个burst是可以设置的。这32个字节又可以分为32位 *
8或者16位*16来传输。
transfer size:
就是数据宽度,比如8位、32位,一般跟外设的FIFO相同。
burst size:
就是一次传几个 transfer size.
现在我配置数据宽度为32位。一次传8个32位=32个字节。
那么如果总长度为128字节,那么实际dma设置的长度为 128/32 = 4.
可能讲的不是很清楚。自己配置一遍就明白了。
————————————————————————
先理解cache的作用
CPU在访问内存时,首先判断所要访问的内容是否在Cache中,如果在,就称为“命中(hit)”,此时CPU直接从Cache中调用该内容;否则,就
不命中”,CPU只好去内存中调用所需的子程序或指令了。CPU不但可以直接从Cache中读出内容,也可以直接往其中写入内容。由于Cache的存取速
率相当快,使得CPU的利用率大大提高,进而使整个系统的性能得以提升。
Cache的一致性就是直Cache中的数据,与对应的内存中的数据是一致的。
DMA是直接操作总线地址的,这里先当作物理地址来看待吧(系统总线地址和物理地址只是观察内存的角度不同)。如果cache缓存的内存区域不包括DMA分配到的区域,那么就没有一致性的问题。但是如果cache缓存包括了DMA目的地址的话,会出现什么什么问题呢?
问题出在,经过DMA操作,cache缓存对应的内存数据已经被修改了,而CPU本身不知道(DMA传输是不通过CPU的),它仍然认为cache中的数
据就是内存中的数据,以后访问Cache映射的内存时,它仍然使用旧的Cache数据。这样就发生Cache与内存的数据“不一致性”错误。
题外话:好像2.6.29内核中,6410的总线地址和物理地址是一样的,因为我在查看vir_to_bus函数的时候,发现在/arch/arm/linux/asm/memory.h中这样定义:&
#ifndef __virt_to_bus
__virt_to_bus&&&
__virt_to_phys
__bus_to_virt&&&
__phys_to_virt
而且用source
Insight搜索了一遍,没有发现6410相关的代码中,重新定义__vit_to_bus,因此擅自认为2.6内核中,6410的总线地址就是物理地址。希望高手指点。
顺便提一下,总线地址是从设备角度上看到的内存,物理地址是CPU的角度看到的未经过转换的内存(经过转换的是虚拟地址)
由上面可以看出,DMA如果使用cache,那么一定要考虑cache的一致性。解决DMA导致的一致性的方法最简单的就是禁止DMA目标地址范围内的cache功能。但是这样就会牺牲性能。
因此在DMA是否使用cache的问题上,可以根据DMA缓冲区期望保留的的时间长短来决策。DAM的映射就分为:一致性DMA映射和流式DMA映射。
一致性DMA映射申请的缓存区能够使用cache,并且保持cache一致性。一致性映射具有很长的生命周期,在这段时间内占用的映射寄存器,即使不使用也不会释放。生命周期为该驱动的生命周期
流式DMA映射实现比较复杂,因为没具体了解,就不说明了。只知道种方式的生命周期比较短,而且禁用cache。一些硬件对流式映射有优化。建立流式DMA映射,需要告诉内核数据的流动方向。
因为LCD随时都在使用,因此在Frame buffer驱动中,使用一致性DMA映射
上面的代码中用到&dma_alloc_writecombine函数,另外还有一个一致性DMA映射函数dma_alloc_coherent
两者的区别在于:
查看两者的源代码&
再结合网上的资料(不过我感觉那文章写的有些问题,我修改了一下),由上面代码可以看出,两个函数都调用了__dma_alloc函数,区别只在于最后一个参数。
dma_alloc_coherent 在 arm 平台上会禁止页表项中的 C (Cacheable) 域以及 B
(Bufferable)域。而 dma_alloc_writecombine 只禁止 C (Cacheable) 域.
&C 代表是否使用高速缓冲存储器, 而 B 代表是否使用写缓冲区。
这样,dma_alloc_writecombine 分配出来的内存不使用缓存,但是会使用写缓冲区。而
dma_alloc_coherent& 则二者都不使用。
C B 位的具体含义
<font COLOR="#FF 无cache,无写缓冲;任何对memory的读写都反映到总线上。对
memory 的操作过程中CPU需要等待。
0 1 无cache,有写缓冲;读操作直接反映到总线上;写操作,CPU将数据写入到写缓冲后继续运行,由写缓冲进行写回操作。
1 0 有cache,写通模式;读操作首先考虑cache hit;写操作时直接将数据写入写缓冲,如果同时出现cache
hit,那么也更新cache。
1 1 有cache,写回模式;读操作首先考虑cache hit;写操作也首先考虑cache hit。
这样,两者的区别就很清楚了。&
A&= dma_alloc_writecombine(struct device *dev,
size_t&size,dma_addr_t *handle,
gfp_t&gfp);
A&&&&&&&&&
: 内存的虚拟起始地址,在内核要用此地址来操作所分配的内存
: 可以平台初始化里指定,主要是用到dma_mask之类参数,可参考framebuffer
: 实际分配大小,传入dma_map_size即可
handle: 返回的内存物理地址,dma就可以用。
A和hanle是一一对应的,A是虚拟地址,而handle是总线地址。对任意一个操作都将改变写缓冲区内容。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。查看: 1002|回复: 6
探索者F4开发板中摄像头实验是怎么把图像显示在LCD上的?
主题帖子精华
新手上路, 积分 28, 距离下一级还需 22 积分
在线时间0 小时
我想通过OV2640采集图像,二值化之后显示在LCD上面,但是看了摄像头实验的程序,没有看懂,图像是怎么显示到LCD上的?能读出图像数据吗?能不能给把相关的程序解释一下啊?谢谢
13:23 上传
点击文件名下载附件
7.03 MB, 下载次数: 191
获取OV2640的数据&直接DMA到LCD上的
主题帖子精华
在线时间995 小时
获取OV2640的数据&直接DMA到LCD上的
开往春天的手扶拖拉机
主题帖子精华
新手上路, 积分 28, 距离下一级还需 22 积分
在线时间0 小时
回复【2楼】zuozhongkai:
---------------------------------
DMA怎么读数据的?是把数据存到某个地址里面吗?
主题帖子精华
新手上路, 积分 28, 距离下一级还需 22 积分
在线时间0 小时
有没有人能提供点建议或者参考的?谢谢
主题帖子精华
在线时间995 小时
回复【4楼】miaochengshi:
---------------------------------
看我们的例程开发手册啊!
开往春天的手扶拖拉机
主题帖子精华
新手上路, 积分 28, 距离下一级还需 22 积分
在线时间0 小时
回复【5楼】zuozhongkai:
---------------------------------
看了手册,还不知道该去读哪一个数组
主题帖子精华
在线时间503 小时
开启DCMI的DMA&到LCD
Powered byADC采样+DMA传输到USART&LCD_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
ADC采样+DMA传输到USART&LCD
你可能喜欢K60 DMA读取OV7620+外部SRAM+3.2寸LCD全屏显示图像 - ARM Cortex-M系列产品 - 恩智浦技术社区
后使用快捷导航没有帐号?
查看: 3126|回复: 5
K60 DMA读取OV7620+外部SRAM+3.2寸LCD全屏显示图像
该用户从未签到主题帖子积分
本帖最后由 yandld-362878 于
23:06 编辑
& && && && &本帖最后由 yandld 于
15:00 编辑
& && && && &
& && && && &最新需要给新板子做个摄像头的demo,选择了智能车常用的OV7620(黑白灰度输出,320*240,16MS一场中断)
& && && && &
& && && && &关于OV7620:
& && && && &OV7620 不进行任何I2C配置时的出厂频率
& && && && &图像分辨率:240*320
& && && && &场中断(href) 16MS 一次
& && && && &行中断(vsync) 64US一次
& && && && &像素中断(pclk) 频率 12.5M
& && && && &
& && && && &
& && && && &OV7620 行中断,场中断 和 像素中断 时序图
& && && && &
& && && && &
& && && && &
& && && && &程序目的是为了最大限度的解放CPU,CPU只有在一场结束时才切入处理,提取摄像头buffer ,把OV7620的图像打在LCD上显示
& && && && &基本思路:
& && && && &1. 行中断触发DMA读取OV7620数据口(8个数据端口接到PORT A7-15上),每次MinorLoop传输320字节,
& && && && &MajorLoop 执行240次,这样仅仅靠DMA就可以完全自动的完成一场数据传输。无需行中断处理。
& && && && &
& && && && &2. DMA 源地址当然是摄像头数据端口,目的地址是外部SRAM,触发源是OV7620行同步信号,
& && && && &也就是说DMA直接把数据从DMA搬到外部SRAM上。
& && && && &
& && && && &3. 每当一场采集完成,触发场中断,CPU介入处理,执行用户回调函数,复位DMA,
& && && && &用一个简单的状态机等待下一场到来之后,再启动DMA开始传输。
& && && && &
& && && && &
& && && && &最终效果:
& && && && &
& && && && && && && && &&&
& && && && && && && && &[size=0.83em]& && && && &DSCF8316.JPG (152.27 KB, 下载次数: 2)
& && && && &
& && && && &[color=#999999 !important]半小时前 上传
& && && && &
& && && && &
& && && && &
& && && && && && && && &
& && && && &
& && && && &软硬件平台:
& && && && &硬件: 超核K60 渡鸦 开发板
& && && && &软件 下载: 代码直接作为超核V2.5开发包的一部分
& && && && &地址:&&http://git.oschina.net/yandld/CH-K-Lib
& && && && &
& && && && &使用:
& && && && &在board.h中修改OV7620所对应的BSP配置(端口号引脚好等等)。然后打开串口终端,115200波特率,
& && && && &先输入命令&FLEXBUS&(支持TAB自动补全哦~~)。然后再输入”OV7620“
& && && && &这里还有一个视频,里面介绍了使用方法:
& && && && &
& && && && &
& && && && &
& && && && &需要改进的地方:
& && && && &1. 场中断仍然需要CPU处理,再以后的设计中,看看能不能把场中断也节约掉.比如用DMA中断之类的。其实也差不多
& && && && &。。感觉场中断是省不掉了。。
& && && && &
& && && && &2. 对LCD实在没啥研究,本来想开窗直接DMA传送到LCD上显示的(不知道会比现在快多少倍。。),
& && && && &但是由于时间所限,就泡汤了。。就算当练习了一下Flexbus 驱动外部SRAM吧。。
& && && && &
& && && && &3. 对于外部SRAM,没有写内存管理malloc 和 free。 只是简单的直接取地址了。后面争取加上。。
& && && && &
该用户从未签到主题帖子积分
RE:K60 DMA读取OV7620+外部SRAM+3.2寸LCD全屏显示图像
字儿太小了
该用户从未签到主题帖子积分
RE:K60 DMA读取OV7620+外部SRAM+3.2寸LCD全屏显示图像
看不见图片,字也好小,不过还是感谢楼主分享。
该用户从未签到主题帖子积分
新手上路, 积分 6, 距离下一级还需 44 积分
新手上路, 积分 6, 距离下一级还需 44 积分
楼主你好,我把你的程序改了一下,场中断后将图像用串口发到上位机,但是图像只能采集到一角。求教原因,谢谢。
该用户从未签到主题帖子积分
新手上路, 积分 10, 距离下一级还需 40 积分
新手上路, 积分 10, 距离下一级还需 40 积分
lz,为什么 不能下载啊?
该用户从未签到主题帖子积分
迁移到 oschina 上了。
站长推荐 /2
如果说大家前几次的活动都没有拿到社区送出的LPC54114板卡的话,那这次机会就来啦~
所谓的Bonus指的就是这个活动啦~
废话不多说,我们马上进入正题。本次活动将再次开放LPC54114(lite)这块板卡的申请!既然是隐藏福利,那自然不会太难!
兄弟网站、与非网旗下Bom2buy送福利~
体验Bom2buy的器件查询和Bom批量查询功能,填写问卷即可抽取大奖!还有50元优惠券等你来拿!
Tel: 3-8069
版权所有@苏州灵动帧格网络科技有限公司
Powered by

我要回帖

更多关于 itunes显示将要安装 的文章

 

随机推荐