[email protected] 0 5 ноября, 2015 Опубликовано 5 ноября, 2015 (изменено) · Жалоба В модуле выделяется память для 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 Изменено 5 ноября, 2015 пользователем AlexMatyu Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tarbal 4 5 ноября, 2015 Опубликовано 5 ноября, 2015 · Жалоба В модуле выделяется память для 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 возвращает оба адреса и виртуальный как возвращаемое значение и физический в параметрах. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
[email protected] 0 9 ноября, 2015 Опубликовано 9 ноября, 2015 · Жалоба Нет необходимости замапивать. dma_alloc_coherent возвращает оба адреса и виртуальный как возвращаемое значение и физический в параметрах. А как же мне тогда достучаться до буфера из пространства пользователя? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tarbal 4 9 ноября, 2015 Опубликовано 9 ноября, 2015 (изменено) · Жалоба А как же мне тогда достучаться до буфера из пространства пользователя? Никак ни в первом ни во втором случае. Вот почитайте как это делается: https://www.quora.com/Linux-Kernel/How-does...py_to_user-work По-русски: https://www.ibm.com/developerworks/ru/libra...-memory-access/ Насколько я понимаю, вы должны сделать аллокацию буфера в пространстве пользователя и передать указатель на буфер как параметр системного вызова, а в драйвере (ядре) просто скопировать буфер. Изменено 9 ноября, 2015 пользователем Tarbal Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
[email protected] 0 9 ноября, 2015 Опубликовано 9 ноября, 2015 · Жалоба Никак ни в первом ни во втором случае. Вот почитайте как это делается: https://www.quora.com/Linux-Kernel/How-does...py_to_user-work По-русски: https://www.ibm.com/developerworks/ru/libra...-memory-access/ Насколько я понимаю, вы должны сделать аллокацию буфера в пространстве пользователя и передать указатель на буфер как параметр системного вызова, а в драйвере (ядре) просто скопировать буфер. Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 14 ноября, 2015 Опубликовано 14 ноября, 2015 · Жалоба А как же мне тогда достучаться до буфера из пространства пользователя? Вот в этой статье: http://habrahabr.ru/company/metrotek/blog/263571/ Я пишу, как написать примитивный драйвер фреймбуфера. Там сделано то, что Вам нужно -- DMA буфер и доступ к нему из userspace. Исходники есть на github, ссылка на них -- в статье. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться