doom13 0 12 октября, 2016 Опубликовано 12 октября, 2016 · Жалоба Приветствую. Имеется плата zc706 Xilinx SoC ZYNQ-7000 с 2-хядерным ARM Cortex-A9. Пытаюсь разобраться, как работать с AXI DMA если системой управляет Linux (Petalinux). Драйвер AXI DMA изначально присутствует в системе (код драйвера Xilinx из исходников Petalinux и тестовый модуль в архиве), при старте система сообщает: xilinx-dma 40400000.dma: Xilinx AXI DMA Engine driver Probed!! Содержимое директории /sys/class/dma следующее: root@zynq:/lib/modules/4.0.0-xilinx/extra# cd /sys/class/dma/ root@zynq:/sys/class/dma# root@zynq:/sys/class/dma# root@zynq:/sys/class/dma# ls dma0chan0 dma0chan1 dma0chan2 dma0chan3 dma0chan4 dma0chan5 dma0chan6 dma0chan7 dma1chan0 root@zynq:/sys/class/dma# , как понял, dma1chan0 соответствует AXI DMA. Вопрос - как использовать драйвер Xilinx для управления работой AXI DMA (управлять GPIO через sysfs получилось)? Может оно мне и не нужно - убираем драйвер Xilinx из системы, делаем свой char module и всё работает? Спасибо. xilinx_dma.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 12 октября, 2016 Опубликовано 12 октября, 2016 · Жалоба Добавил в систему тестовый модуль axidmatest, в /sys/module появилась директория /sys/module/axidmatest. Попробовал стартануть, как описано в доке dmatest.txt из документации на ядро, но пишет: root@zynq:/# modprobe axidmatest modprobe: module axidmatest not found in modules.dep Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jury093 2 12 октября, 2016 Опубликовано 12 октября, 2016 · Жалоба Добавил в систему тестовый модуль axidmatest, в /sys/module появилась директория /sys/module/axidmatest. Попробовал стартануть, как описано в доке dmatest.txt из документации на ядро, но пишет: видимо вы собрали axidmatest.ko, скопируйте его к остальным модулям и запустите команду depmod -a имя вашего модуля должно появится в файле modules.dep для ручной загрузки можно insmod /путь-до-модуля/вашмодуль.ko или, если кошка лежит в текущем каталоге insmod ./вашмодуль.ko Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 13 октября, 2016 Опубликовано 13 октября, 2016 · Жалоба Этот модуль должен быть встроен в ядро, задаётся при конфигурации ядра. Драйвер xilinx_dma с которым пытаюсь разобраться стартует при загрузке системы. axidmatest - это пример использования этого драйвера (наверное) и должен присутствовать в скомпилированном ядре, тут не знаю должен ли запустится автоматом или необходима ручная загрузка. После компиляции в папке драйвера DMA (../build/linux/kernel/xlnx-4.0/drivers/dma/xilinx) файлы с расширением .ko отсутствуют, есть только .o В папке проекта build вообще отсутствуют файлы xilinx_dma.ko и axidmatest.ko. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jury093 2 13 октября, 2016 Опубликовано 13 октября, 2016 (изменено) · Жалоба Этот модуль должен быть встроен в ядро, задаётся при конфигурации ядра. Драйвер xilinx_dma с которым пытаюсь разобраться стартует при загрузке системы. axidmatest - это пример использования этого драйвера (наверное) и должен присутствовать в скомпилированном ядре, тут не знаю должен ли запустится автоматом или необходима ручная загрузка. После компиляции в папке драйвера DMA (../build/linux/kernel/xlnx-4.0/drivers/dma/xilinx) файлы с расширением .ko отсутствуют, есть только .o В папке проекта build вообще отсутствуют файлы xilinx_dma.ko и axidmatest.ko. давайте по порядку: 1. раз в dma/xilinx лежит "*.o", значит поддержку DMA вы включили в ядро (в менюконфиге: "*" - встроено в ядро "M" - собирать модулем) 2. как вы в ядро встраивали сборку "axidmatest"? обычный путь - положить в дерево драйверов сишник и прописать его в паре файлов для контроля в корне исходников ядра выполните cat .config | grep DMA и смотрите, что у вас там включено.. 3. в скрипте сборки ядра есть ли опция modules (возможно у вас отключена сборка *.ko - всякое бывает) ps у меня нет xilinx, поэтому советы общего плана.. Изменено 13 октября, 2016 пользователем Jury093 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 13 октября, 2016 Опубликовано 13 октября, 2016 · Жалоба давайте по порядку: 1. раз в dma/xilinx лежит "*.o", значит поддержку DMA вы включили в ядро (в менюконфиге: "*" - встроено в ядро "M" - собирать модулем) 2. как вы в ядро встраивали сборку "axidmatest"? обычный путь - положить в дерево драйверов сишник и прописать его в паре файлов В меню конфигурации ядра (см. рисунок) выбрал опцию DMA Test client for AXI DMA - в папке build/linux/kernel/xlnx-4.0/drivers/dma/xilinx появляется файл axidmatest.o, если убрать эту опцию, то axidmatest.o отсутствует. и смотрите, что у вас там включено.. andrei@andrei-pc:~/work/zc706/petalinux/zynq/subsystems/linux/configs/kernel$ cat config | grep DMA CONFIG_NEED_DMA_MAP_STATE=y CONFIG_HAVE_DMA_ATTRS=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_HAVE_DMA_API_DEBUG=y CONFIG_HAVE_GENERIC_DMA_COHERENT=y CONFIG_ARM_DMA_MEM_BUFFERABLE=y CONFIG_ZONE_DMA_FLAG=0 CONFIG_DMA_SHARED_BUFFER=y CONFIG_DMA_CMA=y CONFIG_SCSI_DMA=y CONFIG_VIDEOBUF2_DMA_CONTIG=y CONFIG_SND_DMAENGINE_PCM=y CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y CONFIG_DMADEVICES=y # CONFIG_DMADEVICES_DEBUG is not set # DMA Devices # CONFIG_DW_DMAC_CORE is not set # CONFIG_DW_DMAC is not set # CONFIG_DW_DMAC_PCI is not set CONFIG_PL330_DMA=y # CONFIG_FSL_EDMA is not set CONFIG_XILINX_DMA_ENGINES=y CONFIG_XILINX_AXIDMA=y CONFIG_XILINX_DMATEST=y # CONFIG_XILINX_VDMATEST is not set CONFIG_XILINX_AXICDMA=y # CONFIG_XILINX_CDMATEST is not set # CONFIG_XILINX_DPDMA is not set CONFIG_XILINX_VDMA=y # CONFIG_XILINX_ZYNQMP_DMA is not set # CONFIG_NBPFAXI_DMA is not set CONFIG_DMA_ENGINE=y CONFIG_DMA_OF=y # DMA Clients # CONFIG_ASYNC_TX_DMA is not set # CONFIG_DMATEST is not set # CONFIG_DMA_API_DEBUG is not set CONFIG_HAS_DMA=y Т.е. всё включено?! И драйвер xilinx_dma и axidmatest. 3. в скрипте сборки ядра есть ли опция modules (возможно у вас отключена сборка *.ko - всякое бывает) Если это оно CONFIG_MODULES=y, то есть. Пробовал собрать user module для GPIO - всё работает, есть и my_gpio.o и my_gpio.ko. второй успешно загружается командой insmod. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 25 октября, 2016 Опубликовано 25 октября, 2016 · Жалоба Приветствую. AXI DMA немного ожил. Но дохнет во время выполнения кода (код модуля ниже): pr_info("Waiting for completion...\n"); wait_for_completion_interruptible(&cmp); Вопрос, что сделано не так и чего не хватает для завершения функции wait_for_completion_interruptible? Ещё ядро генерит прерывание (см. рисунок), но система его почему-то не воспринимает? root@zynq:~# cat /proc/interrupts CPU0 CPU1 16: 0 0 GIC 27 gt 17: 0 0 GIC 43 ttc_clockevent 18: 3373 5106 GIC 29 twd 21: 43 0 GIC 39 f8007100.adc 141: 0 0 GIC 57 cdns-i2c 143: 0 0 GIC 35 f800c000.ocmc 144: 31 0 GIC 82 xuartps 145: 0 0 GIC 51 e000d000.spi 146: 1048 0 GIC 54 eth0 147: 1327 0 GIC 56 mmc0 148: 0 0 GIC 45 f8003000.dmac 149: 0 0 GIC 46 f8003000.dmac 150: 0 0 GIC 47 f8003000.dmac 151: 0 0 GIC 48 f8003000.dmac 152: 0 0 GIC 49 f8003000.dmac 153: 0 0 GIC 72 f8003000.dmac 154: 0 0 GIC 73 f8003000.dmac 155: 0 0 GIC 74 f8003000.dmac 156: 0 0 GIC 75 f8003000.dmac 157: 0 0 GIC 40 f8007000.devcfg 164: 0 0 GIC 41 f8005000.watchdog 165: 0 0 GIC 63 xilinx-dma-controller IPI1: 0 0 Timer broadcast interrupts IPI2: 1286 1066 Rescheduling interrupts IPI3: 0 0 Function call interrupts IPI4: 29 30 Single function call interrupts IPI5: 0 0 CPU stop interrupts IPI6: 0 0 IRQ work interrupts IPI7: 0 0 completion interrupts Err: 0 PS: AXI DMA работает в режиме S2MM, пакеты данных на него бросает генератор трафика. axidma_pl2ps.txt Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jury093 2 25 октября, 2016 Опубликовано 25 октября, 2016 (изменено) · Жалоба Ещё ядро генерит прерывание (см. рисунок), но система его почему-то не воспринимает? мда.. тут я фигню спорол не по делу.. был неправ.. в общем случае в драйвере в функции _probe назначается gpio, который регистрируется как сигнал прерывания.. далее в той же функции регистрируется прерывание и передается ссылка на обработчик прерывания.. возможны ньюансы, я не все варианты знаю.. у вас видимо где-то обрыв в логической цепочке.. попробуйте для начала убедится, что происходит вызов обработчика - в ветку, где есть строка static irqreturn_t вставить обычный printk("Oops!\n"); если до этого дело не доходит, проверьте отдается ли под ваш драйвер gpio (и понимает ли он фронт/уровень).. Изменено 25 октября, 2016 пользователем Jury093 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 25 октября, 2016 Опубликовано 25 октября, 2016 · Жалоба попробуйте для начала убедится, что происходит вызов обработчика - в ветку, где есть строка static irqreturn_t вставить обычный printk("Oops!\n"); Эта строка находится в файле драйвера xilinx_dma.c (его код прикреплён в первом сообщении), этот драйвер стартует при старте системы и сообщает об успешном выполнении probe(), а в системе появляется канал dma1chan0 (см. первый пост), этот канал я пытаюсь использовать. И он работает (времянка с ILA выше) пока не закончатся все дескрипторы, дальше пока не реализовал и не пойму как! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 26 октября, 2016 Опубликовано 26 октября, 2016 · Жалоба Приветствую. Прерывание заработало. Проблема была в железе - драйвер xilinx_dma хотел, чтобы прерывание шло на shared interrupt port from PL, я завёл на private interrupt signal for CPU0. Вопрос в следующем куске кода: desc = axidma->device_prep_slave_sg(axidma_ch->chan, sglist, AXIDMA_DESC_NUMBER, DMA_DEV_TO_MEM, DMA_CTRL_ACK | DMA_PREP_INTERRUPT, NULL); desc->callback = axidma_rx_callback; dmaengine_submit(desc); dma_async_issue_pending(axidma_ch->chan); Колбэк axidma_rx_callback срабатывает только один раз??? В регистре CONTROL AXI DMA порог прерываний стоит 1 (???), задаю sglist из 16 дескрипторов. Обработчик прерывания драйвера xilinx_dma срабатывает по завершению каждого дескриптора. Как сделать, чтобы axidma_rx_callback выполнялась по каждому прерыванию от DMA? Второй вариант, как увеличить порог генерации прерывания (не должна ли *_prep_slave_sg это сделать автоматом)??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 1 ноября, 2016 Опубликовано 1 ноября, 2016 · Жалоба Scatter-Gather DMA настраивается на приём данных: ... desc = dmaengine_prep_slave_sg(chan, sglist, AXIDMA_DESC_NUMBER, DMA_DEV_TO_MEM, DMA_CTRL_ACK | DMA_PREP_INTERRUPT); init_completion(&cmp); desc->callback = axidma_rx_callback; desc->callback_param = &cmp; dmaengine_submit(desc); dma_async_issue_pending(chan); wait_for_completion(&cmp); ... Как определить количество байт принятык данных после того, как отработал completion? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 10 ноября, 2016 Опубликовано 10 ноября, 2016 · Жалоба Приветствую. Хочу в системе использовать два AXI DMA, драйвер одого будет работать используя уже существующий в системе драйвер Xilinx и DMA-API ядра. Драйвер второго - полностью свой. Проблема в том, что AXI DMA автоматом добавляется в devicetree, а система при старте использует для него драйвер Xilinx и мой драйвер уже не может получить к нему доступа. Пока удаляю нужный AXI DMA из devicetree (файл pl.dtsi) и мой драйвер хватает его ресурсы, но при обновлении железа системы (*.hdf файла) или запуске конфигурации ядра происходит автоматическое обновление файла pl.dtsi и AXI DMA появляется в devicetree, его опять нужно удалять и это как-то неправильно. Как решить данную проблему? Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться