20150226 IMX257 总线设备驱动模型编程之总线篇(二)
2015-02-26 李海沿
前面我们讲解了一个简单的总线驱动程序,目的就是在/sys/bus/下面创建文件,但是这还是不够的,因为总线也是一个设备,如果想让系统认识的话,必须要用device_register进行注册。
http://www.cnblogs.com/lihaiyan/p/4300062.html
此处,我们就开始来注册一个总线,让总线下即可以包含属性文件,也包含设备文件,和驱动程序。
让驱动程序 和设备文件之间互联,这才是总线真正的用途。
一、程序解析
前面已经将的很详细,我们这儿在前面的基础上加上一下:
1. 定义总体设备结构体
并且实现 设备的release函数;
2. 导出总线设备
3. 注册设备驱动
4. 卸载设备
二、编译测试:
加载成功后,因为总线也是一个设备,所以在 /sys/bus/下面有my_bus这个目录
而在/sys/device/ 下面同样也生成了一个目录,名字为我们的my_bus 的init_name
如图所示
附上my_bus.c驱动程序:
1 #include <linux/device.h> 2 #include <linux/module.h> 3 #include <linux/kernel.h> 4 #include <linux/init.h> 5 #include <linux/string.h> 6 7 8 static char *Version = "$LoverXueEr : 1.0 $"; 9 10 //检测驱动是否匹配设备,dev->bus_id 和 driver->name相等的 11 static int my_match(struct device *dev ,struct device_driver *driver){ 12 return !strncmp(dev_name(dev),driver->name,strlen(driver->name)); 13 } 14 15 static void my_bus_release(struct device *dev){ 16 printk("<0>my bus release\n"); 17 } 18 19 //设置设备的名字 dev_set_name(&dev,"name"); 20 struct device my_bus = { 21 .init_name = "my_bus0", 22 .release = my_bus_release, 23 }; 24 25 struct bus_type my_bus_type = { 26 .name = "my_bus", 27 .match = my_match, 28 }; 29 EXPORT_SYMBOL(my_bus); //导出符号 30 EXPORT_SYMBOL(my_bus_type); 31 32 //显示总线版本号 33 static ssize_t show_bus_version(struct bus_type *bus,char *buf){ 34 return snprintf(buf,PAGE_SIZE,"%s\n",Version); 35 } 36 37 //产生后面的 bus_attr_version 结构体 38 static BUS_ATTR(version,S_IRUGO, show_bus_version, NULL); 39 40 static int __init my_bus_init(void){ 41 int ret; 42 /* 注册总线 */ 43 ret = bus_register(&my_bus_type); 44 if(ret) 45 return ret; 46 /* 创建属性文件 */ 47 if(bus_create_file(&my_bus_type, &bus_attr_version)) 48 printk("<0>Fail to create version attribute! \n"); 49 50 /* 注册总线设备 */ 51 ret = device_register(&my_bus); 52 if(ret) 53 printk("<0>Fail to register device: my_bus"); 54 return ret; 55 } 56 57 static void my_bus_exit(void){ 58 bus_unregister(&my_bus_type); 59 device_unregister(&my_bus); 60 } 61 62 module_init(my_bus_init); 63 module_exit(my_bus_exit); 64 65 66 MODULE_AUTHOR("Lover雪儿"); 67 MODULE_LICENSE("GPL");
三、错误解决:
1. error: 'struct device' has no member named 'bus_id'
在新版本的内核中device已经没有bus_id这个成语了,取而代之的是.init_name.
解决方法:
将device下面的 .bus_id 修改为 .init_name ,如图所示:
然后,再将程序中match函数中 dev->bus_id 修改为 dev_name(dev), 就可以了
********************************************
* 博客园: http://www.cnblogs.com/lihaiyan/
* 邮箱:1063385677@qq.com
* QQ: 1063385677
* Copyright ©2014 Lover雪儿
********************************************
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
* 博客园: http://www.cnblogs.com/lihaiyan/
* 邮箱:1063385677@qq.com
* QQ: 1063385677
* Copyright ©2014 Lover雪儿
********************************************
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。