1.platform device是怎么"自动"关联到platform driver上的?

转向linux driver有些时间了,前段时间碰到个问题,在Linux kernel 3.10的drivers/tty/serial/imx.c中,注册driver的时候调用platform_driver_register(&serial_imx_driver),serial_imx_driver类型为platform_driver, serial_imx_driver中有个成员变量probe,在driver注册时会调用这个函数,但是probe这个函数的参数是platform_device,而在imx.c中没有出现platform_device类型的任何变量,问题就此产生了,platform_device这个参数到底是从什么地方传进来的,内容又是什么,什么时候赋值的?

2.设备、总线、驱动三者如何关联起来?

后来查阅了相关资料,大体上的意思是,在linux2.6内核以后,设备和驱动的结构划分为设备、总线、驱动,设备和驱动分别挂在总线上,而他们可以通过name来进行匹配(还有其他的方式),二者绑定有两种方式:一种是先安装driver,后挂载设备;另一种则是先挂载设备,然后安装driver。但二者都是后面动作的会在总线上搜索与自己name项相同的设备或者driver进行匹配,也即完成绑定。

3.代码中的实现

在imx.c中,由于平台是3.10,所以使用DTS,设备都是预先挂载了如串口0/1/2/3..., 后面安装驱动时,会调用上述说到的platform_driver_register(&serial_imx_driver),在驱动注册过程中会对进行匹配设备,一旦匹配到某个device,就会调用probe进行初始化,这个probe的参量platform_device也就有来源了。具体可以参考下面的调用过程

do_basic_setup()->driver_init()->platform_bus_init()->...初始化platform bus(虚拟总线)
设备向内核注册的时候platform_device_register()->platform_device_add()->...内核把设备挂在虚拟的platform bus下
驱动注册的时候platform_driver_register()->driver_register()->bus_add_driver()->driver_attach()->bus_for_each_dev()对每个挂在虚拟的platform bus的设备作__driver_attach()->driver_probe_device()->drv->bus->match()==platform_match()->比较strncmp(pdev->name, drv->name, BUS_ID_SIZE),如果相符就调用platform_drv_probe()->driver->probe(),如果probe成功则设备与驱动成功绑定.

代码如下:在执行到driver_attach的时候platform_device还没出现:

int driver_attach(struct device_driver *drv)
{
return bus_for_each_dev(drv->bus, NULL, drv, __driver_attach);
}
EXPORT_SYMBOL_GPL(driver_attach);

这一步开始出现了,县初始化device list,然后通过next_device来遍历节点的属性,调用fn也即__driver_attach,dev也是从next_device中获取device指针

int bus_for_each_dev(struct bus_type *bus, struct device *start,
void *data, int (*fn)(struct device *, void *))
{
struct klist_iter i;
struct device *dev;
int error = ; if (!bus || !bus->p)
return -EINVAL; klist_iter_init_node(&bus->p->klist_devices, &i,
(start ? &start->p->knode_bus : NULL));
while ((dev = next_device(&i)) && !error)
error = fn(dev, data);
klist_iter_exit(&i);
return error;
}
EXPORT_SYMBOL_GPL(bus_for_each_dev);

以上只是简单理解,还是没有深入进去,所以很多原理说不清楚,希望能有时间静下心好好研究研究,如:

1. 设备、驱动、总线三者设计理念,结构模式

2. 设备、驱动先后挂到总线上的机制

3. linux2.6之前、linux2.6、linux2.6之后,驱动、设备在这些版本中的变迁,如platform的出现,dts的出现等

[platform]linux platform device/driver(一)--Driver是如何找到对应的device的更多相关文章

  1. [platform]linux platform device/driver(三)--Platform Device和Platform_driver注册过程之代码对比

    转自:http://blog.csdn.net/thl789/article/details/6723350 Linux 2.6的设备驱动模型中,所有的device都是通过Bus相连.device_r ...

  2. [platform]linux platform device/driver(二)--Platform Device和Platform_driver注册过程之详细代码

    转自:http://www.cnblogs.com/haimeng2010/p/3582403.html 目录: 1.platform_device注册过程 2.platform_driver注册过程 ...

  3. Linux Platform Device and Driver

    从 Linux 2.6 起引入了一套新的驱动管理和注册机制 :Platform_device 和 Platform_driver . Linux 中大部分的设备驱动,都可以使用这套机制 , 设备用 P ...

  4. Linux kernel驱动相关抽象概念及其实现 之“bus,device,driver”

    bus,device,driver三个很重要的概念贯穿Linux内核驱动架构,特转载一篇博文: (转载自http://blog.csdn.net/gdt_a20/article/details/642 ...

  5. Linux platform设备简介

    Technorati 标签: Linux platform     Linux在2.6内核中,针对一系列设备驱动,提供新的管理框架,成为platform机制,推出的目的,在于隔离驱动的资源和实现,使得 ...

  6. Linux Platform驱动模型(二) _驱动方法

    在Linux设备树语法详解和Linux Platform驱动模型(一) _设备信息中我们讨论了设备信息的写法,本文主要讨论平台总线中另外一部分-驱动方法,将试图回答下面几个问题: 如何填充platfo ...

  7. Linux Regulator Framework(2)_regulator driver

    转自蜗窝科技:http://www.wowotech.net/pm_subsystem/regulator_driver.html 说实话,这篇好难懂啊... 1. 前言 本文从regulator d ...

  8. [中英对照]Device Drivers in User Space: A Case for Network Device Driver | 用户态设备驱动: 以网卡驱动为例

    前文初步介绍了Linux用户态设备驱动,本文将介绍一个典型的案例.Again, 如对Linux用户态设备驱动程序开发感兴趣,请阅读本文,否则请飘过. Device Drivers in User Sp ...

  9. Linux Platform驱动模型(二) _驱动方法【转】

    转自:http://www.cnblogs.com/xiaojiang1025/archive/2017/02/06/6367910.html 在Linux设备树语法详解和Linux Platform ...

随机推荐

  1. SQL server 2008 数据库企业版安装教程图解

    SQL Server 2008是一个重大的产品版本,它推出了许多新的特性和关键的改进,使得它成为至今为止的最强大和最全面的SQL Server版本.  在现今数据的世界里,公司要获得成功和不断发展,他 ...

  2. 弹出层是iframe引入的页面,如果用js进行隐藏呢?

    <script> $(document).ready(function(){ $('.bjfh').click(function(){ parent.document.getElement ...

  3. Windows PE 之 MASM32 环境搭建

    操作系统 :Windows 10 IDE   :VS2015 MASM版本   :V11 MASM下载地址:http://masm32.com masm32安装一路确认.OK (由于win10兼容性问 ...

  4. 转:如何理解c和c ++的复杂类型声明

    本文作者girlrong是网易广州社区的C语言版版主,这篇文章被选在精华区.很是不错,不敢独享!据说她乐于助人,虚心诚恳,颇受网友欢迎.只可惜现在已退隐江湖了.在最近学习C语言过程中,了解些前辈大牛的 ...

  5. leetcode 141. Linked List Cycle ----- java

    Given a linked list, determine if it has a cycle in it. Follow up:Can you solve it without using ext ...

  6. [codeforces 391D2]Supercollider

    这题觉得似乎不难的样子…… 但硬是没有做出来,真是不知说什么好喵~ 注意到没有两条共线的线段具有公共点,没有重合的线段 说明每个十字形最多涉及一个水平线段和一个竖直线段 这说明我们可以二分了:每条线段 ...

  7. css2图片边框

    用父元素的背景作为边框图片 父元素的背景既可以是不平铺的成品边框图片,也可以是平铺的图片,填充子元素和父元素之间的padding 然后给子元素设置背景色或背景图覆盖掉父元素的背景图.

  8. ABBYY FineReader出现错误代码258

    ABBYY FineReader 12OCR文字识别软件能够快速方便地将扫描纸质文档.PDF文件和数码相机的图像转换成可编辑.可搜索的文本,包括Word.Excel.文本文档.PPT等格式,受到不少用 ...

  9. linux包之bash之内置命令ulimit

    概述 [root@localhost ~]# rpm -qa|grep bashbash-4.1.2-15.el6_4.x86_64 linux limits.conf 配置 limits.conf ...

  10. OpenJudge计算概论-Tomorrow never knows【输入日期计算下一天的日期】

    /*====================================================================== Tomorrow never knows? 总时间限制 ...