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 = 0;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的出现等

android 驱动(7)---.设备、总线、驱动相关推荐

  1. linux驱动:设备-总线-驱动(以TI+DM8127中GPIO为例)

    一:说明:这次学习设备-总线-驱动是以TI+DM8127的GPIO为例 1.GPIO资源注册到omap_hwmod链表中 2.初始化GPIO 3.将GPIO注册到plarform层 4.将GPIO注册 ...

  2. Linux 设备总线驱动模型(转载)

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

  3. 基于linux4.4程序,linux驱动之i2c总线驱动调用分析【基于linux4.4】

    平台:RK3399 使用设备树描述板级资源: 框架: linux i2c框架同样采用分层.分离的模式设计:从上到下分为  app调用层.i2c core层.驱动层:驱动层又分为 cpu平台 i2c控制 ...

  4. linux平台实现USB虚拟总线驱动一(原理以及开发流程)

    by fanxiushu 2019-11-07 转载或引用请注明原始作者. 之前的文章阐述过在windows平台下,如何实现USB虚拟总线驱动, 以及如何在windows平台采集真实USB设备的数据, ...

  5. SylixOS iMX6平台I2C总线驱动

    原理概述 I2C总线驱动概述 I2C总线驱动是I2C适配器的软件实现,提供I2C适配器与从设备间完成数据通信的能力,比如起始,停止,应答信号和MasterXfer的实现函数.驱动程序包含初始化I2C总 ...

  6. 总线驱动--SPI驱动

    总线驱动–SPI驱动 文章目录 总线驱动--SPI驱动 SPI主机驱动 1.spi_master 申请与释放 2.spi_master 的注册与注销 SPI设备驱动 SPI 设备和驱动匹配过程 I.M ...

  7. 总线驱动---IIC驱动

    总线驱动-IIC驱动 文章目录 总线驱动---IIC驱动 Linux I2C体系结构 IIC-core(协议层) IIC总线驱动 IIC设备驱动 I.MX6U 的 I2C 适配器驱动分析 I2C 设备 ...

  8. usb serial port 驱动_tty初探 — uart驱动框架分析

    写在前面: 我们没有讲UART驱动,不过我们认为,只要系统学习了第2期,应该具备分析UART驱动的能力,小编做答疑几年以来,陆陆续续有不少人问到UART驱动怎么写,所以今天就分享一篇深度长文(1700 ...

  9. Windows CE SDHC驱动简析(1)-驱动架构(基于WinCE5.0 SMDK2410 BSP的SDHC驱动)

    Windows CE的SD卡驱动包括总线驱动(bus driver),主控制器驱动(host controller driver)和客户端驱动(client driver). 总线驱动是客户端驱动和主 ...

  10. 嵌入式linux驱动-LCD液晶屏驱动

    这里写目录标题 LCD简介 一些性能参数 eLCDIF 接口 linux下的LCD驱动 Framebuffer 设备 LCD 驱动介绍 LCD 驱动程序 LCD 屏幕 IO 配置 LCD 屏幕参数节点 ...

最新文章

  1. 另一个ExcelHelper
  2. js粘贴板为什么获取不到图片信息_JavaScript 学习笔记(3):图片库
  3. Java程序员常犯的几类错误
  4. 月薪20+的Android面试都问这些问题(含答案)
  5. C/C++位域知识小结
  6. android开发复制文本,如何在Android应用中以编程方式复制文本?
  7. 关于Unity中OnGUI()的简单使用
  8. HAUT校赛--最大奇子段和
  9. 《Python算法教程_中文版》pdf
  10. 利用vbs脚本编写Windows XP/2003序列号更改器
  11. 支持向量回归(SVR)数据预测
  12. iis发布网站无法连接服务器,IIS网站部署常见问题处理
  13. Android面试题Java基础篇
  14. filters过滤器的简单使用
  15. JAVAWeb开发:Tomcat出现The origin server did not find a current representation for the target reso...的问题
  16. ssm毕设项目校园排球联赛管理系统y513u(java+VUE+Mybatis+Maven+Mysql+sprnig)
  17. 传统产业数字化转型四个发展阶段
  18. Pandas数据可视化原来也这么厉害!
  19. OpenGL: 位图字体
  20. 【Pytorch分布式训练】在MNIST数据集上训练一个简单CNN网络,将其改成分布式训练

热门文章

  1. squid via检测转发循环
  2. Java学习日报—Java并发—2021/11/22
  3. springboot+springcloud相关面试题
  4. java 高级工程师面试
  5. 配置win2003 server IIS的总结,为什么IIs的工作进程会在空闲时间释放的问题。同时学会了throw的真正含义,throw的真正含义就是导致程序停止,崩溃,很简单,网摘也有记录。...
  6. 2018牛客多校第一场 B.Symmetric Matrix
  7. centos-7部署docker
  8. 常用的redis命令
  9. 在linux用ueditor遇到的问题
  10. 第二次作业动手动脑的解答