реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> не получатся замапить DMA буфер
AlexMatyu
сообщение Nov 5 2015, 08:52
Сообщение #1





Группа: Участник
Сообщений: 8
Регистрация: 14-10-15
Пользователь №: 88 851



В модуле выделяется память для DMA транзакций через ioctl():
Код
kbuf = dma_alloc_coherent(NULL, CRU_DMA_BUF0_SIZE, &dma_handle, 0);

далее возвращается физический адрес в user space:
Код
ret = put_user(virt_to_phys(kbuf), (unsigned long __user *)arg/*адрес переменной dma_buf в приложении*/);

в приложении пытаюсь замапить эту область памяти:
Код
  
int fd = open("/dev/mem", O_RDWR|O_SYNC);
if(mmap_dma = (unsigned long*) mmap(NULL, CRU_DMA_BUF0_SIZE, PROT_READ, MAP_SHARED, fd, dma_buf))
printf("Can't mapping DMA buffer\n");

и попадаю в условие.
Люди добрые, что я делаю не так, где накуралесил?

Код
#define        CRU_DMA_BUF0_SIZE    (0x00800000)


dmesg


Сообщение отредактировал AlexMatyu - Nov 5 2015, 08:53
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Nov 5 2015, 17:12
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(AlexMatyu @ Nov 5 2015, 11:52) *
В модуле выделяется память для DMA транзакций через ioctl():
Код
kbuf = dma_alloc_coherent(NULL, CRU_DMA_BUF0_SIZE, &dma_handle, 0);

далее возвращается физический адрес в user space:
Код
ret = put_user(virt_to_phys(kbuf), (unsigned long __user *)arg/*адрес переменной dma_buf в приложении*/);

в приложении пытаюсь замапить эту область памяти:
Код
  
int fd = open("/dev/mem", O_RDWR|O_SYNC);
if(mmap_dma = (unsigned long*) mmap(NULL, CRU_DMA_BUF0_SIZE, PROT_READ, MAP_SHARED, fd, dma_buf))
printf("Can't mapping DMA buffer\n");

и попадаю в условие.
Люди добрые, что я делаю не так, где накуралесил?

Код
#define        CRU_DMA_BUF0_SIZE    (0x00800000)


dmesg


Нет необходимости замапивать. dma_alloc_coherent возвращает оба адреса и виртуальный как возвращаемое значение и физический в параметрах.
Go to the top of the page
 
+Quote Post
AlexMatyu
сообщение Nov 9 2015, 12:18
Сообщение #3





Группа: Участник
Сообщений: 8
Регистрация: 14-10-15
Пользователь №: 88 851



Цитата(Tarbal @ Nov 5 2015, 17:12) *
Нет необходимости замапивать. dma_alloc_coherent возвращает оба адреса и виртуальный как возвращаемое значение и физический в параметрах.


А как же мне тогда достучаться до буфера из пространства пользователя?
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Nov 9 2015, 13:35
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(AlexMatyu @ Nov 9 2015, 15:18) *
А как же мне тогда достучаться до буфера из пространства пользователя?


Никак ни в первом ни во втором случае. Вот почитайте как это делается:
https://www.quora.com/Linux-Kernel/How-does...py_to_user-work
По-русски:
https://www.ibm.com/developerworks/ru/libra...-memory-access/


Насколько я понимаю, вы должны сделать аллокацию буфера в пространстве пользователя и передать указатель на буфер как параметр системного вызова, а в драйвере (ядре) просто скопировать буфер.

Сообщение отредактировал Tarbal - Nov 9 2015, 13:35
Go to the top of the page
 
+Quote Post
AlexMatyu
сообщение Nov 9 2015, 14:35
Сообщение #5





Группа: Участник
Сообщений: 8
Регистрация: 14-10-15
Пользователь №: 88 851



Цитата(Tarbal @ Nov 9 2015, 13:35) *
Никак ни в первом ни во втором случае. Вот почитайте как это делается:
https://www.quora.com/Linux-Kernel/How-does...py_to_user-work
По-русски:
https://www.ibm.com/developerworks/ru/libra...-memory-access/


Насколько я понимаю, вы должны сделать аллокацию буфера в пространстве пользователя и передать указатель на буфер как параметр системного вызова, а в драйвере (ядре) просто скопировать буфер.



Спасибо!
Go to the top of the page
 
+Quote Post
des333
сообщение Nov 14 2015, 15:01
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079



Цитата(AlexMatyu @ Nov 9 2015, 15:18) *
А как же мне тогда достучаться до буфера из пространства пользователя?


Вот в этой статье:
http://habrahabr.ru/company/metrotek/blog/263571/

Я пишу, как написать примитивный драйвер фреймбуфера.
Там сделано то, что Вам нужно -- DMA буфер и доступ к нему из userspace.

Исходники есть на github, ссылка на них -- в статье.


--------------------
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 15th June 2025 - 21:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.03263 секунд с 7
ELECTRONIX ©2004-2016