我想在linux下用DMA和我的硬件沟通
网络上很多教学文都是kmalloc一块内存大小
用dma_map_single 映射出一个DMA可使用的地址
这种方法我也试成功了
现在的问题是我有一笔资料要用我的硬件做运算
我已经知道这笔资料起始位置也确定资料是连续的
但是我把这个地址用dma_map_single会出现segment fault
我现在的做法是把要算的资料复制到一块kmalloc的内存
再用硬件算我刚刚复制的资料
这样是成功的
但是复制一份花了相当多的时间
我想知道已知memory address 可否直接用DMA
该怎么做
我的dma_map_single 跟 kmalloc 都是写在我硬件的driver中的ioctl
要算的资料是在main中产生
当要开始算的时候call ioctl
拜托各位高手救救我
kmalloc有大小限制,你提到花很多时间.我猜有可能爆掉
楼主: mikebenq (BenQ) 2014-04-30 18:38:00
我kmalloc一块内存将资料复制进去是成功的
楼主: mikebenq (BenQ) 2014-04-30 18:39:00
但是这么做感觉很浪费时间
楼主: mikebenq (BenQ) 2014-04-30 18:40:00
可以用原本的资料不用经过复制的程序吗?
作者:
askacis (ASKA)
2014-04-30 20:27:00vmalloc的位置应该不能拿来用DMA? 我记得不保证连续
作者:
askacis (ASKA)
2014-04-30 20:31:00只是说为什么你不一开始用就kmalloc来保存你的资料?
作者:
askacis (ASKA)
2014-04-30 20:33:00driver init时可以先kmalloc一块内存出来
作者:
askacis (ASKA)
2014-04-30 20:34:00如果资料来自userspace,可以用mmap让userspace可以直接到kmalloc出来的buffer,不需要ioctl送资料进driver~
作者:
mayasky ( )
2014-05-02 01:40:00实作你的IOREMAP,在DRIVER中MAP一段实体连续的给APP
作者:
mayasky ( )
2014-05-02 01:41:00说错..实作mmap
楼主: mikebenq (BenQ) 2014-05-02 12:05:00
感谢askacis跟mayasky的回复,这几天上网爬文已经实作出
楼主: mikebenq (BenQ) 2014-05-02 12:06:00
mmap,不过他的感觉是在kernel映射一块内存给user用
楼主: mikebenq (BenQ) 2014-05-02 12:07:00
所以我想运算的资料一定要写在mmap回传的address
楼主: mikebenq (BenQ) 2014-05-02 12:10:00
可是我想算的资料是一张图用opencv的函式cvLoadImage以及
楼主: mikebenq (BenQ) 2014-05-02 12:15:00
webcam传入,所以我无法指定要算资料的起始address
楼主: mikebenq (BenQ) 2014-05-02 12:17:00
请问各位高手这种问题要如何解决?小弟是第一次写driver
楼主: mikebenq (BenQ) 2014-05-02 21:30:00
是用memcpy()吗? 我现在就是使用这种方法,想请问一下还
楼主: mikebenq (BenQ) 2014-05-02 21:31:00
有更快的方法吗?因为这样感觉把内存复制感觉会慢很多
作者:
mayasky ( )
2014-05-03 02:35:00所以IMAGE的ADDRESS是LIBRARY决定的?
作者:
mayasky ( )
2014-05-03 02:37:00如果OPENCV是OPEN SOURCE...我会改OPENCV的配置MEM方式