Komunikasi antara dua instance driver kernel Linux berdasarkan pada dua node terpisah di pohon perangkat

Saya menulis driver pada Linux tertanam xilinx mikro untuk berkomunikasi dengan FPGA dan menerima serta memperlakukan IRQ dengan pengendali IRQ.

Pohon perangkat terlihat seperti ini sesuai dengan minat kami:

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>;

Jadi saya memiliki dua contoh driver yang sama untuk merawat register FPGA paralel dan IRQ pada saat yang sama (itulah tujuannya).

Kode pada fungsi driver INIT bisa terlihat seperti dan/atau terlihat seperti itu:

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,
};

dengan fungsi pemeriksaan:

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 ....
}

dan tautan yang kompatibel:

static const struct of_device_id my_dt_ids[] = {

    { .compatible = "xlnx,FPGA-v1-0-0", },  
    {}
};

Karena fungsi probe dipanggil, kita dapat bekerja dengan alamat dasar dan hal-hal terkait seperti register / irq / dll...

Karena DTB memiliki 2 node dengan 2 alamat reg dan alamat ruang MMU yang berbeda, seperti yang diharapkan kita melihat 2 instance pada /sys FS untuk satu driver yang dimuat (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

Pertanyaan saya adalah: Bagaimana membedakan informasi data perangkat platform dari satu contoh dengan yang lain;

Contoh sepelenya cukup lakukan prink pada alamat dasar instance ke-2 dari instance ke-1 dan sebaliknya.

Secara umum, bagaimana cara berkomunikasi antara dua instance tanpa menggunakan sysfs userspace API?

Saya membaca artikel-artikel itu:

namun belum menemukan solusinya.


person stefff    schedule 23.01.2021    source sumber
comment
cara berkomunikasi ... -- Pertama-tama tentukan apakah hubungan tersebut bersifat peer-to-peer, master-slave, atau keduanya tunduk pada driver induk. Namun kesan pertama saya adalah Anda mungkin mempersulit segalanya dengan menggunakan dua instance untuk satu perangkat, bukan satu driver atau dua driver berbeda. Anda belum menjelaskan dengan jelas fungsionalitas yang memerlukan replikasi oleh setiap instance (misalnya apakah FPGA hanyalah implementasi fisik untuk dua perangkat yang identik?). TKI Anda mungkin telah membuat masalah XY.   -  person sawdust    schedule 24.01.2021
comment
ini bukan masalah xy, terima kasih   -  person stefff    schedule 19.02.2021
comment
Sepertinya Anda mencari fwnode graph API. Ini telah dirancang untuk meneruskan properti perangkat antara node independen (dari sudut pandang Pohon Perangkat).   -  person 0andriy    schedule 02.03.2021
comment
Semoga bermanfaat (ada beberapa tautan) stackoverflow.com/q/58577825/2511795   -  person 0andriy    schedule 02.03.2021