Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: не получатся замапить DMA буфер
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > Linux
AlexMatyu
В модуле выделяется память для 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
Tarbal
Цитата(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 возвращает оба адреса и виртуальный как возвращаемое значение и физический в параметрах.
AlexMatyu
Цитата(Tarbal @ Nov 5 2015, 17:12) *
Нет необходимости замапивать. dma_alloc_coherent возвращает оба адреса и виртуальный как возвращаемое значение и физический в параметрах.


А как же мне тогда достучаться до буфера из пространства пользователя?
Tarbal
Цитата(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/


Насколько я понимаю, вы должны сделать аллокацию буфера в пространстве пользователя и передать указатель на буфер как параметр системного вызова, а в драйвере (ядре) просто скопировать буфер.
AlexMatyu
Цитата(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/


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



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


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

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

Исходники есть на github, ссылка на них -- в статье.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.