上回说到,platform_match是驱动和设备之间的媒人婆,那么platform_match是如何匹配驱动和设备的呢?platform总线定义的匹配条件很简单,主要就是查看驱动结构体和设备结构体的name成员变量是否相同,不同总线定义的匹配条件都不同的,例如USB总线的匹配条件就异常复杂,USB总线我们迟点会具体分析的。

  现在我们把驱动和设备分开来讲,首先会讲驱动,在最后我们会以一个实际的例子来说明,当然这个例子是没有任何的实际意义的,主要是拿来学习。在后面我们还会回过头来完善这个例子的。

  我们先看看platform总线定义的驱动结构,如下所示

  struct platform_driver {
     int (*probe)(struct platform_device *);
     int (*remove)(struct platform_device *);
     void (*shutdown)(struct platform_device *);
     int (*suspend)(struct platform_device *, pm_message_t state);
     int (*resume)(struct platform_device *);
     struct device_driver driver;
     struct platform_device_id *id_table;
  };

  当platform_match帮驱动找到匹配的设备的时候会在某个时候调用该结构体的probe函数,remove方法是在设备被移除前会被调用的(驱动移除时并不会调用该remove方法)。下面给出一个很简单的驱动模块,

 #include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/types.h>
#include <asm/system.h>
struct haoge_data
{
char a[];
}; static int haoge_probe(struct platform_device *dev)
{
struct haoge_data * p =(dev->dev).platform_data; printk(KERN_ALERT "%s",p->a); return ;
} static struct platform_driver haoge_driver = {
.probe = haoge_probe, .driver = {
.name = "haoge",
.owner = THIS_MODULE,
},
}; static int __init haoge_init(void)
{ return platform_driver_register(&haoge_driver);
} static void __exit haoge_exit(void)
{ platform_driver_unregister(&haoge_driver);
} module_init(haoge_init);
module_exit(haoge_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("HaoGe");

  大家可以编译这个驱动模块,然后把他加载,一加载这个驱动platform总线就会把他挂接到该总线的驱动链表上。这个模块唯一值得一提的便是haoge_probe函数,这函数是我们定义的该驱动的probe方法。这个函数只有一个参数,便是struct platform_device *dev。从名字可以看出,这个参数便是指向设备结构体的一个指针。这个结构体如下所示

  

struct platform_device {

   const char * name;

   int  id;

   struct device dev;

   u32  num_resources;

   struct resource * resource;

  struct platform_device_id *id_entry;

struct pdev_archdata archdata;

};

  我们提一下这个结构体的name成员变量,我们之前说过platform总线是以名字来匹配驱动和设备的,所以如果我们另外写一个设备模块,把设备结构体的的name成员赋值为"haoge",那么该设备就会匹配上面我们所写的那个驱动模块。

  我们再来看一下platform_device结构体的dev成员变量:struct device dev。其实device结构体才是总线、设备、驱动这三者中真正的设备一员,相应的device_driver是真正的驱动一员。platform_device和platform_driver是platform总线对device和device_driver这两个最底层结构体的封装。在device结构体中有个成员platform_data,他是专门用于驱动和设备之间传输数据的。在我们定义的haoge_probe函数中,我们便是通过platform_data把设备传输过来的数据用printk函数打印出来。

  下面我们给出设备模块的代码。

 

 #include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/types.h>
#include <asm/system.h> struct haoge_data
{
char a[];
}s; struct platform_device haoge_device ={
.name= "haoge",
.id=,
.dev = {
.platform_data = &s,
},
}; static int __init haoge_init(void)
{
sprintf(s.a,"haogeverygood!"); platform_device_register(&haoge_device); return ;
} static void __exit haoge_exit(void)
{ platform_device_unregister(&haoge_device);
} module_init(haoge_init);
module_exit(haoge_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("HaoGe");

 一加载这个设备模块,platform总线就会把这个设备模块与驱动模块绑定起来,然后我们就会看到字符界面输出"haogeverygood!"的字样了。一般驱动和设备都是一对多的,一个驱动可以满足多个设备。所以我们可以加载另外一个设备,把上面的代码修改一下,如下:

 

 #include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/types.h>
#include <asm/system.h> struct haoge_data
{
char a[];
}s2; struct platform_device haoge2_device ={
.name= "haoge",
.id = ,
.dev = {
.platform_data = &s2,
},
}; static int __init haoge_init(void)
{
sprintf(s2.a,"haoge very handsone!"); platform_device_register(&haoge2_device); return ;
} static void __exit haoge_exit(void)
{ platform_device_unregister(&haoge2_device);
} module_init(haoge_init);
module_exit(haoge_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("HaoGe");

  加载第二个设备模块,就会输出"haoge very handsome!"的字样。记住一点,这两个设备模块中的platform_device结构体中的id成员必须是不同的值,否则会发生kernel的错误。

  今天就写到这,下次我会再完善一下这个简单的例子

 

  

  

探究linux设备驱动模型之——platform虚拟总线(二)的更多相关文章

  1. 探究linux设备驱动模型之——platform虚拟总线(一)

    说在前面的话 :      设备驱动模型系列的文章主要依据的内核版本是2.6.32的,因为我装的Linux系统差不多就是这个版本的(实际上我用的fedora 14的内核版本是2.6.35.13的.) ...

  2. 探究linux设备驱动模型之——platform虚拟总线(三)最终章

    这篇是最终章了,结束这一章后,对于platform平台总线驱动的使用方法应该是能够无压力掌握.但是这一章涉及的内容会比前面两章多一些. 我们会一步一步地来完善上一章的例子.完善的目的是能够在应用层去控 ...

  3. Linux设备驱动模型之platform(平台)总线详解

    /********************************************************/ 内核版本:2.6.35.7 运行平台:三星s5pv210 /*********** ...

  4. linux设备驱动模型之Kobject、kobj_type、kset【转】

    本文转载自:http://blog.csdn.net/fengyuwuzu0519/article/details/74838165 版权声明:本文为博主原创文章,转载请注明http://blog.c ...

  5. Linux设备驱动模型简述(源码剖析)

    1. Linux设备驱动模型和sysfs文件系统 Linux内核在2.6版本中引入设备驱动模型,简化了驱动程序的编写.Linux设备驱动模型包含设备(device).总线(bus).类(class)和 ...

  6. Linux设备驱动模型底层架构及组织方式

    1.什么是设备驱动模型? 设备驱动模型,说实话这个概念真的不好解释,他是一个比较抽象的概念,我在网上也是没有找到关于设备驱动模型的一个定义,那么今天就我所学.所了解 到的,我对设备驱动模型的一个理解: ...

  7. LINUX设备驱动模型之class

    转自 https://blog.csdn.net/qq_20678703/article/details/52754661 1.LINUX设备驱动模型中的bus.device.driver,.其中bu ...

  8. Linux 设备驱动模型

    Linux系统将设备和驱动归一到设备驱动模型中了来管理 设备驱动程序功能: 1,对硬件设备初始化和释放 2,对设备进行管理,包括实参设置,以及提供对设备的统一操作接口 3,读取应用程序传递给设备文件的 ...

  9. linux设备驱动模型

    尽管LDD3中说对多数程序员掌握设备驱动模型不是必要的,但对于嵌入式Linux的底层程序员而言,对设备驱动模型的学习非常重要. Linux设备模型的目的:为内核建立一个统一的设备模型,从而又一个对系统 ...

随机推荐

  1. 5、RabbitMQ-订阅模式 Publish/Subscribe

    http://www.rabbitmq.com/tutorials/tutorial-three-java.html 1.模型图 我们之前学习的都是一个消息只能被一个消费者消费,那么如果我想发一个消息 ...

  2. Gradle初步

    一.介绍 Gradle是一个基于 JVM 的富有突破性构建工具. 它为您提供了: 一个像 ant 一样,通用的灵活的构建工具 一种可切换的,像 maven 一样的基于约定优于配置的构建框架 强大的多工 ...

  3. Django实战(二)之模板语言

    该实战教程基于菜鸟教程,菜鸟教程可参考:http://www.runoob.com/django/django-template.html 模板语法,每个框架都有其支持的模板语法,Django的模板语 ...

  4. Selenium自动化测试之启动浏览器

    Selenium自动化测试之启动浏览器 一.Eclipse新建java工程 1.新建java工程:File->New->Java Project,输入Project name:如AutoT ...

  5. String系列01 - String 60%

    1.String简介 String类实现CharSequence接口.(同时,实现Serializable, Comparable 接口). String类使用final修饰符,为final类,不可被 ...

  6. 删除 center os7 openjdk

    卸载CentOS7-x64自带的OpenJDK并安装Sun的JDK7的方法   第一步:查看并卸载CentOS自带的OpenJDK 安装好的CentOS会自带OpenJdk,用命令 java -ver ...

  7. UML架构设计师必备神器

    UML-架构设计师必备神器 做过Java开发的一定都听过UML,也都能感觉到它的重要性.由其是在网上搜索一些高级技术介绍,写的好的.阅读量高的.让初.中级程序员容易看懂的.思路清晰的文章一定有UML类 ...

  8. nodejs( koa2 )配置 browserHistory

    前言 既然能搜到并且还点进来看这篇文章, 那么肯定是知道后台为什么要配置 browserHistory, 也肯定知道为什么非要去用相对来说更麻烦的吧browserHistory, 而不用更简单点的不需 ...

  9. 安装ubuntu 18.04总结

    今天开发组的一个妹子同事想把系统换成ubuntu的,过来找我,给装完后,做个总结..... 以下开始操作 环境:小米air ,系统win10,cpu intel_m3 一)下载ubuntu 的镜像 h ...

  10. 基于jQuery的轮播焦点图图

    轮播焦点图 ——仿淘宝首页jquery轮播焦点图,我特意去taobao首页看了下它的轮播,好像有点相似,我不保证是我写的这样. 本例来源:站长之家http://sc.chinaz.com/jiaobe ...