[platform]Device和Driver注册顺序

Posted aaronGao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[platform]Device和Driver注册顺序相关的知识,希望对你有一定的参考价值。

1. 设备和驱动注册,无论谁先谁后,都可以通过查询总线进行匹配

  • 设备挂接到总线上时,与总线上的所有驱动进行匹配(用bus_type.match进行匹配),如果匹配成功,则调用bus_type.probe或者driver.probe初始化该设备,挂接到总线上如果匹配失败,则只是将该设备挂接到总线上。
  • 驱动挂接到总线上时,与总线上的所有设备进行匹配(用bus_type.match进行匹配),如果匹配成功,则调用bus_type.probe或者driver.probe初始化该设备;挂接到总线上如果匹配失败,则只是将该驱动挂接到总线上。

平台的device和driver注册函数分别为:platform_device_register/platform_driver_register

2. 设备和驱动执行顺序

在内核源代码中,platform设备的初始化(注册)用arch_initcall()调用,他的initcall的level为3.

而驱动的注册用module_init()调用,即device_initcall(),他的initcall的level为6.

kernel初始化时([email protected]/main.c), 按照内核链接文件中(arm系统:kernel/arch/arm/vmlinux.lds)的__initcall_start段的序列依次执行,这样level小的初始化函数先于level大的初始化函数被调用,所以platform设备先被注册,驱动加载时会调用驱动程序中probe(), 扫描系统中已注册的设备,找到匹配设备后将驱动和设备绑定。

下面介绍设备注册的两种方式

  • 在arch/arm/mach-***中注册设备:就像arch/arm/mach-s3c2410/mach-qt2410.c中的设备qt2410_cs89x0, 通过platform_add_devices将platform_device结构体中定义的所有设备注册到总线上去,而如何注册上去呢?mach-qt2410.c在CONFIG_**被选中->MACHINE_START(QT2410, "QT2410")->qt2410_machine_init->platform_add_devices->qt2410_devices, 该结构体中包含了设备的属性
  • 在driver驱动文件中注册设备:如串口驱动,在imx.c中添加platform_devices关于串口的属性,然后在module_init的时候可以先执行platform_device_register完成设备注册,然后执行platform_driver_register完成驱动注册。

mach-qt2410.c如何被选中?直接cp arch/arm/configs/s3c2410_deconfig .config, make menuconfig, 关于cpu的CONFIG_定义就完成了,相应的mach-qt2410.c也就被编译到内核中。

 当然,当内核过度到3.0以后,出现了dts,模式就不像第一种方式了

//TODO:

以上是关于[platform]Device和Driver注册顺序的主要内容,如果未能解决你的问题,请参考以下文章

[platform]Device和Driver注册顺序

Platform device/driver注册过程 (转)

注册platform驱动-15

linux platform device/driver

adreno源码系列注册platform_driver

adreno源码系列注册platform_driver