Перейти к содержанию
    

не получатся замапить 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

Изменено пользователем 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

2015_11_05_11_46_44.jpg

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

По-русски:

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

 

 

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

Изменено пользователем Tarbal

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

По-русски:

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

 

 

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

 

 

Спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

 

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...