码迷,mamicode.com
首页 > 其他好文 > 详细

[platform]Device和Driver注册顺序

时间:2016-12-12 02:05:49      阅读:307      评论:0      收藏:0      [点我收藏+]

标签:str   mat   linu   device   call()   定义   init   form   通过   

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初始化时(kernel_init@init/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注册顺序

标签:str   mat   linu   device   call()   定义   init   form   通过   

原文地址:http://www.cnblogs.com/aaronLinux/p/6161028.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!