linux设备驱动模型实例代码

来源:互联网 发布:社区论坛源码 编辑:程序博客网 时间:2024/06/06 06:55

static struct kobject *parent, *child;
static struct kset *c_kset;
static unsigned long flag = 1;
static ssize_t att_show(struct kobject *kobj, struct attrribute *attr, char *buf)
{
size_t count = 0;
count += sprintf(&buf[count], “%lu\n”, flag);
return count;
}
static ssize_t att_store(struct kobject *kobj, struct attribute *attr, const char *buf, size_t count)
{
flag = buf[0] - ‘0’;
//通过kobject_uevent来将内核对象kobj的状态变化通知用户程序
switch(flag) {
case 0:
kobject_uevent(kobj, KOBJ_ADD);
break;
case 1:
kobject_uevent(kobj, KOBJ_REMOVE);
break;
case 2:
kobject_uevent(kobj, KOBJ_CHANGE);
break;
case 3:
kobject_uevent(kobj, KOBJ_MOVE);
break;
case 4:
kobject_uevent(kobj, KOBJ_ONLINE);
break;
case 5:
kobject_uevent(kobj, KOBJ_OFFLINE);
break;
}
return count;
}
static struct attribute cld_att = {
.name = “cldatt”,
.mode = S_IRUGO | S_IWUSR,
};
static const struct sysfs_ops att_ops = {
.show = att_show,
.store = att_store,
};
static struct kobj_type cld_ktype = {
.sysfs_ops = &att_ops,
};
static int kobj_demo_init(void)
{
int err;
parent = kobject_create_and_add(“pa_obj”, NULL);

child = kzalloc(sizeof(*child), GFP_KERNEL);if (!child)    return child;//一个能够通知用户空间状态变化的kobject必须隶属于某一个kset, 也就是所谓的//subsystem, 所以此处给内核对象child创建一个kset对象c_ksetc_kset = kset_create_and_add("c_kset", NULL, parent);if (!c_kset)    return -1;child->kset = c_kset;err = kobject_init_and_add(child, &cld_ktype, parent, "cld_obj");if (err)    return err;//为内核对象child创建一个属性文件err = sysfs_create_file(child, &cld_att);return err;

}
static void kobj_demo_exit(void)
{
sysfs_remove_file(child, &cld_att);

kset_unregister(c_kset);kobject_del(child);kobject_del(parent);

}
module_init(kobj_demo_init);
module_exit(kobj_demo_exit);
MODULE_LICENSE(“GPL”);
MODULE_AUTHOR(“dennis chen@AMDLinuxFGL”);
MODULE_DESCRIPTION(“A simple kernel module to demo the kobject behavior”);
obj-m := kobj_demo.o
KDIR := /home/zlx/S5-driver/lesson7/linux-ok6410
all:
make -C (KDIR)M=(PWD) modules CROSS_COMPILE=arm-linux- ARCH=arm
clean:
rm -f .ko .o .mod.o .mod.c .symvers .bak .order*

0 0