zoukankan      html  css  js  c++  java
  • 20150226 IMX257 总线设备驱动模型编程之总线篇(二)

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

  • 相关阅读:
    Visio使用遇到的问题
    UML类图符号 各种关系说明以及举例
    测试人员与开发人员之间的关系如何?
    linux命令学习-复制(cp,scp)
    linux服务器报Too many open files的解决方法
    QTP学习一添加默认的注释及调用外部vbs文件
    关于JAVA应用中文字体显示小方框的问题解决
    web测试方法总结
    linux命令学习-su
    Oracle定义varchar2()类型存储汉字的长度问题
  • 原文地址:https://www.cnblogs.com/lihaiyan/p/4301072.html
Copyright © 2011-2022 走看看