Получение списка устройств внутри другого драйвера
Мне нужен драйвер устройства, который я пишу / модифицирую, чтобы иметь доступ к другому устройству в системе. Я знаю некоторую информацию о драйвере, такую как имя и / или адрес, чтобы найти его, но не могу найти, как на самом деле выполнить поиск. В этом конкретном случае мне нужно получить устройство 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.