Linux设备驱动模型(二)

这篇具有很好参考价值的文章主要介绍了Linux设备驱动模型(二)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基于linux-3.14.16
设备模型(LDM)包括,总线、驱动、设备

一、总线及其api

Linux设备驱动模型(二)

1、注册一个总线

以i2c总线为例,下面基本表现出了注册一个总线的过程。
1、定义一个总线bus_type,填充几个回调
其中几个比较重要 ,
match,总线设备和总线驱动的匹配规则
probe,总线设备和总线驱动匹配后将会执行的回调

2、调用bus_register注册总线
Linux设备驱动模型(二)

3、看看注册总线的接口 bus_register
Linux设备驱动模型(二)

分配总线的 subsys 私有数据(subsys_private)
总线维护的驱动和设备列表就在这个结构体里面

这里注意 priv->drivers_autoprobe = 1; 设置为1,,,后面分析注册总线驱动会用到
说明所有的总线驱动将在注册的时候执行 driver_attach(drv);

二、驱动及其api

Linux设备驱动模型(二)

1、注册驱动的过程

driver/base/driver.c

driver_register注册一个总线驱动
Linux设备驱动模型(二)

有这么重要几步

driver_find
按驱动的名字,从总线查找驱动(注册到总线上的驱动,在总线上有维护),如果已经存在,返回-EBUSY

bus_add_driver
总线驱动加入总线
最终驱动在bus的链表(bus->p->klist_drivers)保存,,具体跟踪 bus_add_driver 可以了解

kobject_uevent
这个是跟热插拔事件有关,很明显发了一个 KOBJ_ADD 消息

1)bus_add_driver

下面我们看下,总线驱动是怎么加入到总线的,以及要做的一些处理![在这里插入图片描述]Linux设备驱动模型(二)

如果没有总线,直接返回 -EINVAL,
很好理解,在注册总线驱动之前没有指定注册到哪个总线。
Linux设备驱动模型(二)

为驱动对象分配私有数据
以下为是总线驱动的处理,先分配一个驱动的私有数据,可以理解为总线驱动的组合对象
Linux设备驱动模型(二)

这里就将总线驱动加入到,总线维护,是一个链表里面,
这里注意,总线里面总能找到在其上注册的驱动。。。。。
将总线驱动加入到总线的驱动列表,并处理总线上的设备匹配
Linux设备驱动模型(二)

最后我们看到,
后面看看driver_attach是怎么做的总线匹配的
之前注册总线的时候, drivers_autoprobe=1;所以 driver_attach 将会执行。。。

1)driver_attach

driver_attach - try to bind driver to devices.
Linux设备驱动模型(二)
bus_for_each_dev是遍历总线列表上维护的总线设备,,去执行回调处理,直接看回调__driver_attach干了什么

第一个参数是总线上的设备,第二个参数是要注册的总线驱动。。
Linux设备驱动模型(二)

1、执行总线的 match 回调
首先去是调用总线设置的match回调函数,处理总线设备和驱动,看是否匹配
Linux设备驱动模型(二)
Linux设备驱动模型(二)

2、执行总线或驱动上的 probe 回调
Linux设备驱动模型(二)
Linux设备驱动模型(二)
调用了really_probe,看really_probe做了什么,如果bus有probe,执行,否则执行总线驱动的probe
Linux设备驱动模型(二)
这里我们了解到 __driver_attach 的作用,,__driver_attach 比较重要,,他是总线设备和总线驱动匹配的实质。。

__driver_attach
对注册总线驱动所属的总线上的设备,一一匹配,匹配成功,,将会执行总线或驱动的 probe 。


这里我们了解了总线驱动的注册过程,一般我们在自定义总线的时候,会封装一个注册总线驱动的接口,这个接口最终会调用driver_register

三、设备及其api

Linux设备驱动模型(二)

1、注册设备的过程

drivers/base/core.c

Linux设备驱动模型(二)

最终调用device_add,看看device_add干了什么
添加设备对象到驱动模型
Linux设备驱动模型(二)
总线设备的一些处理,设备如果属于某个总线,将会做这些处理,
1、将设备加到总线的设备链表,创建一些文件
2、产生热插拔事件
3、检查执行probe,表面是probe,但里面做了一些工作,具体分析
Linux设备驱动模型(二)
Linux设备驱动模型(二)

1、总线设备的匹配工作bus_probe_device

如果设备属于某个总线,将会执行bus_probe_device
没有bus,直接返回了
Linux设备驱动模型(二)
Linux设备驱动模型(二)

2、device_attach

如果设备没有匹配的驱动,就遍历总线的驱动链表,执行回调__device_attach
Linux设备驱动模型(二)
我们看看 __device_attach做了什么
Linux设备驱动模型(二)
匹配成功了就接着执行probe,否则跳过这个驱动
Linux设备驱动模型(二)
可以看到,匹配最终是调用总线的match回调函数完成的
Linux设备驱动模型(二)
probe最终会调用到really_probe,最终会调用总线的probe或者驱动的probe,之前我们在总线驱动那一节分析过。

同样的,我们在自定义总线的时候,一般实现注册总线设备的接口,这个接口最终也会调用到device_register来实现设备添加。总线设备也会在device上面做扩展。

四、class


参考i2c总线,以助理解,总线、驱动和设备的关系文章来源地址https://www.toymoban.com/news/detail-453808.html

到了这里,关于Linux设备驱动模型(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux Mii management/mdio子系统分析之二 mdio总线-设备-驱动模型分析

    (转载)原文链接:https://blog.csdn.net/u014044624/article/details/123303139       接着上篇文章继续分析mdio子系统,本章主要介绍mdio子系统的驱动模型,当然了介绍mdio子系统的驱动模型,就绕不开linux系统设备-总线-驱动模型,所有的总线类的驱动,基本上都可以理解为继承自linux系

    2024年01月17日
    浏览(48)
  • Linux设备驱动程序(一)——设备驱动简介

    这一部分主要是用来介绍 Linux 设备驱动程序的一些基本概念,包括:Linux 设备驱动程序的作用、内核功能的划分、设备和模块的分类以及版本编号。 设备驱动程序就像一个个的“黑盒子”,使某个特定硬件响应一个定义良好的内部编程接口,这些操作完全隐藏了设备的工作

    2024年02月05日
    浏览(88)
  • linux设备驱动(5)--设备树

    代码学习资料来源于: 第6.1讲 Linux设备树详解-什么是设备树?_哔哩哔哩_bilibili 仅用于个人学习/复习,侵联删 在linux内核3.x版本之后,linux内核开始使用设备树, 设备树描述开发板上的硬件信息 。 如上图所示,树的主干就是系统总线,IIC控制器,GPIO控制器,SPI控制器等都

    2024年02月11日
    浏览(37)
  • Linux驱动之INPUT设备驱动

    目录 一、开发环境 二、编写按键input设备的注册与事件上报         2.1 修改设备树文件                 1 添加 pinctrl 节点                 2、添加 KEY 设备节点                 3、检查 PIN 是否被其他外设使用         2.2 驱动程序编写      

    2024年02月07日
    浏览(50)
  • Linux设备驱动之SPI驱动

    Linux下SPI驱动分成两部分:主机驱动和设备驱动。 主机驱动:         主机侧SPI控制器使用 struct spi_master 描述,该结构体中包含了SPI控制器的序号(很多SoC中存在多个SPI控制器),片选数量,SPI信息传输的速率,配置SPI模式的函数指针(4种模式),实现数据传输的函数指针

    2023年04月11日
    浏览(55)
  • 4、Linux驱动开发:设备-设备号&设备号注册

    🍅点击这里查看所有博文   随着自己工作的进行,接触到的技术栈也越来越多。给我一个很直观的感受就是,某一项技术/经验在刚开始接触的时候都记得很清楚。往往过了几个月都会忘记的差不多了,只有经常会用到的东西才有可能真正记下来。存在很多在特殊情况下有

    2024年02月15日
    浏览(57)
  • Linux设备驱动——第三章字符驱动

    当对幸福的憧憬过于急切,那痛苦就在人的心灵深处升起。——加缪 本章的目的是编写一个完整的字符设备驱动。我们开发一个字符驱动是因为这一类适合大部分简单的硬件设备。字符驱动也比块驱动易于理解。本章的最终目的是编写一个模块化的字符驱动,但是我们不会在

    2024年02月08日
    浏览(83)
  • Linux 驱动学习笔记 ——(1)字符设备驱动

    《【正点原子】I.MX6U嵌入式Linux驱动开发指南》学习笔记 字符设备是 Linux 驱动中最基本的一类设备驱动,字节设备就是按照字节流来读写的设备,常见的字符设备包括:LED、蜂鸣器、按键、I2C 以及 SPI 等。 Linux 中一切皆文件,字符设备驱动加载成功后会在 /dev 目录下生成相

    2024年02月08日
    浏览(56)
  • Linux驱动开发笔记(四):设备驱动介绍、熟悉杂项设备驱动和ubuntu开发杂项设备Demo

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/134533533 红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中… 上一篇:《Linux驱动开发笔记(三

    2024年02月05日
    浏览(53)
  • 正点原子嵌入式linux驱动开发——Linux 网络设备驱动

    网络驱动是linux里面驱动三巨头之一 ,linux下的网络功能非常强大,嵌入式linux中也常常用到网络功能。前面已经讲过了字符设备驱动和块设备驱动,本章就来学习一下linux里面的 网络设备驱动 。 本次笔记中讨论的都是有线网络! 提起网络,一般想到的硬件就是“网卡”。在

    2024年01月17日
    浏览(71)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包