Получение списка устройств внутри другого драйвера

Мне нужен драйвер устройства, который я пишу / модифицирую, чтобы иметь доступ к другому устройству в системе. Я знаю некоторую информацию о драйвере, такую ​​как имя и / или адрес, чтобы найти его, но не могу найти, как на самом деле выполнить поиск. В этом конкретном случае мне нужно получить устройство GPIO (будет 5 загруженных, и их будет 2 разных типа), но мне также нужно знать в целом, так как у меня есть другая задача, где несколько драйверов совместно используют общий, что они должны будут искать, я полагаю, аналогичным образом. Я нашел, как искать устройство из пользовательского пространства, но ничего о том, как это сделать из другого драйвера ядра. Также в системе нет модулей, все устройства загружаются из информации о devicetree.

Отчасти меня смущает то, что я не вижу, как конкретные функции инициализации gpio регистрируют устройство где-либо. Я использую специфичное для Xilinx устройство AXI GPIO, которое использует код в drivers/gpio/gpio-xilinx.c, и я вижу, как оно получает всю информацию от devicetree, но я не вижу, чтобы что-то передавалось обратно в любые списки ядра, чтобы использовать его позже.

Если это помогает, это работает на чипе Xilinx Zynq.

2 ответа

Решение

Окончательное решение, которое я использовал, было таким:

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;
}

Единственное, что нужно помнить, это то, что имя устройства в дереве устройств должно быть уникальным.

Используйте API driver_find (), чтобы найти драйвер, если вы знаете имя и тип шины, к которому принадлежит драйвер. Вы также можете использовать API find_module (), чтобы получить модуль, если вы знаете его имя. Пример...

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.

Другие вопросы по тегам