grebenkoff 0 2 июля, 2015 Опубликовано 2 июля, 2015 (изменено) · Жалоба Приветствую уважаемые! Осваиваю тему написания драйверов устройств под 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 в данном контексте? Изменено 2 июля, 2015 пользователем Gleb80 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 2 июля, 2015 Опубликовано 2 июля, 2015 · Жалоба DMA-отображения бывают двух типов: Потоковые (Streaming) Согласованные (Coherent или Сonsistent) Согласованные отображение гарантировано доступны одновременно и процессору и устройству. И при доступе каждая из сторон гарантировано получит "свежие" данные. Чаще всего используются для долгоживущих буферов, например, когда буфер существует на протяжении всей жизни драйвера. Пример использование -- память фреймбуфера. При использовании потоковых отображений доступ возможен строго по очереди. Чаще всего создаются на время одной операции. Теоретически, могут быть более производительными. Пример использования -- приём/отправка сетевых пакетов. Уточню, что через dma_set_mask() и схожие функции Вы сообщаете ядру, с какими адресами может работать Ваше устройство, а ядро отвечает, возможен ли DMA для такой маски. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
grebenkoff 0 3 июля, 2015 Опубликовано 3 июля, 2015 · Жалоба Здравствуйте Des333 Благодарю за ответ, внесли ясность в сознание. Изучаю kernel.org/Documentation на эту тему, но там столько всего, что разом трудно в голове создать цельную картину. Ведь это Ваши статьи на хабре? http://habrahabr.ru/company/metrotek/blog/235707/ http://habrahabr.ru/company/metrotek/blog/248145/ Использую их как наглядное пособие, очень облегчают вход в тему. За них отдельное спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 4 июля, 2015 Опубликовано 4 июля, 2015 · Жалоба Не за что. Да, мои. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dimidrol 0 6 июля, 2015 Опубликовано 6 июля, 2015 · Жалоба В продолжении темы, если позволите. Есть задача передавать данные посредством DMA Linux из памяти DDR во внешнее устройство и назад. Столкнулся с проблемой, что не могу принять более 128Кбайт данных от устройства, когда как в устройство данных отсылаются хорошо. Для моего контроллера DMA важно, что бы буфер в памяти лежал физически непрерывно. Для этого выделил системе CMA область, для инициализации буфера использую функцию dmam_alloc_coherent(). Через символьное устройство имею доступ к этим буферам. На передачу очень похоже что все работает (вижу внутрисистемным аппаратным отладчиком). А вот на прием данных в буфер DDR записывается только первые 128Кбайт. Какой здесь может быть подвох? P.S. Если кого-нибудь не затруднит, можете взглянуть на модуль ядра, который я использую. http://forums.xilinx.com/xlnx/attachments/...3/1/dma_proxy.c Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
grebenkoff 0 7 июля, 2015 Опубликовано 7 июля, 2015 · Жалоба не могу принять более 128Кбайт данных от устройства а это может быть как-то связано с размером страницы виртуальной памяти, которую выделяет ОС? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
grebenkoff 0 7 июля, 2015 Опубликовано 7 июля, 2015 · Жалоба Появился еще один вопрос: В этой статье http://habrahabr.ru/company/metrotek/blog/248145/ говорится, чтобы драйвер заработал, нужно добавить вот такой код в DTS: fpga { compatible = "mtk,etn"; interrupts = <0x0 0x28 0x1>; }; непонятно назначение цифр в поле interrupts = <0x0 0x28 0x1>; вроде бы номера прерываний от FPGA начинаются с 72... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 15 июля, 2015 Опубликовано 15 июля, 2015 · Жалоба непонятно назначение цифр в поле interrupts = <0x0 0x28 0x1>; вроде бы номера прерываний от FPGA начинаются с 72... http://billauer.co.il/blog/2012/08/irq-zynq-dts-cortex-a9/ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 15 июля, 2015 Опубликовано 15 июля, 2015 · Жалоба непонятно назначение цифр в поле interrupts = <0x0 0x28 0x1>; вроде бы номера прерываний от FPGA начинаются с 72... http://billauer.co.il/blog/2012/08/irq-zynq-dts-cortex-a9/ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться