#linux-kernel #linux-device-driver #device #device-tree
#linux-ядро #linux-device-driver #устройство #устройство-дерево
Вопрос:
мне нужно было бы получить указатель на конкретное устройство, зарегистрированное в Linux. Вкратце, это устройство представляет mii_bus
объект. Проблема в том, что это устройство, похоже, не принадлежит шине (оно dev->bus
есть NULL
), поэтому я не могу использовать, например, функцию bus_for_each_dev
. Однако устройство зарегистрировано на уровне Open Firmware, и я могу видеть относительный of_device
(который является родительским для интересующего меня устройства) /sys/bus/of_platform
. Мое устройство также зарегистрировано в a class
, поэтому я могу его найти /sys/class/mdio_bus
. Теперь вопросы:
-
Можно получить указатель, используя указатель на
of_device
то, что является родительским устройством, которое мы хотим? -
Как я могу получить указатель на уже созданный класс, используя только имя?Если бы это было возможно, я мог бы перебрать устройства этого класса.
Любой другой совет был бы очень полезен! Спасибо вам всем.
Ответ №1:
Я нашел способ. Я кратко объясняю это, может быть, это может быть полезно. Метод, который мы могли бы использовать, это device_find_child
. Метод принимает в качестве третьего параметра указатель на функцию, которая реализует логику сравнения. Если функция возвращает не ноль при вызове с определенным устройством в качестве первого параметра, device_find_child
вернет этот указатель.
#include <linux/device.h>
#include <linux/of_platform.h>
static int custom_match_dev(struct device *dev, void *data)
{
/* this function implements the comaparison logic. Return not zero if device
pointed by dev is the device you are searching for.
*/
}
static struct device *find_dev()
{
struct device *ofdev = bus_find_device_by_name(amp;of_platform_bus_type,
NULL, "OF_device_name");
if (ofdev)
{
/* of device is the parent of device we are interested in */
struct device *real_dev = device_find_child(ofdev,
NULL, /* passed in the second param to custom_match_dev */
custom_match_dev);
if (real_dev)
return real_dev;
}
return NULL;
}
Комментарии:
1. Помните, что device_find_child() увеличивает счетчик ссылок найденного дочернего устройства. Итак, когда вы закончили использовать дочернее устройство, вы должны выполнить put_device();