linux设备模型及实例

1.linux设备模型基本概念

BUS(总线):用于关联设备和驱动,代表一个实际的物理总线(如USB、PCI bus)或虚拟总线(如platform bus),总线会提供与总线相关的驱动(driver)和设备(device)注册方法。

Device(设备):系统中的所有硬件设备,描述设备的名字、包含硬件资源、属性等信息。每个设备都有它从属的总线,但是不一定有他对应的驱动。

Class(设备类):一些复杂的设备需要编写很多驱动代码,如USB、EMMC、SD等。class为这些设备(device)提供一个父设备类,实现设备类的公共部分,简化驱动程序的开发。

Driver(驱动):硬件设备的驱动程序,实现对应设备的接口函数,包括初始化,设备基本操作函数等。

2.举例说明:

以emmc设备为例,系统中实现了mmc总线,负责所有智能卡设备及驱动的匹配。

drivers/mmc/core/core.c中的mmc_init()函数中调用mmc_register_bus()注册了mmc总线。

drivers/mmc/core/core.c中的mmc_init()函数中调用mmc_register_host_class()注册了mmc_host类。

2.1 总线mmc

实现如下接口

mmc_register_driver函数用于注册该总线下的驱动程序(mmc_driver类型)。

mmc_alloc_card用于创建总线下的设备(mmc_card类型)。

mmc_add_card用于将设备加入总线。

2.2 mmc总线上的驱动程序注册

driver/mmc/card/block.c的mmc_blk_init函数中注册了mmc_driver类型驱动,驱动实现中会注册块设备(在linux中会枚举出mmcblock的块设备节点)。

2.3 mmc总线上的设备注册

driver/mmc/core/mmc.c中的mmc_attach_mmc函数中实现了mmc_card设备的注册和加入总线。

2.4 class mmc_host

代表多媒体卡控制器类MultiMediaCard

由于emmc设备比较复杂,linux对这类设备抽象出了mmc_host的class 设备。

实现位置drivers/mmc/core/host.c

class 注册函数mmc_register_host_class。

实现如下接口:

mmc_alloc_host 申请class为mmc_host类型的设备,将新申请的设备和class进行关联

mmc_add_host 注册mmc_host类型的设备

mmc_remove_host 注销mmc_host类型的设备

mmc_free_host 释放mmc_host类型的设备

mmc_detect_change 功能辅助函数

接口内部完成公共部分的实现,如:mmc_alloc_host中注册的work mmc_rescan会完成emmc、sd卡的扫描工作。

2.5 sdhci设备

实现安全数字主机控制器接口驱动

实现位置drivers/mmc/host/sdhci.c

sdhci设备对mmc_host设备类进行封装,并实现sdhci特殊部分接口

2.6 platform总线上的emmc设备注册

设备树中定义了名字为”sdhci-dove”的设备

2.7 platform总线上的emmc驱动注册

drivers/mmc/host/sdhci-dove.c中注册了名字为”sdhci-dove”的平台设备驱动

2.8 emmc驱动实现方式

驱动和设备匹配后,驱动程序调用sdhci设备实现接口实现设备驱动的各种操作。

调用sdhci_pltfm_init初始化设备

调用sdhci_add_host增加设备。

设备操作函数也可以使用sdhci提供的实现。

Original: https://www.cnblogs.com/fanguang/p/12291861.html
Author: 反光
Title: linux设备模型及实例

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/578081/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 如何获取 Docker 容器的 IP 地址

    查询单个容器 IP 地址: 使用下面命令可以查看容器详细信息,里面包含 IP 地址信息: docker inspect <container id> </cont…

    Linux 2023年6月7日
    0100
  • docker:alpine使用logrotate切割日志

    最近在交付项目的时候使用了docker,大家都知道日志是项目定位问题的重要依据,但如果一开始项目本身没有对日志进行合理切割那就会导致长时间运行的项目日志文件大得编辑器打不开的情况。…

    Linux 2023年5月27日
    0117
  • ELK收集日志之logstash使用

    一、logstash使用 1.logstah收集文件日志 不难理解,我们的日志通常都是在日志文件中存储的,所以,当我们在使用INPUT插件时,收集日志,需要使用file模块,从文件…

    Linux 2023年6月14日
    0117
  • Vim配置文件-详解(.vimrc)

    Vim配置文件的作用 Vim启动时,会根据配置文件(.vimrc)来设置 Vim,因此我们可以通过此文件来定制适合自己的 Vim 所有系统用户在启动Vim时,都会加载这个配置文件。…

    Linux 2023年6月13日
    092
  • Java Web登录界面

    非常激动的开通了我的第一个博客,在这里希望大家能多多指点,相互学习。 一个简单的登录界面 首先我们先把这个登录分为三块: 一、数据库 数据库我用的是MYSQL; 二、前端 三、后台…

    Linux 2023年6月13日
    0115
  • Emacs Lisp 入门

    ;; This gives an introduction to Emacs Lisp in 15 minutes (v0.2d);;;; 英文原作者: Bastien / @bz…

    Linux 2023年6月13日
    0113
  • LeetCode 406.根据身高重建队列 | 解题思路及代码

    There are (n) people, we want them line up in the following way. Given a two-dimensional a…

    Linux 2023年6月13日
    096
  • Jenkins+svn自动化部署完整教程

    1、概述 Jenkins 是一个可扩展的持续集成引擎。主要用于持续、自动地构建/测试软件项目、监控一些定时执行的任务。Jenkins用Java语言编写,可在Tomcat等流行的se…

    Linux 2023年6月7日
    096
  • 代码规范浅谈

    代码规范这东西网上很容易百度到一堆,除了天下文章一大抄的问题,另外,多数只给了结果,原因没有充分说明,或者非常的纠结于大写小写,一个函数可以写几行的细节。感觉有点容易让新人误入歧途…

    Linux 2023年6月13日
    0109
  • 开放平台架构指南

    1.前言 2010年前,大型社交网站如腾讯QQ、新浪微博都搭建了开放平台。中小型互联网公司接入开放平台,能够获取社交平台的海量用户,有效的降低获客成本,获得社交平台的其他能力。对于…

    Linux 2023年6月6日
    082
  • 【Example】C++ 标准库多线程同步及数据共享 (std::future 与 std::promise)

    否则你会像听天书一样懵。(…) ==================================== 在任何语言的多线程编程当中,必然涉及线程的同步及数据的共享,方…

    Linux 2023年6月13日
    0121
  • (读书笔记)基于CMMI的软件工程及实训指导 第13-16章

    一、软件测试 软件测试是为了发现程序中的错误而执行的过程。测试只能证明软件有错,而不能保证软件程序没错。 1. 软件版本 Alpha版 公司内测版本 Beta版 对外公测版本 发布…

    Linux 2023年6月14日
    088
  • linux系统编码修改

    查看当前系统默认采用的字符集locale 查看系统当前编码echo $LANG如果输出为:en_US.UTF-8 英文zh_CN.UTF-8 中文 查看系统是否安装中文字符集loc…

    Linux 2023年6月6日
    0102
  • 自己写的文件夹图标修改脚本

    自己写了一个文件图标修改的Python脚本,只要把文件夹拖动到这个脚本上,就可以用文件夹中的图片和视频作为文件夹的封面。把图片或视频拖到脚本上,就可以把这个图片或视频用作其所在文件…

    Linux 2023年6月6日
    0165
  • 【MQTT】使用MQTT.fx上报温度到腾讯云

    打开 腾讯云官网, 注册并登录. 2.登录之后点击右上角的控制台点进去 3.在搜索框[物联网通信],点击进入 4.点击创建新产品 5.选择普通产品,名称随便,选择密钥认证,选择js…

    Linux 2023年6月13日
    0101
  • Keytool配置 Tomcat的HTTPS双向认证

    keytool 简介 Keytool 是一个 Java数据证书的管理工具, Keytool将密钥(key)和证书(certificates)存在一个称为 keystore的文件中。…

    Linux 2023年6月6日
    0135
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球