[問題] linux DMA問題

作者: mikebenq (BenQ)   2014-04-30 17:34:47
我想在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
拜託各位高手救救我
作者: alongalone (沿著孤單的路)   2014-04-30 18:03:00
kmalloc有大小限制,你提到花很多時間.我猜有可能爆掉
作者: alongalone (沿著孤單的路)   2014-04-30 18:04:00
有考慮試看看 vmalloc 嗎
作者: 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:00
vmalloc的位置應該不能拿來用DMA? 我記得不保證連續
作者: askacis (ASKA)   2014-04-30 20:31:00
只是說為什麼你不一開始用就kmalloc來保存你的資料?
作者: askacis (ASKA)   2014-04-30 20:33:00
driver 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
作者: alongalone (沿著孤單的路)   2014-05-02 21:21:00
把輸入的資料複製到mmap回傳的記憶體位置勒?
作者: 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方式

Links booklink

Contact Us: admin [ a t ] ucptt.com