|
|
  |
Petalinux. AXI DMA. |
|
|
|
Oct 12 2016, 13:56
|
Профессионал
    
Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539

|
Приветствую. Имеется плата 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 и всё работает? Спасибо.
|
|
|
|
|
Oct 12 2016, 19:30
|
Знающий
   
Группа: Участник
Сообщений: 959
Регистрация: 11-01-06
Из: Санкт-Петербург
Пользователь №: 13 050

|
Цитата(doom13 @ Oct 12 2016, 18:01)  Добавил в систему тестовый модуль axidmatest, в /sys/module появилась директория /sys/module/axidmatest. Попробовал стартануть, как описано в доке dmatest.txt из документации на ядро, но пишет: видимо вы собрали axidmatest.ko, скопируйте его к остальным модулям и запустите команду Код depmod -a имя вашего модуля должно появится в файле modules.dep для ручной загрузки можно Код insmod /путь-до-модуля/вашмодуль.ko или, если кошка лежит в текущем каталоге Код insmod ./вашмодуль.ko
|
|
|
|
|
Oct 13 2016, 08:56
|
Знающий
   
Группа: Участник
Сообщений: 959
Регистрация: 11-01-06
Из: Санкт-Петербург
Пользователь №: 13 050

|
Цитата(doom13 @ Oct 13 2016, 09:22)  Этот модуль должен быть встроен в ядро, задаётся при конфигурации ядра. Драйвер 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, поэтому советы общего плана..
Сообщение отредактировал Jury093 - Oct 13 2016, 08:58
|
|
|
|
|
Oct 13 2016, 10:45
|
Профессионал
    
Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539

|
Цитата(Jury093 @ Oct 13 2016, 11:56)  давайте по порядку: 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 отсутствует. Цитата(Jury093 @ Oct 13 2016, 11:56)  и смотрите, что у вас там включено.. CODE 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. Цитата(Jury093 @ Oct 13 2016, 11:56)  3. в скрипте сборки ядра есть ли опция modules (возможно у вас отключена сборка *.ko - всякое бывает) Если это оно CONFIG_MODULES=y, то есть. Пробовал собрать user module для GPIO - всё работает, есть и my_gpio.o и my_gpio.ko. второй успешно загружается командой insmod.
Эскизы прикрепленных изображений
|
|
|
|
|
Oct 25 2016, 14:16
|
Профессионал
    
Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539

|
Приветствую. 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, пакеты данных на него бросает генератор трафика.
Эскизы прикрепленных изображений
|
|
|
|
|
Oct 26 2016, 14:24
|
Профессионал
    
Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539

|
Приветствую. Прерывание заработало. Проблема была в железе - драйвер 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 это сделать автоматом)???
|
|
|
|
|
Nov 1 2016, 08:27
|
Профессионал
    
Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539

|
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?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|