ฉันเขียนไดรเวอร์บน Linux 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", },
{}
};
เนื่องจากการเรียกใช้ฟังก์ชันโพรบ เราจึงสามารถทำงานกับที่อยู่ฐานและสิ่งที่เกี่ยวข้อง เช่น รีจิสเตอร์ / irq / ฯลฯ...
เนื่องจาก DTB มี 2 โหนดที่มีที่อยู่ reg ที่แตกต่างกัน 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
คำถามของฉันคือ: วิธีแยกแยะข้อมูลข้อมูลอุปกรณ์แพลตฟอร์มของอินสแตนซ์หนึ่งจากอีกอินสแตนซ์หนึ่ง
สำหรับตัวอย่างเล็กๆ น้อยๆ เพียงแค่แกล้งทำที่อยู่ฐานของอินสแตนซ์ที่ 2 จากอินสแตนซ์ที่ 1 และในทางกลับกัน
ในมุมมองทั่วไป จะสื่อสารระหว่างทั้งสองอินสแตนซ์โดยไม่ต้องไปที่ sysfs userspace API ได้อย่างไร
ฉันอ่านบทความเหล่านั้น:
แต่ยังไม่พบวิธีแก้ปัญหา