2

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

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

如果有帮助,它可以在 Xilinx Zynq 芯片上运行。

4

2 回答 2

1

如果您知道驱动程序所属的名称和总线类型,请使用 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 结构定义来找到。

于 2013-09-30T06:16:37.447 回答
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;
}

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

于 2013-12-05T20:09:12.487 回答