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;
《linux设备模型中ktype的用法》相关文章
- › 基于Linux下USB主机接口设计
- › 基于嵌入式Linux的TFT LCD IP及驱动的设计
- › 基于Linux平台的FPGA驱动开发
- › Linux PC和51系列单片机串行通信的设计
- › 利用MLD自动化操作系统移植降低 Linux 的成本
- › ColdFire单片机在 Clinux上的应用
- 在百度中搜索相关文章:linux设备模型中ktype的用法
- 在谷歌中搜索相关文章:linux设备模型中ktype的用法
- 在soso中搜索相关文章:linux设备模型中ktype的用法
- 在搜狗中搜索相关文章:linux设备模型中ktype的用法