我需要一个我正在编写/修改的设备驱动程序,以便能够访问系统中的其他设备。我知道有关驱动程序的一些信息,比如名称和/或地址,以便查找,但我找不到如何实际查找。在这种特殊情况下,我需要获得一个GPIO设备(将有5个加载,并且有2种不同类型),但我确实需要知道,因为我有一个不同的任务,其中几个驱动程序共享一个我们必须以同样的方式推测他们必须查找的共同点。我已经找到了如何从用户空间查找设备,但没有关于如何从另一个内核驱动程序执行此操作。此外,系统中没有模块,所有设备都是从设备信息中加载的。
让我感到困惑的部分原因是我没有看到特定的gpio init函数如何在任何地方注册设备。我正在使用特定于Xilinx的AXI GPIO设备,该设备使用drivers / gpio / gpio-xilinx.c中的代码,我可以看到它是如何从设备中获取所有信息的,但我没有看到任何传回的信息到任何内核列表,以便以后使用。
如果有帮助,这是在Xilinx Zynq芯片上运行的。
答案 0 :(得分:1)
如果您知道驱动程序所属的名称和bus_type,请使用driver_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下的所有目录。每个目录都是总线类型。可以通过在内核中搜索bus_type结构定义来找到总线类型结构名称。
答案 1 :(得分:1)
我使用的最终解决方案是:
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;
}
唯一要记住的是设备树中设备的名称必须是唯一的。