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
相关文章推荐
- [转]鼠标移到文章标题上会有漂亮的预览 ,以及我的代码
- 续实例解析SOCKET编程模型之异步通信篇(上) 代码
- 第一个SSH实例以及详细的说明---------代码优化以及数据库连接池
- linux设备驱动模型 之driver(驱动)原理与实例分析
- linux设备驱动模型之 device(设备)原理与实例分析
- 用代码来设置故障还原模型‘简单’以及‘收缩数据库
- 容斥原理详解 以及代码的剖析 结合实例hdu4135
- 关于Latent Dirichlet Allocation及Hierarchical LDA模型的必读文章和相关代码
- windows下的网络编程——Select模型实例,一款ECHO服务的实现代码
- LibCurl编程手册以及代码实例
- [学习笔记]Java代码构建一个线程池的自己学习写的实例,用这个你会更好的理解文章内容
- LibCurl编程手册以及代码实例
- ASP实例代码:长文章分页代码设置方法
- Latent Dirichlet Allocation及Hierarchical LDA模型的必读文章和相关代码
- 堆排序算法原理以及实例代码
- JS中封装解析xml的代码,以及实例应用
- ASP实例代码:搞个长文章分页代码
- jxl对Excel的读、写、更新以及插入图片(含代码实例)
- linux设备驱动模型之 kset原理与实例分析
- jxl对Excel的读、写、更新以及插入图片(含代码实例)