2011-10-03 1 views
4

linux에 등록 된 특정 장치에 대한 포인터를 얻어야합니다. 간단히 말해,이 장치는 mii_bus 개체를 나타냅니다. 문제는이 장치가 버스에 속하지 않는 것 같습니다 (dev->busNULL). 예를 들어 함수 bus_for_each_dev을 사용할 수 없습니다. 장치는 Open Firmware 레이어에 등록되어 있으며 관련 of_device (내가 관심이있는 장치의 부모)은 /sys/bus/of_platform에 있습니다. 내 장치도 class에 등록되어 있으므로 /sys/class/mdio_bus에서 찾을 수 있습니다. 이제 질문 :리눅스에서 struct 디바이스에 대한 포인터를 얻는 더 깨끗한 방법은 어느 것입니까?

  1. 그것은 우리가 원하는 장치의 부모 인 of_device에 대한 포인터를 사용하여 포인터를 얻을 수있어?

  2. 어떻게 이름을 사용하여 이미 인스턴스화 된 클래스에 대한 포인터를 얻을 수 있습니까? 가능한 경우 해당 클래스의 장치를 반복 할 수 있습니다.

다른 조언은 매우 유용합니다! 다들 감사 해요.

답변

5

나는 길을 발견했다. 나는 그것을 간략하게 설명한다. 아마 유용 할 수도있다. 우리가 사용할 수있는 방법은 device_find_child입니다. 이 메서드는 비교 논리를 구현하는 함수에 대한 포인터를 세 번째 매개 변수로 사용합니다. 첫 번째 매개 변수로 특정 장치를 호출 할 때 함수가 0이 아닌 값을 반환하면 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

관련 문제