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)

大家都在看

  • 实验一-密码引擎-加密API实现与测试

    任务详情 1 下载并查找GMT 0018-2012密码设备应用接口规范原始文档进行学习 (5分) 2 实现GMT 0018-2012密码设备应用接口规范的接口函数,至少实现:1)设…

    Linux 2023年6月8日
    092
  • 正则表达式在grep中的使用

    GREP用法 grep "after" profile #查找文件内的包含after单词的行 grep -n "after" profile…

    Linux 2023年6月11日
    099
  • 武装你的WEBAPI-OData常见问题

    本文属于OData系列 Intro 非常喜欢OData,在各种新项目中都使用了这个技术。对于.NET 5.0, OData推出了8.0preview,于是就试用了一下。发现坑还是非…

    Linux 2023年6月6日
    093
  • 07-MyBatis中的动态标签

    MyBatis中的动态标签 1、if标签 if标签是为了判断传入的值是否符合某种条件,比如是否不为空 2、where标签 where标签可以用来做动态拼接查询条件,当和 if标签配…

    Linux 2023年6月7日
    0102
  • k8s/kubeadm 生产环境高可用集群部署

    kubeadm 生产环境集群部署 基本环境配置 kubeadm 安装方式自 1.14 版本以后,安装方法几乎没有任何变化,此文档可以尝试安装最新的 k8s 集群, centos 采…

    Linux 2023年6月14日
    099
  • 位运算(一)

    位运算的一般应用 功能 例子 运算 去掉最后一位 1110101->111010 x>>1 在最后加0 1110101->11101010 x< 通过…

    Linux 2023年6月8日
    0144
  • 搭建Redis三主三从集群

    Redis三主三从集群规划 10.0.128.19 使用端口 7000 700110.0.128.22 使用端口 7002 700310.0.128.23 使用端口 7004 70…

    Linux 2023年6月8日
    0113
  • Android系统中有哪些日志信息和工具

    Android系统日志和工具 我们经常需要查看设备里面的各种日志信息。所以有必要了解android系统里面有哪些日志,以及用什么方式可以提取这些日志。以我手头的红米note4xpl…

    Linux 2023年6月7日
    099
  • 《闲扯Redis十一》Redis 有序集合对象底层实现

    一、前言 Redis 提供了5种数据类型:String(字符串)、Hash(哈希)、List(列表)、Set(集合)、Zset(有序集合),理解每种数据类型的特点对于redis的开…

    Linux 2023年5月28日
    0104
  • git 那些事儿 —— 基于 Learn Git Branching

    推荐一个 git 图形化教学网站:Learn Git Branching,这个网站有一个沙盒可以直接在上面模拟 git 的各种操作,操作效果使用图形的方式展示,非常直观。本文可以看…

    Linux 2023年5月27日
    0132
  • Danskin’s Theorem

    Statement 1 假设 (\phi(x,z)) 为含有两个变量的连续函数: (\phi : \mathbb{R}^n \times Z \rightarrow \mathbb…

    Linux 2023年6月7日
    089
  • 每天一个 HTTP 状态码 201

    201 Created 表示请求成功,在服务器端创建了一个新资源… 201 Created 201 Created 表示客户端的请求已经成功完成,结果是创建了一个新资源…

    Linux 2023年6月7日
    0131
  • ThinkPHP 使用 think-queue 实现 redis 消息队列

    简单介绍:消息队列中间件是大型系统中的重要组件,已经逐渐成为企业系统内部通信的核心手段。它具有松耦合、异步消息、流量削峰、可靠投递、广播、流量控制、最终一致性等一系列功能,已经成为…

    Linux 2023年5月28日
    0103
  • VMware 和 Linux 的安装

    常见的虚拟机软件有 VMware Workstation(简称 VMware)、VirtualBox、Microsoft Virtual PC 等,本文以 VMware 为例来讲解…

    Linux 2023年5月27日
    089
  • 读软件测试艺术感悟

    断断续续的看,总觉得好像是漏掉了什么,而且一直 想着还有什么事情未做,却静不下心来去细品 开篇用自测评价测试,举例三角形例子写出等价类边界值的方法给测试人员举一个例子,更好的使测试…

    Linux 2023年6月8日
    0105
  • 选择排序算法C语言实现

    选择排序C语言实现 int select_sort(int *list, int len) { int i = 0; int j = 0; int tmp = 0; int sma…

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