20150226 IMX257 总线设备驱动模型编程之总线篇(二)
发布日期:2021-06-29 14:56:08 浏览次数:2 分类:技术文章

本文共 2386 字,大约阅读时间需要 7 分钟。

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 
2 #include
3 #include
4 #include
5 #include
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");

View Code

 

 

 

三、错误解决:

 

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), 就可以了

 

转载地址:https://ciellee.blog.csdn.net/article/details/82599470 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:20150312 NorFlash驱动
下一篇:20150311 NandFlash驱动分析

发表评论

最新留言

不错!
[***.144.177.141]2024年04月21日 11时46分06秒