Я написал драйвер для встроенного Linux с microzed xilinx для связи с FPGA, а также для получения и обработки IRQ с помощью обработчика IRQ.
Дерево устройств для интересующего нас устройства выглядит так:
stef@dell00:~$ cat /tmp/devicetree.dts | grep -A 5 FPGA
FPGA_v1_0_2@43c00000 {
compatible = "xlnx,FPGA-v1-0-0";
interrupt-names = "interrupt";
interrupt-parent = <0x4>;
interrupts = <0x0 0x20 0x4>;
reg = <0x43c00000 0x10000>;
xlnx,data0-width = <0x10>;
--
FPGA_v1_0_2@43c10000 {
compatible = "xlnx,FPGA-v1-0-0";
interrupt-names = "interrupt";
interrupt-parent = <0x4>;
interrupts = <0x0 0x21 0x4>;
reg = <0x43c10000 0x10000>;
xlnx,data0-width = <0x10>;
Итак, у меня есть два экземпляра одного и того же драйвера для одновременной обработки регистров FPGA и IRQ (это и есть цель).
Код функций драйвера INIT может выглядеть и/или выглядеть так:
static struct platform_driver my_driver = {
.driver = {
.name = "FPGA",
.owner = THIS_MODULE,
.of_match_table = of_match_ptr(my_dt_ids),
},
.probe = my_probe,
.remove = my_remove,
.shutdown = my_shutdown,
};
с функцией зонда:
static int my_probe(platform_device * pdev_p)
{
u32 baseAddr ;
void __iomem * devm_ior_res_p = NULL ;
struct resource * resource_p = NULL ;
typdef_struct_mydata * my_device_datas = NULL ;
my_device_datas = kzalloc( sizeof(typdef_struct_mydata), GFP_ATOMIC );
platform_set_drvdata( pdev_p, dev_p);
resource_p = platform_get_resource(pdev_p, IORESOURCE_MEM, 0);
devm_ior_res_p = devm_ioremap_resource(&pdev_p->dev, resource_p);
of_property_read_u32( pdev_p->dev.of_node, "xlnx,data0-width", &data-width ) ;
baseAddr = (u32)devm_ior_res_p;
// FIXME : do something else at init ....
}
и совместимая ссылка:
static const struct of_device_id my_dt_ids[] = {
{ .compatible = "xlnx,FPGA-v1-0-0", },
{}
};
Поскольку вызывается функция probe, мы можем работать с базовым адресом и сопутствующими вещами, такими как регистры/irq/и т.д...
Поскольку у DTB есть 2 узла с 2 разными регистрационными адресами и адресами пространства MMU, мы видим, как и ожидалось, 2 экземпляра на /sys
FS для одного загруженного драйвера (insmod):
root@my_target:/sys/devices/soc0/amba_pl# ls -rlt | grep FPGA
drwxr-xr-x 4 root root 0 Jan 7 15:50 43c10000.FPGA
drwxr-xr-x 4 root root 0 Jan 7 15:50 43c00000.FPGA
Мой вопрос: как отличить информацию об устройстве платформы одного экземпляра от другого;
Для тривиального примера просто сделайте prink базового адреса 2-го экземпляра из 1-го и наоборот.
В общем, как общаться между двумя экземплярами, не используя API пользовательского пространства sysfs?
Я читал эти статьи:
но решения не нашел.