zoukankan      html  css  js  c++  java
  • Linux下platform设备以及platform设备和驱动注册的先后顺序

    platform是Linux系统提供的一种管理设备的手段,所有SOC系统中集成的独立的外设控制器、挂接在SOC内存空间的外设等都属Platform设备。如ARM S3C6410处理器中,把内部集成的I2C、PTC、SPI、LCD、看门狗控制器都归纳为Platform设备,而这些设备本身就是字符设备。由此可见Platform中的设备是不分字符设备还是块设备。 (字符设备和块设备的区别在于前者只能被顺序读写,后者可以随机访问。大多数设备为字符设备,以字节为单位,实现file_operations结构体。而如磁盘为块设备,以块为单位接受输入和返回输出。实现block_device_operations结构体.)
    在内核源代码中,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(),扫描系统中已注册的设备,找到匹配设备后将驱动和设备绑定。

    1、一些通用的设备的注册采用优先级高于module_init()的调用方式,如subsys_initcall(),这样与这些设备相关的驱动会后于它们加载,驱动中可以扫描到这些设备;
    2、另一些比较独立的设备在驱动中直接注册,它内嵌于驱动之中(如放在驱动中的probe()函数中),当驱动卸载时,设备也会同时卸载。这种设备的系统调用顺序上看是driver_registe()-->device_register(),它们不是先后关系,而是包含关系。

    driver_register先于device_register执行,也没有出现于嵌套之中,而且这种方法不常用,比如I2C,适配器先需要于设备注册。 象USB 的hcd驱动,先注册驱动,后注册设备。
    在注册设备时,遍历设备所在总线,找到与设备匹配的驱动,再调用device_attach()--> driver_probe_device()。
    这时,会调用设备所在总线的probe()函数,如果没有这个函数,则调用匹配到的驱动的probe()函数,这样驱动的扫描函数就被执行了。当然如果前面一步没有找到与要注册的设备匹配的驱动,这个设备注册也就失败了。
    先注册设备的那种情况,是调用driver_attach()-->driver_probe_device()。











  • 相关阅读:
    DOS常用命令
    SQL查询优化:详解SQL Server非聚集索引(转载)
    SQLServer索引
    SQL注入技术专题—由浅入深【精华聚合贴】
    DVWA 1.9 通关秘籍
    高手养成计划基础篇-Linux第二季
    【摩斯电码】我是如何通过一张小纸条渗透进了妹子的心
    阿里旗下蚂蚁金服副总:有望3-5年内消灭伪基站
    【病毒分析】对一个vbs脚本病毒的分析
    【安全热点】阿里巴巴月饼门,观点两极化,孰对孰错?
  • 原文地址:https://www.cnblogs.com/God-boy1/p/3674180.html
Copyright © 2011-2022 走看看