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.