Linux 正在获取另一个驱动程序中的设备列表
我需要一个正在编写/修改的设备驱动程序,以便能够访问系统中的其他设备。我知道一些关于司机的信息,比如姓名和/或地址,以便查找,但我找不到如何实际查找。在这种特殊情况下,我需要得到一个GPIO设备(将有5个加载,有2种不同类型的设备),但我也需要知道一般情况,因为我有一个不同的任务,其中几个驱动程序共享一个他们必须查找的通用设备,我以类似的方式假设。我发现了如何从用户空间查找设备,但没有发现如何从另一个内核驱动程序查找设备。此外,系统中没有模块,所有设备都从devicetree信息加载 让我困惑的部分原因是我看不到特定的gpio init函数如何在任何地方注册设备。我使用的是Xilinx专用的AXI GPIO设备,它使用了drivers/GPIO/GPIO Xilinx.c中的代码,我可以看到它是如何从devicetree获取所有信息的,但我没有看到任何信息被传递回任何内核列表供以后使用 如果有帮助,这是在Xilinx Zynq芯片上运行的。如果知道驱动程序所属的名称和总线类型,请使用driver\u find()API查找驱动程序。如果知道模块名称,还可以使用find_module()API获取模块。例如Linux 正在获取另一个驱动程序中的设备列表,linux,linux-kernel,linux-device-driver,kernel-module,Linux,Linux Kernel,Linux Device Driver,Kernel Module,我需要一个正在编写/修改的设备驱动程序,以便能够访问系统中的其他设备。我知道一些关于司机的信息,比如姓名和/或地址,以便查找,但我找不到如何实际查找。在这种特殊情况下,我需要得到一个GPIO设备(将有5个加载,有2种不同类型的设备),但我也需要知道一般情况,因为我有一个不同的任务,其中几个驱动程序共享一个他们必须查找的通用设备,我以类似的方式假设。我发现了如何从用户空间查找设备,但没有发现如何从另一个内核驱动程序查找设备。此外,系统中没有模块,所有设备都从devicetree信息加载 让我困惑的
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个物理设备实例化,我需要获取其中一个。如何获取使用此驱动程序的设备列表?