hello_world-2.3之简单设备驱动模型(三)---添加设备属性文件
2012-12-15 14:48
543 查看
hello_world-2.3之简单设备驱动模型(三)
结合前面的hello_world-2.0之sys文件系统kobj,要想在设备下增加设备的属性文件,以及给device一个父设备。1.helloworld-bus.c
#include<linux/module.h> #include<linux/init.h> #include<linux/string.h> #include<linux/device.h> #include<linux/kernel.h> static char *author = "doublenian.xie"; static ssize_t show_bus_author(struct bus_type *bus,char *buf) { return sprintf(buf,"%s\n",author); } void my_bus_release(struct device *dev) { printk(KERN_DEBUG "my bus release\n"); } static int virtual_bus_match(struct device *dev,struct device_driver *drv) { return !strncmp(dev_name(dev),drv->name,strlen(drv->name)); } struct bus_type virtual_bus = { .name = "my_bus", .match = virtual_bus_match, }; struct device my_bus = { .init_name = "my_bus0", .release = my_bus_release, }; EXPORT_SYMBOL(my_bus); EXPORT_SYMBOL(virtual_bus); static BUS_ATTR(author,S_IRUGO,show_bus_author,NULL); static int __init bus_init(void) { int ret; ret = bus_register(&virtual_bus); if(ret) return ret; if(bus_create_file(&virtual_bus,&bus_attr_author)) printk(KERN_NOTICE "Unable to create author attribute\n"); ret = device_register(&my_bus); if(ret) printk(KERN_NOTICE "Fail to register device \n"); printk("bus register sucess\n"); return ret; } static void __exit bus_exit(void) { bus_unregister(&virtual_bus); device_unregister(&my_bus); } module_init(bus_init); module_exit(bus_exit); MODULE_LICENSE("GPL");
1.1定义父设备
看到了,父设备的定义以及注册跟一般设备一样的步骤,一个release和init_name,device_register 和device_unregister,一个父设备搞定了,还有一步就是在子设备的结构体
中的parent 赋为my_bus0就可以了。
1.2然后设置属性
接下来看看属性的步骤:
1.2.1 是定义store和show函数,
static ssize_t show_bus_author(struct bus_type *bus,char *buf) { return sprintf(buf,"%s\n",author); }
1.2.2 是设置属性文件的属性以及操作
static BUS_ATTR(author,S_IRUGO,show_bus_author,NULL);
这个宏定义,device,device_driver都有一个类似的,可以推到出device的就是
static DEVICE_ATTR(),
#define BUS_ATTR(_name, _mode, _show, _store) \ struct bus_attribute bus_attr_##_name = __ATTR(_name, _mode, _show, _store)
那么driver呢? static DRIVER_ATTR(),他们几个太相似了,知道一个可以推到出另外两个
1.2.3 就是真正干事的了,在/sys下创建文件的
bus_create_file(&virtual_bus,&bus_attr_author)
这个函数也可以推到出 driver和device的创建文件的函数,相似么:
device_create_file,和driver_create_file
2.helloworld-device.c
#include<linux/module.h> #include<linux/init.h> #include<linux/string.h> #include<linux/device.h> char *author = "doublenian.xie"; extern struct bus_type virtual_bus; extern struct device my_bus; static ssize_t show_device_author(struct device *dev,struct device_attribute *attr,char *buf) { return sprintf(buf,"%s\n",author); } void virtual_device_release(struct device *dev) { printk("virtual_device is release\n"); } struct device virtual_device ={ .init_name = "my_dev", .bus = &virtual_bus, .parent = &my_bus, .release = virtual_device_release, }; static DEVICE_ATTR(author,S_IRUGO,show_device_author,NULL); static int __init device_init(void) { int ret; ret = device_register(&virtual_device); if(ret) return ret; if(device_create_file(&virtual_device,&dev_attr_author)) printk(KERN_NOTICE "Unable to create author attribute\n"); printk("device register sucess\n"); return ret; } static void __exit device_exit(void) { device_unregister(&virtual_device); } module_init(device_init); module_exit(device_exit); MODULE_AUTHOR("doublenian.xie@gmail.com"); MODULE_LICENSE("GPL");
3.helloworld_driver.c
#include<linux/module.h> #include<linux/init.h> #include<linux/string.h> #include<linux/device.h> #include<linux/kernel.h> extern struct bus_type virtual_bus; char *author = "doublenian.xie"; static ssize_t show_driver_author(struct device_driver *driver,char *buf) { return sprintf(buf,"%s\n",author); } int my_driver_remove(struct device *dev) { printk(KERN_NOTICE "driver is remove\n"); return 0; } int my_driver_probe(struct device *dev) { printk(KERN_NOTICE "driver can handle the device\n"); return 0; } struct device_driver virtual_driver = { .name = "my_dev", .bus = &virtual_bus, .probe = my_driver_probe, .remove = my_driver_remove, }; static DRIVER_ATTR(author,S_IRUGO,show_driver_author,NULL); static int __init my_driver_init(void) { int ret; ret = driver_register(&virtual_driver); if(ret) return ret; if(driver_create_file(&virtual_driver,&driver_attr_author)) printk(KERN_NOTICE "Unable to create author attribute\n"); printk("driver register sucess\n"); return ret; } static void __exit my_driver_exit(void) { driver_unregister(&virtual_driver); } module_init(my_driver_init); module_exit(my_driver_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("doublenian.xie");
相关文章推荐
- hello_world-2.2之简单设备驱动模型(一)
- hello_world-2.2之简单设备驱动模型(二)---device,bus,driver结构介绍
- 内核设备模型之为kobject添加属性文件
- Linux设备驱动程序学习(0) -设备驱动介绍& Hello, world!模块
- 为Tiny4412设备驱动在proc目录下添加一个可读版本信息的文件
- 如何把设备驱动文件添加到Linux内核编译选项配置的menuconfig中
- 第一个设备驱动--Hello,world
- 设备驱动的艺术之旅 - 简单网卡驱动模型
- 按键驱动(等待队列+设备树+属性文件)
- 字符设备驱动1:新的方式添加cdev + 在open函数中将文件私有数据指向设备结构体
- Linux设备模型――设备驱动模型和sysfs文件系统解读
- 设备模型5之总线、设备、驱动(实例,简单演示probe过程)
- adc驱动实例(工作队列+等待队列+设备树+属性文件)
- UEFI简单的应用程序模块MyHelloWorld:C源文件/INF工程文件源码/简析[6]
- Linux Kernel设备驱动模型之 设备添加
- linux 设备驱动模型 class 设备结点文件 热插拔
- 简单字符设备驱动和自动创建设备文件
- Linux设备模型——设备驱动模型和sysfs文件系统解读
- linux驱动入门-hello设备驱动程序编写及内核的更新(网卡的添加)
- 总线、设备和驱动属性文件