设备模型五(实例代码)
来源:互联网 发布:截断数据库是什么意思 编辑:程序博客网 时间:2024/06/12 21:33
- 前言
这篇主要是对前四章的总结
本例子参考<<深入linux设备驱动内核机制>>
例子真好, 我在此之上又添加了一些
#include <linux/init.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/kobject.h>#include <linux/sysfs.h>#include <linux/slab.h>static struct kobject * parent;static struct kobject * child;static struct kset *c_kset;static unsigned long flag = 1;static unsigned long xx = 1;static ssize_t att_show(struct kobject *kobj, struct attribute *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'; switch(flag) { case 0: printk(KERN_ALERT "ADD===============\n"); //消息发不出去 kobj->uevent_suppress = 1; kobject_uevent(kobj, KOBJ_ADD); break; case 1: printk(KERN_ALERT "REMOVE===============\n"); //消息可以发出去 kobj->uevent_suppress = 0; kobject_uevent(kobj, KOBJ_REMOVE); break; case 2: printk(KERN_ALERT "CHANGE===============\n"); xx = 1; kobject_uevent(kobj, KOBJ_CHANGE); break; case 3: xx = 0; printk(KERN_ALERT "MOVE===============\n"); kobject_uevent(kobj, KOBJ_MOVE); break; case 4: printk(KERN_ALERT "ONLINE===============\n"); kobject_uevent(kobj, KOBJ_ONLINE); break; case 5: printk(KERN_ALERT "OFFLINE===============\n"); 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 ma_ok_uevent(struct kset *kset, struct kobject *kobj, struct kobj_uevent_env *env){ add_uevent_var(env, "autor_name=%s", "mxg......"); add_uevent_var(env, "shi[%s]", "dashen"); return 0;}static int uevent_filter(struct kset *kset, struct kobject *kobj){ struct kobj_type *ktype = get_ktype(kobj);//过滤机制,kobject_uevent发送消息调用c_kset的.filter确定是不是cld_obj发的//通过ktype的对比,比如前一篇的说明中,如果有xx其kset也是c_kset, xx的kobj调用kobject_uevent,调用c_kset的.filter判断不是xx的ktype类型, if (ktype == &cld_ktype) return xx; return 0;}static const struct kset_uevent_ops ma_uevent = { .uevent = ma_ok_uevent, .filter = uevent_filter,};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 -1; c_kset = kset_create_and_add("c_kset", &ma_uevent, 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; 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_LICENSE("GPL");module_init(kobj_demo_init);module_exit(kobj_demo_exit);
代码所对应的关系如下图
0 0
- 设备模型五(实例代码)
- Linux设备模型<五>实例二winter_bus
- linux设备驱动模型实例代码
- Linux设备模型实例
- linux设备模型--代码分析
- LINUX设备驱动之设备模型五--device&driver&bus
- globalmem虚拟设备实例描述(五)
- Linux设备模型<四>实例一winter_kobject
- misc设备驱动模型及实例解析
- 设备模型4之kobject(实例)
- misc设备驱动模型及实例解析
- misc设备驱动模型及实例解析
- misc设备驱动模型及实例解析
- misc设备驱动模型及实例解析
- misc设备驱动模型及实例解析
- misc设备驱动模型及实例解析
- misc设备驱动模型及实例解析
- Linux设备模型-3-_Kobject 实例
- Trie 树
- 深度学习笔记(2):caffe 加新层 Attention LSTM layer
- 内中断
- leetcode 349. Intersection of Two Arrays
- Servlet代码块
- 设备模型五(实例代码)
- 框架对性能的影响ssh等
- 火车票-SSL 1586
- 时区处理
- bring up LCD
- 斐波那契数列与吸血鬼数字
- android设计规范
- PHP5.3 的垃圾回收实现原理--同步周期回收机制(未完成版)
- 欢迎使用CSDN-markdown编辑器