2011-10-03 1 views
4

Мне нужно будет получить указатель на конкретное устройство, зарегистрированное в Linux. Вкратце, это устройство представляет объект mii_bus. Проблема в том, что это устройство, похоже, не относится к шине (его dev->bus - NULL), поэтому я не могу использовать, например, функцию bus_for_each_dev. Однако устройство зарегистрировано на уровне Open Firmware, и я могу видеть относительный of_device (который является родителем интересующего меня устройства) в /sys/bus/of_platform. Мое устройство также зарегистрировано в class, поэтому я могу найти его в /sys/class/mdio_bus. Теперь вопросы:Каков более чистый способ получить указатель на устройство struct в Linux?

  1. Это можно получить указатель, используя указатель на of_device, который является предком устройства мы хотим?

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

Любой другой совет был бы очень полезен! Спасибо вам всем.

ответ

5

Я нашел путь. Я объясню это кратко, может быть, это может быть полезно. Метод, который мы могли бы использовать, - 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(&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(); – Federico

Смежные вопросы