Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Device driver + DMA
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > Linux
Gleb80
Приветствую уважаемые! Осваиваю тему написания драйверов устройств под Linux с использованием DMA. Читаю документацию по DMA API. Там есть такие слова:
The query for streaming mappings is performed via a call to
dma_set_mask():

int dma_set_mask(struct device *dev, u64 mask);

The query for consistent allocations is performed via a call
to dma_set_coherent_mask():

int dma_set_coherent_mask(struct device *dev, u64 mask);

В целом понятно, что функции проверяют способность DMA аппаратуры работать с адресами, маска которых передается в параметре mask. Но мне не понятно следующее:
1. Что подразумевается под streaming mappings и под consistent allocations?
2. В чем различие этих двух ф-ций?
3. Что значит слово coherent в данном контексте?
des333
DMA-отображения бывают двух типов:
  • Потоковые (Streaming)
  • Согласованные (Coherent или Сonsistent)

Согласованные отображение гарантировано доступны одновременно и процессору и устройству.
И при доступе каждая из сторон гарантировано получит "свежие" данные.
Чаще всего используются для долгоживущих буферов, например, когда буфер существует на протяжении всей жизни драйвера.
Пример использование -- память фреймбуфера.

При использовании потоковых отображений доступ возможен строго по очереди.
Чаще всего создаются на время одной операции.
Теоретически, могут быть более производительными.
Пример использования -- приём/отправка сетевых пакетов.


Уточню, что через dma_set_mask() и схожие функции Вы сообщаете ядру, с какими адресами может
работать Ваше устройство, а ядро отвечает, возможен ли DMA для такой маски.
Gleb80
Здравствуйте Des333
Благодарю за ответ, внесли ясность в сознание.
Изучаю kernel.org/Documentation на эту тему, но там столько всего, что разом трудно в голове создать цельную картину.
Ведь это Ваши статьи на хабре?
http://habrahabr.ru/company/metrotek/blog/235707/
http://habrahabr.ru/company/metrotek/blog/248145/
Использую их как наглядное пособие, очень облегчают вход в тему.
За них отдельное спасибо.


des333
Не за что.
Да, мои.
dm.pogrebnoy
В продолжении темы, если позволите. Есть задача передавать данные посредством DMA Linux из памяти DDR во внешнее устройство и назад. Столкнулся с проблемой, что не могу принять более 128Кбайт данных от устройства, когда как в устройство данных отсылаются хорошо. Для моего контроллера DMA важно, что бы буфер в памяти лежал физически непрерывно. Для этого выделил системе CMA область, для инициализации буфера использую функцию dmam_alloc_coherent().
Через символьное устройство имею доступ к этим буферам. На передачу очень похоже что все работает (вижу внутрисистемным аппаратным отладчиком). А вот на прием данных в буфер DDR записывается только первые 128Кбайт. Какой здесь может быть подвох?

P.S. Если кого-нибудь не затруднит, можете взглянуть на модуль ядра, который я использую. http://forums.xilinx.com/xlnx/attachments/...3/1/dma_proxy.c
Gleb80
Цитата(dm.pogrebnoy @ Jul 6 2015, 17:51) *
не могу принять более 128Кбайт данных от устройства


а это может быть как-то связано с размером страницы виртуальной памяти, которую выделяет ОС?
Gleb80
Появился еще один вопрос:

В этой статье
http://habrahabr.ru/company/metrotek/blog/248145/
говорится, чтобы драйвер заработал, нужно добавить вот такой код в DTS:

Код
fpga {
    compatible = "mtk,etn";
    interrupts = <0x0 0x28 0x1>;
};


непонятно назначение цифр в поле interrupts = <0x0 0x28 0x1>;
вроде бы номера прерываний от FPGA начинаются с 72...
des333
Цитата(Gleb80 @ Jul 7 2015, 20:28) *
непонятно назначение цифр в поле interrupts = <0x0 0x28 0x1>;
вроде бы номера прерываний от FPGA начинаются с 72...


http://billauer.co.il/blog/2012/08/irq-zynq-dts-cortex-a9/
des333
Цитата(Gleb80 @ Jul 7 2015, 20:28) *
непонятно назначение цифр в поле interrupts = <0x0 0x28 0x1>;
вроде бы номера прерываний от FPGA начинаются с 72...


http://billauer.co.il/blog/2012/08/irq-zynq-dts-cortex-a9/
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.