您的位置:首页 > 运维架构 > Linux

linux设备驱动模型实例代码以及原理性文章

2016-11-13 22:00 260 查看
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_kset
c_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**


详解Linux2.6内核中基于platform机制的驱动模型

http://blog.csdn.net/davion_zhang/article/details/46697821

Linux Platform总线+SPI总线分析

http://blog.csdn.net/davion_zhang/article/details/46813785
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux 实例