Jump to content

    

Xilinx linux + SDK + dma driver

Здравствуйте!

Можно ли в Xilinx SDK (v2018.1) написать приложение для работы с AXI-DMA для ОС Linux? Как настроить SDK, чтобы не появлялось вопросов рядом с #include<something.h>? И как прописать пути для того, чтобы суметь подключить linux/dmaengine.h (при компиляции приложения пишет, что нет такого файла)?

Собрала для zedboard linux_xlnx с Xilinx git, запустила, все работает. В SDK указала репозитории для device-tree-xlnx и linux_xlnx. Хочу написать приложение, которое позволяло бы инициировать прием данных через AXI-DMA. В моем device-tree прописан блок DMA и указаны драйверы в файле pl.dtsi:

/ {
    amba_pl: amba_pl {
        #address-cells = <1>;
        #size-cells = <1>;
        compatible = "simple-bus";
        ranges;
        axi_dma_0: dma@40400000 {
            #dma-cells = <1>;
            clock-names = "s_axi_lite_aclk m_axi_sg_aclk m_axi_s2mm_aclk";
            clocks = <&clkc 15>, <&clkc 15>;
            compatible = "xlnx,axi-dma-1.00.a";
            interrupt-names = "s2mm_introut";
            interrupt-parent = <&intc>;
            interrupts = <0 30 4>;
            reg = <0x40400000 0x10000>;
            xlnx,addrwidth = <0x20>;
            dma-channel@40400030 {
                compatible = "xlnx,axi-dma-s2mm-channel";
                dma-channels = <0x1>;
                interrupts = <0 30 4>;
                xlnx,datawidth = <0x20>;
                xlnx,device-id = <0x0>;
            };
        };
    };
};

В system-top.dts файл pl.dtsi подключен. SDK выдает вот такую ошибку (см картинку). И смущает еще одно - вопросы рядом с include.

SDK_error.png

1. Можно ли вообще написать в SDK приложение, работающее с axi-dma драйвером? Или надо как-то отдельно писать свой драйвер, который будет обращаться к axi-dma драйверу, и к которому сможет обращаться мое приложение?

2. Как убрать вопросы рядом с #include?

Edited by sheynmanyu

Share this post


Link to post
Share on other sites

Вообще я на своей плате смотрел dmesg и драйвер дма в петалинуксе вроде как присутствует

Вроде в TRM был описан пример как можно с дма работать

 

Насчет вопросов - скорей всего линкеру не хватает файлов - добавить нужные папки, я бы попробовал скормить ему путь к ядру

 

Очень интересен результат! Юлия, отпишитесь, пожалуйста, как это все поднимите

Share this post


Link to post
Share on other sites
Вообще я на своей плате смотрел dmesg и драйвер дма в петалинуксе вроде как присутствует

Вроде в TRM был описан пример как можно с дма работать

 

Очень интересен результат! Юлия, отпишитесь, пожалуйста, как это все поднимите

C Petalinux 2018 у меня возникли сложности: в SDK изменился компилятор для 32-разрядных arm. Дождалась, когда выйдет petalinux 2018.1, изменила в настройках ядра префикс для компилятора на arm-linux-gnueabihf-... В качестве префикса для кросс-компилятора указала его же: export CROSS_COMPILE=arm-linux-gnueabihf- и все собралось! :smile3046:

Edited by sheynmanyu

Share this post


Link to post
Share on other sites
Вообще я на своей плате смотрел dmesg и драйвер дма в петалинуксе вроде как присутствует

 

Пока столкнулась вот с такой проблемой:

root@zedboard_dma_linux:~# dmesg | grep dma

dma-pl330 f8003000.dmac: Loaded driver for PL330 DMAC-241330

dma-pl330 f8003000.dmac: DBUFF-128x8bytes Num_Chans-8 Num_Peri-4 Num_Events-16

ERROR: could not get clock /amba_pl/dma@40400000:m_axi_s2mm_aclk(2)

xilinx-vdma 40400000.dma: Xilinx AXI DMA Engine Driver Probed!!

Как устранить ошибку?

Share this post


Link to post
Share on other sites
Пока столкнулась вот с такой проблемой:

ERROR: could not get clock /amba_pl/dma@40400000:m_axi_s2mm_aclk(2)

попробуйте переписать с таким синтаксисом:

clock-names = "s_axi_lite_aclk", "m_axi_sg_aclk", "m_axi_mm2s_aclk", "m_axi_s2mm_aclk";

еще можно гуглю скормить строку ошибки или чуть проще "xilinx dma 40400000", там куча solved попадается..

Edited by Jury093

Share this post


Link to post
Share on other sites
попробуйте переписать с таким синтаксисом:

clock-names = "s_axi_lite_aclk", "m_axi_sg_aclk", "m_axi_mm2s_aclk", "m_axi_s2mm_aclk";

еще можно гуглю скормить строку ошибки или чуть проще "xilinx dma 40400000", там куча solved попадается..

Эмм, а в каком файле мне это переписать? Просто у меня сейчас petalinux, и я абсолютно без понятия, откуда он берет файлы, на основе которых потом генерирует systеm.dtb. Более того, в приведенном выше pl.dtsi меня смущает число каналов и число clk. Канала указано 3, а clk всего два. Во всех примерах, которые мне встречались, эти числа совпадают: каналов 3 и clk три. Более того, в дизайне режим SG вообще не включен. Откуда он его взял в pl.dtsi?

Да, сейчас pl.dtsi выглядит так:

/ {
    amba_pl: amba_pl {
        #address-cells = <1>;
        #size-cells = <1>;
        compatible = "simple-bus";
        ranges;
        axi_dma_0: dma@40400000 {
            #dma-cells = <1>;
            clock-names = "s_axi_lite_aclk", "m_axi_sg_aclk", "m_axi_s2mm_aclk";
            clocks = <&clkc 15>, <&clkc 15>;
            compatible = "xlnx,axi-dma-1.00.a";
            interrupt-names = "s2mm_introut";
            interrupt-parent = <&intc>;
            interrupts = <0 30 4>;
            reg = <0x40400000 0x10000>;
            xlnx,addrwidth = <0x20>;
            dma-channel@40400030 {
                compatible = "xlnx,axi-dma-s2mm-channel";
                dma-channels = <0x1>;
                interrupts = <0 30 4>;
                xlnx,datawidth = <0x20>;
                xlnx,device-id = <0x0>;
            };
        };
    };
};

Интересный вопрос: а для нормальной работы dmaengine SG должен быть включен? Есть у кого-нибудь под рукой ссылка на рабочий дизайн?

Edited by sheynmanyu

Share this post


Link to post
Share on other sites
Эмм, а в каком файле мне это переписать? Просто у меня сейчас petalinux, и я абсолютно без понятия, откуда он берет файлы, на основе которых потом генерирует systеm.dtb. Более того, в приведенном выше pl.dtsi меня смущает число каналов и число clk. Канала указано 3, а clk всего два. Во всех примерах, которые мне встречались, эти числа совпадают: каналов 3 и clk три. Более того, в дизайне режим SG вообще не включен. Откуда он его взял в pl.dtsi?

Да, сейчас pl.dtsi выглядит так:

понятно, просто в вашем исходном сообщение был фрагмент dts, собственно правка к нему и относилась..

судя по тому же инету вам надо поправить на 3, типа

clocks = <&clkc 15>, <&clkc 15>, <&clkc 15>;

и пересобрать либо отдельно dtb, либо (как у вас там устроено не знаю) ядро в комплекте с dtb

запросто может быть, что для вашего ядра этот драйвер broken, тут либо локальную доку шерстить, или в инете искать инфу/патчи

 

откуда берет? скорее всего в недрах пакета есть архив или ветка с шаблонами, оттуда и генерятся исходные dtsi, второй вариант - тянется стандартное ядро и на него накладывают патчи и создаются dtsi

попробуйте все же изменить pl.dtsi и обновить сборку, желательно без полной пересборки..

Share this post


Link to post
Share on other sites
откуда берет? скорее всего в недрах пакета есть архив или ветка с шаблонами, оттуда и генерятся исходные dtsi, второй вариант - тянется стандартное ядро и на него накладывают патчи и создаются dtsi

попробуйте все же изменить pl.dtsi и обновить сборку, желательно без полной пересборки..

я пробовала обновлять: не помогло. Банально не собралось. но когда я в дизайне разрешила scatter-gather (он, в общем-то, мне не очень нужен. Но раз драйвер просит...) - все собралось и заработало. И правильно сгенерировались файлы dtsi, и ошибок в dmesg не стало!

Но: не удается запустить на выполнение dmatest.

Правильно ли я понимаю? После ввода команды

root@simple_loop_dma:/sys/module# ls /sys/class/dma
dma0chan0  dma0chan2  dma0chan4  dma0chan6  dma1chan0
dma0chan1  dma0chan3  dma0chan5  dma0chan7  dma1chan1

появляется список dma-каналов. При этом каналы dma0chan* - это DMA PL330, то есть DMA из PS части, а dma1chan* - это AXI-DMA?

В /sys/module/ у меня есть и axidmatest и dmatest. При этом, в соответствии с https://www.kernel.org/doc/html/v4.15/drive...ne/dmatest.html мне удалось запустить на выполнение dmatest с каналом dma0chan*. Но для dma1chan* ничего не выходит. Тест не запускается.

В ответ на команду

root@simple_loop_dma:/# dmesg | grep dma

выводится

dma-pl330 f8003000.dmac: Loaded driver for PL330 DMAC-241330
dma-pl330 f8003000.dmac:        DBUFF-128x8bytes Num_Chans-8 Num_Peri-4 Num_Events-16
xilinx-vdma 40400000.dma: Xilinx AXI DMA Engine Driver Probed!

Как проверить работоспособность моего axi dma блока??? Подскажите, плиз!

Edited by sheynmanyu

Share this post


Link to post
Share on other sites
я пробовала обновлять: не помогло. Банально не собралось. но когда я в дизайне разрешила scatter-gather (он, в общем-то, мне не очень нужен. Но раз драйвер просит...) - все собралось и заработало. И правильно сгенерировались файлы dtsi, и ошибок в dmesg не стало!

так что в результате помогло - коррекция dts или разрешение "scatter-gather"?

 

api/dmaengine/dmatest.html"]https://www.kernel.org/doc/html/v4.15/drive...ne/dmatest.html[/url] мне удалось запустить на выполнение dmatest с каналом dma0chan*. Но для dma1chan* ничего не выходит. Тест не запускается.

а как не запускается? система виснет? в консоль что-нить пишет? натолкайте отладочных printf("я тут step1\n"); в исходник dmatest и попробуйте отловить, где валится софтина в момент работы с dma1chan

 

Как проверить работоспособность моего axi dma блока???

у меня такой системы нет, т.ч. только общие советы:

- проверьте, что необходимые ресурсы и права для dmaXchan присутствуют и одинаковые

- валидность прерываний, адресов блоков регистров

прерывания:

cat /proc/interrupts

блоки регистров

cat /proc/iomem

возможно тут:

http://www.wiki.xilinx.com/DMA+Drivers+-+Soft+IPs

есть что полезное

 

как наиболее вероятное, раз для канала0 работает, то не прописано или прописано неправильно все тоже для канала1

 

как версия - там тред с solved:

https://forums.xilinx.com/t5/Embedded-Linux...p/522755/page/6

"Ok, finally I have done it, by copying axi_dma_0 entry to system_user.dtsi changing xlnx,device-id of its second channel to <0x1> and changing "misc_clk_0" in it to "clkc 15"."

Edited by Jury093

Share this post


Link to post
Share on other sites

Как указать petalinux 2018.1, где лежат необходимые библиотеки?

Вот здесь предлагается приложение создавать с помощью Xilinx SDK, но необходимо прописать путь к sysroots/что-то там. Беда в том, что у меня эта папка в проекте пуста, даже после вызова команды petalinux-build -c rootfs. Как прописать пути к linux/delay.h и прочим include? где их вообще искать? :1111493779: :crying:

Edited by sheynmanyu

Share this post


Link to post
Share on other sites

Если сюда еще хоть кто-то заглядывает?..

Нашла в описании команду по созданию папки для SDK:

petalinux-build --sdk

и потом

petalinux-package --sysroot -s|--sdk <custom sdk path> -d|--dir <custom directory path

Есть надежда, что это то, что мне нужно. Но: на выполнение команды petalinux-build --sdk ушло больше 2-х часов! Это ведь что-то ненормальное?

Как сократить время??? ОС - Ubuntu 16.04 LTS на виртуальной машине. Свободного места на диске около 47 ГБ из 100. Petalinux 2018.1.

Edited by sheynmanyu

Share this post


Link to post
Share on other sites

Еще подкрутить параметры виртуалки в сторону увеличения производительности или наконец поставить линукс на нормальный комп

Share this post


Link to post
Share on other sites
Еще подкрутить параметры виртуалки в сторону увеличения производительности или наконец поставить линукс на нормальный комп

Эмм... А можно ли не снося убунту подкрутить виртуалку? Оперативка выделена почти вся. Вчера ругалась на нехватку места, но с тех пор я удалила около 6 ГБ...

Share this post


Link to post
Share on other sites

мне кажется что в таких процессах важен процессор

а можешь огласить характеристики своего компа?

 

и характиристики виртуальки - сколько там выделено ресурсов

Share this post


Link to post
Share on other sites
мне кажется что в таких процессах важен процессор

а можешь огласить характеристики своего компа?

 

и характиристики виртуальки - сколько там выделено ресурсов

Она ругается на оставшееся место на диске. Всего 100 ГБ, до запуска build --sdk оставалось около 30 ГБ. Перед выдачей ошибок система ругнулась на оставшиеся 700 МБ на жестком диске :maniac:

yulia@yulia-U:~/ZYNQ/xilinx_linux/my_projects/simple_loop/simple_loop_dma$ df -k -T

Filesystem Type 1K-blocks Used Available Use% Mounted on

udev devtmpfs 9734880 0 9734880 0% /dev

tmpfs tmpfs 1952248 9308 1942940 1% /run

/dev/sda1 ext4 80056152 73746076 2220376 98% /

tmpfs tmpfs 9761224 216 9761008 1% /dev/shm

tmpfs tmpfs 5120 4 5116 1% /run/lock

tmpfs tmpfs 9761224 0 9761224 0% /sys/fs/cgroup

VM_Shared_Folder vboxsf 567159508 50101244 517058264 9% /media/sf_VM_Shared_Folder

tmpfs tmpfs 1952248 56 1952192 1% /run/user/1000

 

И информация о директории с проектом petalinux

yulia@yulia-U:~/ZYNQ/xilinx_linux/my_projects/simple_loop/simple_loop_dma$ du ./build/ -h --max-depth=1

2,6M ./build/cache

1,1G ./build/sstate-cache

192K ./build/conf

4,5G ./build/downloads

740K ./build/misc

16G ./build/tmp

22G ./build/

 

Что из этого всего можно удалить, но не тратить при этом кучу времени на повторное скачивание при редактировании проекта?

Edited by sheynmanyu

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this