Перейти к содержанию
    

Petalinux. AXI DMA.

Приветствую.

Имеется плата 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добавил в систему тестовый модуль axidmatest, в /sys/module появилась директория /sys/module/axidmatest. Попробовал стартануть, как описано в доке dmatest.txt из документации на ядро, но пишет:

root@zynq:/# modprobe axidmatest

modprobe: module axidmatest not found in modules.dep

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добавил в систему тестовый модуль axidmatest, в /sys/module появилась директория /sys/module/axidmatest. Попробовал стартануть, как описано в доке dmatest.txt из документации на ядро, но пишет:

видимо вы собрали axidmatest.ko, скопируйте его к остальным модулям и запустите команду

depmod -a

имя вашего модуля должно появится в файле modules.dep

 

для ручной загрузки можно

insmod /путь-до-модуля/вашмодуль.ko

или, если кошка лежит в текущем каталоге

insmod ./вашмодуль.ko

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Этот модуль должен быть встроен в ядро, задаётся при конфигурации ядра. Драйвер xilinx_dma с которым пытаюсь разобраться стартует при загрузке системы. axidmatest - это пример использования этого драйвера (наверное) и должен присутствовать в скомпилированном ядре, тут не знаю должен ли запустится автоматом или необходима ручная загрузка.

После компиляции в папке драйвера DMA (../build/linux/kernel/xlnx-4.0/drivers/dma/xilinx) файлы с расширением .ko отсутствуют, есть только .o

В папке проекта build вообще отсутствуют файлы xilinx_dma.ko и axidmatest.ko.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Этот модуль должен быть встроен в ядро, задаётся при конфигурации ядра. Драйвер 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

давайте по порядку:

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.

post-63539-1476354670_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую.

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, пакеты данных на него бросает генератор трафика.

post-63539-1477404936_thumb.png

axidma_pl2ps.txt

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ещё ядро генерит прерывание (см. рисунок), но система его почему-то не воспринимает?

мда.. тут я фигню спорол не по делу.. был неправ..

в общем случае в драйвере в функции _probe назначается gpio, который регистрируется как сигнал прерывания.. далее в той же функции регистрируется прерывание и передается ссылка на обработчик прерывания.. возможны ньюансы, я не все варианты знаю..

у вас видимо где-то обрыв в логической цепочке.. попробуйте для начала убедится, что происходит вызов обработчика - в ветку, где есть строка static irqreturn_t вставить обычный printk("Oops!\n");

если до этого дело не доходит, проверьте отдается ли под ваш драйвер gpio (и понимает ли он фронт/уровень)..

Изменено пользователем Jury093

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

попробуйте для начала убедится, что происходит вызов обработчика - в ветку, где есть строка static irqreturn_t вставить обычный printk("Oops!\n");

Эта строка находится в файле драйвера xilinx_dma.c (его код прикреплён в первом сообщении), этот драйвер стартует при старте системы и сообщает об успешном выполнении probe(), а в системе появляется канал dma1chan0 (см. первый пост), этот канал я пытаюсь использовать.

 

И он работает (времянка с ILA выше) пока не закончатся все дескрипторы, дальше пока не реализовал и не пойму как!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую.

Прерывание заработало. Проблема была в железе - драйвер 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 это сделать автоматом)???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую.

Хочу в системе использовать два AXI DMA, драйвер одого будет работать используя уже существующий в системе

драйвер Xilinx и DMA-API ядра. Драйвер второго - полностью свой. Проблема в том, что AXI DMA автоматом добавляется в devicetree, а система при старте использует для него драйвер Xilinx и мой драйвер уже не может получить к нему доступа.

Пока удаляю нужный AXI DMA из devicetree (файл pl.dtsi) и мой драйвер хватает его ресурсы, но при обновлении железа системы (*.hdf файла) или запуске конфигурации ядра происходит автоматическое обновление файла pl.dtsi и AXI DMA появляется в devicetree, его опять нужно удалять и это как-то неправильно.

Как решить данную проблему?

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...