5

Linux に登録されている特定のデバイスへのポインタを取得する必要があります。簡単に言えば、このデバイスはmii_busオブジェクトを表します。問題は、このデバイスがバスに属していないように見えることです(それdev->busはですNULL)ので、たとえば関数を使用できませんbus_for_each_dev。ただし、デバイスは Open Firmware レイヤーによって登録されており、相対of_device(関心のあるデバイスの親) を/sys/bus/of_platform. 私のデバイスは にも登録されているclassので、 で見つけることができます/sys/class/mdio_bus。今質問:

  1. 必要なデバイスの親であるへのポインターを使用してポインターを取得することは可能of_deviceですか?

  2. 名前だけを使用して、既にインスタンス化されたクラスへのポインターを取得するにはどうすればよいですか?可能であれば、そのクラスのデバイスを反復処理できます。

他のアドバイスはとても役に立ちます!皆さん、ありがとうございました。

4

1 に答える 1

7

私は道を見つけました。簡単に説明しますが、役に立つかもしれません。使用できる方法は ですdevice_find_child。このメソッドは、比較ロジックを実装する関数へのポインターを 3 番目のパラメーターとして受け取ります。特定のデバイスを最初のパラメーターとして呼び出したときに関数がゼロ以外を返した場合、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;
}
于 2011-10-04T07:51:43.620 に答える