基于设备树中两个分离节点的两个 Linux 内核驱动程序实例之间的通信

问题描述

我在微型 xilinx 嵌入式 Linux 上编写了一个驱动程序来与 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 空间地址, 我们在 /sys FS 上看到预期的 2 个实例,加载了一个驱动程序 (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

我的问题是:如何区分一个实例的平台设备数据信息;

举个简单的例子,从第 1 个实例开始打印第 2 个实例的基地址,反之亦然。

一般来说,如何在不使用 sysfs 用户空间 API 的情况下在两个实例之间进行通信?

我阅读了那些文章

但还没有找到解决方案。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)