博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
platform_device和platform_driver的注册过程,及probe函数何时调用的分析
阅读量:3524 次
发布时间:2019-05-20

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

    platform_device_系列函数,实际上是注册了一个叫platform的虚拟总线,使用约定是如果一个不属于任何总线的设备,例如蓝牙,串口等设备,都需要挂在这个虚拟总线上。

        add  platform_device之后,需要注意的一个地方是这里,add是通过系统初始
化里边调用
platform_add_devices
把所有放置在板级platform_device数组中的所有platform_device逐次调用platform_device_register添加到系统中去,platform_device_register中会调用
platform_device_add
(注意:这个同
platform_add_devices
有本质区别的),
实platform_device_add()包括device_add(),只不过要先注册resources
,全部add到系统之后,便可以通过platform的操作接口来获取platform_device中的resource资源,比如地址、中断号等,以进行request_memregion、ioremap(
将resource分配的物理地址映射到kernel的虚拟空间来)和request_irq操作。platform的操作接口包括:


@|||  69     platform_get_irq                                              

@|||  70     platform_get_irq_byname                                       

@|||  71     platform_get_resource

@|||  72     platform_get_resource_byname


        add操作是在系统初始化时完成,因此在后续挂在platform虚拟总线上的设备在驱动模块insmod到系统时,驱动代码里边就可以通过上面函数来获取对应platform_device的resource,比如在module_init中我们会调用plarform_driver_register,这个会引用到platform_driver中的probe函数,而probe函数中则可以进行cdev的初始化及cdev_add的操作,
在进行这些操作之前,可以通过get_resource来获取寄存器物理基地址,然后ioremap到kernel的虚拟空间来,这样驱动就可以正式操纵改设备的寄存器了。


        至于platform_driver的注册过程,及
何时调用probe函数
,下面引用一下kernel中的调用关系就清晰明了了:


        驱动注册的时候
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()-& gt;比较strncmp(pdev->name, drv->name, BUS_ID_SIZE),
如果相符就调用platform_drv_probe()->driver->probe(),如果probe成 功则绑定该设备到该驱动
其实简单点说就是如下这样:

platform_device是在系统初始化(驱动、设备注册之前)时就已经提前add到系统之中的

platform_driver是在驱动初始化的时候注册的,通过platform_driver_register来注册,该注册函数最终会调用到platform_driver中的probe函数,因此可以将cdev(前提是字符设备的驱动开发)的一系列操作放到platform_driver的probe函数中去实现,这样就把cdev挂到platform bus上去了,

转载地址:http://mhqqj.baihongyu.com/

你可能感兴趣的文章
未调用fflush产生的图片文件无法打开问题
查看>>
SQL 约束(二)
查看>>
SQL ALTER用法(三)
查看>>
SQL where子句及查询条件语句(六)
查看>>
SQL 连接JOIN(九)
查看>>
linux VM虚拟机可以ping通主机,但主机无法ping通虚拟机
查看>>
linux 错误码
查看>>
C++ 中Struct与typedef struct总结
查看>>
WNetAddConnection2调用失败,错误码1200/1312
查看>>
POI读写Excel的基本使用
查看>>
淘宝网站的架构演进
查看>>
设置zookeeper开机自启动流程
查看>>
CentOS安装mysql5.7的教详细流程
查看>>
项目整合微信扫码登录功能
查看>>
分布式文件系统FastDfs的搭建
查看>>
Springboot项目利用Java客户端调用FastDFS
查看>>
全文检索工具elasticsearch的安装和简单介绍
查看>>
利用Kibana学习全文检索工具elasticsearch
查看>>
SpringBoot在Test测试类或自定义类中通过@Autowired注入为null
查看>>
使用docker搭建YAPI服务
查看>>