问题描述
我在微型 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 (将#修改为@)