linux设备模型中ktype的用法

[11-20 15:53:34]   来源:http://www.88dzw.com  arm嵌入式   阅读:8153

文章摘要:……}访问属性的时候到底是用的哪个kobj_type呢?下面这个函数用以查找指定kobject的kobj_type 指针:static inline struct kobj_type * get_ktype(struct kobject * k){if (k->kset && k->kset->ktype)return k->kset->ktype;elsereturn k->ktype;}上面可以看出,kset中的ktype这个类型优先于 kobject 自身中的 ktype 。因此在典型的应用中, 在 struct kobject 中的 ktype 成员

linux设备模型中ktype的用法,标签:arm嵌入式系统,arm系统,http://www.88dzw.com

  ……

  }

  访问属性的时候到底是用的哪个kobj_type呢?

  下面这个函数用以查找指定kobject的kobj_type 指针:

  static inline struct kobj_type * get_ktype(struct kobject * k)

  {

  if (k->kset && k->kset->ktype)

  return k->kset->ktype;

  else

  return k->ktype;

  }

  上面可以看出,kset中的ktype这个类型优先于 kobject 自身中的 ktype 。因此在典型的应用中, 在 struct kobject 中的 ktype 成员被设为 NULL, 而 kset 中的ktype是实际被使用的。

  下面通过跟踪class_device_create(my_class,NULL, devno, NULL,"farsight_dev");来确定ktype的使用。

  1、

  struct class_device *class_device_create(……)

  {

  ……

  retval = class_device_register(class_dev);

  }

  2、

  int class_device_register(struct class_device *class_dev)

  {

  class_device_initialize(class_dev);

  return class_device_add(class_dev);

  }

  3、

  void class_device_initialize(struct class_device *class_dev)

  {

  kobj_set_kset_s(class_dev, class_obj_subsys);

  kobject_init(&class_dev->kobj);

  INIT_LIST_HEAD(&class_dev->node);

  }

  4、

  #define kobj_set_kset_s(obj,subsys) \

  (obj)->kobj.kset = &(subsys).kset

  从中可以看出名为“farsight_dev”的kobject对应的kset是class_obj_subsys.kset

  5、

  看看class_obj_subsys的定义

  static decl_subsys(class_obj, &ktype_class_device, &class_uevent_ops);

  #define decl_subsys(_name,_type,_uevent_ops) \

  struct subsystem _name##_subsys = { \

  .kset = { \

  .kobj = { .name = __stringify(_name) }, \

  .ktype = _type, \

  .uevent_ops =_uevent_ops, \

  } \

  }

  所以kset对应的ktype为ktype_class_device

  6、

  static struct kobj_type ktype_class_device = {

  .sysfs_ops????? = &class_dev_sysfs_ops,

  .release??? = class_dev_release,

  };

  7、

  static struct sysfs_ops class_dev_sysfs_ops = {

  .show???? = class_device_attr_show,

  .store????? = class_device_attr_store,

  };

  在操作上文中的“dev”或“uevent”时都是操作这个class_dev_sysfs_ops

  8、

  class_device_attr_show(struct kobject * kobj, struct attribute * attr,

  char * buf)

  {

  struct class_device_attribute * class_dev_attr = to_class_dev_attr(attr);

  struct class_device * cd = to_class_dev(kobj);

  ssize_t ret = 0;

  if (class_dev_attr->show)

  ret = class_dev_attr->show(cd, buf);

  return ret;

  }

  class_device_attr_store(struct kobject * kobj, struct attribute * attr,

  const char * buf, size_t count)

  {

  struct class_device_attribute * class_dev_attr = to_class_dev_attr(attr);

  struct class_device * cd = to_class_dev(kobj);

  ssize_t ret = 0;

  if (class_dev_attr->store)

  ret = class_dev_attr->store(cd, buf, count);

  return ret;

  }

  可以看出操作函数会根据to_class_dev_attr(attr);找出对应attr的class_dev_attr并调用其对应的show或store

  9、

  再跟踪一下上文中的dev及uvent属性的定义及其对应的操作函数

  attr->attr.name = "dev";

  attr->attr.mode = S_IRUGO;

上一页  [1] [2] [3]  下一页


Tag:arm嵌入式arm嵌入式系统,arm系统arm嵌入式
分类导航
最新更新
热门排行