Linux 正在获取另一个驱动程序中的设备列表

Linux 正在获取另一个驱动程序中的设备列表,linux,linux-kernel,linux-device-driver,kernel-module,Linux,Linux Kernel,Linux Device Driver,Kernel Module,我需要一个正在编写/修改的设备驱动程序,以便能够访问系统中的其他设备。我知道一些关于司机的信息,比如姓名和/或地址,以便查找,但我找不到如何实际查找。在这种特殊情况下,我需要得到一个GPIO设备(将有5个加载,有2种不同类型的设备),但我也需要知道一般情况,因为我有一个不同的任务,其中几个驱动程序共享一个他们必须查找的通用设备,我以类似的方式假设。我发现了如何从用户空间查找设备,但没有发现如何从另一个内核驱动程序查找设备。此外,系统中没有模块,所有设备都从devicetree信息加载 让我困惑的

我需要一个正在编写/修改的设备驱动程序,以便能够访问系统中的其他设备。我知道一些关于司机的信息,比如姓名和/或地址,以便查找,但我找不到如何实际查找。在这种特殊情况下,我需要得到一个GPIO设备(将有5个加载,有2种不同类型的设备),但我也需要知道一般情况,因为我有一个不同的任务,其中几个驱动程序共享一个他们必须查找的通用设备,我以类似的方式假设。我发现了如何从用户空间查找设备,但没有发现如何从另一个内核驱动程序查找设备。此外,系统中没有模块,所有设备都从devicetree信息加载

让我困惑的部分原因是我看不到特定的gpio init函数如何在任何地方注册设备。我使用的是Xilinx专用的AXI GPIO设备,它使用了drivers/GPIO/GPIO Xilinx.c中的代码,我可以看到它是如何从devicetree获取所有信息的,但我没有看到任何信息被传递回任何内核列表供以后使用

如果有帮助,这是在Xilinx Zynq芯片上运行的。

如果知道驱动程序所属的名称和总线类型,请使用driver\u find()API查找驱动程序。如果知道模块名称,还可以使用find_module()API获取模块。例如

int __init initialization_routine(void)
{
        struct module *mod;
        struct device_driver *drv;

        mod = find_module("e1000"); // e1000 is Intel ethernet module
        if (mod == NULL) { 
                printk("Module e1000 not found\n");
                return 1;
        }

        printk("Module name : %s\n", mod->name);

        /*
         * Module e1000 belongs to pci_bus_type
         */
        drv = driver_find("e1000", &pci_bus_type);
        if (drv == NULL) {
                printk("Cannot find driver for module e1000\n");
                return 1;
        }

        return 0;
}

系统上注册了各种总线。您可以找到它们列出了/sys/bus下的所有目录。每个目录都是总线类型。通过在内核中搜索总线类型结构定义,可以找到总线类型结构名称。

我使用的最终解决方案是:

static int custom_match_dev(struct device *dev, void *data)
{
// this function implements the comaparison logic. Return not zero if found.
    const char *name = data;

    return sysfs_streq(name, dev->of_node->name);
}

static struct device *find_dev( const char * name )
{
    struct device *dev = bus_find_device( &platform_bus_type, NULL, name, custom_match_dev );

    return dev;
}

唯一需要记住的是,设备树中的设备名称必须是唯一的。

好的,这将为我获取设备驱动程序,但将有2个物理设备实例化,我需要获取其中一个。如何获取使用此驱动程序的设备列表?