Здравствуйте всем!
Для модуля на платформе zynq пытаюсь написать platform_driver. Это достаточно новая тема для меня. В модуле есть источник данных DDS, который выдает их через AXI_DMA в DDR3. Написал приложение, программируя регистры узлов через mmap(). Все работает: DMA, GPIO, DDS. Приложение использовалось для отладки прошивки FPGA. Теперь нужно написать «правильно» с использованием драйвера и подсистемы dmaengine linux.
За основу взял вот это: https://github.com/Xilinx/linux-xlnx/blob/master/drivers/dma/xilinx/axidmatest.c
И столкнулся со следующими вопросами:
1) Как еще можно получить дескриптор конкретного канала DMA, кроме: dma_request_slave_channel(&pdev->dev, «dma») + создание дополнительного виртуального устройства в dts (см. ниже метка - custom_device)? Т.е. можно ли получить дескриптор канала не из platform_device? Пытался добавлять dmas и dma-names непосредственно в axi_dma_0 - результата не получил.
2) Как можно получить ресурсы узла gpio@41200000, если у меня в виртуальном устройстве есть phandle этого узла. (нужно для синхронизации и сброса) Ну или как можно получить эти ресурсы из dtb? Т.к. в поле dev->dev.of_node есть только phandle.
Вот фрагмент моего dts:
axi_dma_0: dma@40400000 {
#dma-cells = <1>;
compatible = "xlnx,axi-dma-1.00.a";
dma-channel@40400030 {
compatible = "xlnx,axi-dma-s2mm-channel";
dma-channels = <0x1>;
interrupts = <0 29 4>;
xlnx,datawidth = <0x40>;
xlnx,device-id = <0x0>;
};
};
axi_gpio_0: gpio@41200000 {
#gpio-cells = <2>;
compatible = "xlnx,xps-gpio-1.00.a";
gpio-controller ;
reg = <0x41200000 0x10000>;
};
custom_device: custom {
compatible = "custom,axi-dma-test-1.00.a";
dmas = <&axi_dma_0 0>;
dma-names = "dma";
gpio0 = <&axi_gpio_0>;
};
Могу предоставить любую дополнительную информацию. Буду балгодарен за любую помощь. Спасибо.