Jump to content

    

не получатся замапить DMA буфер

В модуле выделяется память для 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

2015_11_05_11_46_44.jpg

Edited by AlexMatyu

Share this post


Link to post
Share on other sites
В модуле выделяется память для 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

2015_11_05_11_46_44.jpg

 

Нет необходимости замапивать. dma_alloc_coherent возвращает оба адреса и виртуальный как возвращаемое значение и физический в параметрах.

Share this post


Link to post
Share on other sites
Нет необходимости замапивать. dma_alloc_coherent возвращает оба адреса и виртуальный как возвращаемое значение и физический в параметрах.

 

А как же мне тогда достучаться до буфера из пространства пользователя?

Share this post


Link to post
Share on other sites
А как же мне тогда достучаться до буфера из пространства пользователя?

 

Никак ни в первом ни во втором случае. Вот почитайте как это делается:

https://www.quora.com/Linux-Kernel/How-does...py_to_user-work

По-русски:

https://www.ibm.com/developerworks/ru/libra...-memory-access/

 

 

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

Edited by Tarbal

Share this post


Link to post
Share on other sites
Никак ни в первом ни во втором случае. Вот почитайте как это делается:

https://www.quora.com/Linux-Kernel/How-does...py_to_user-work

По-русски:

https://www.ibm.com/developerworks/ru/libra...-memory-access/

 

 

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

 

 

Спасибо!

Share this post


Link to post
Share on other sites
А как же мне тогда достучаться до буфера из пространства пользователя?

 

Вот в этой статье:

http://habrahabr.ru/company/metrotek/blog/263571/

 

Я пишу, как написать примитивный драйвер фреймбуфера.

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

 

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this