regmap子系统-之-readmap_read读7bit寄存器问题定位

2023-12-13 09:30

本文主要是介绍regmap子系统-之-readmap_read读7bit寄存器问题定位,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

regmap子系统

  • regmap子系统框架介绍
    • regmap子系统的作用
    • regmap子系统框架
  • regmap子系统数据结构与源代码
  • i2c接口的codec驱动为例,说明regmap使用
  • volatile_reg总结
  • 7bit寄存器,9bit值,使用regmap_read读寄存器的值

regmap子系统框架介绍

regmap子系统的作用

随着linux内核的设备驱动越来越多,内核中有很多设备使用iic和spi等总线进行控制,尤其在hwmon子系统、regulator子系统中,大部分的设备基本上就是i2c、spi设备。在之前,如针对i2c设备我们通过接口i2c_transfer、i2c_master_send等接口进行读写操作,而针对spi 设备我们则通过接口spi_write、spi_sync、spi_async等接口实现读写操作。虽然直接调用i2c或spi设备的操作接口也很方便,但这些子系统中的读写接口中充斥着大量的i2c、spi操作,以及重复代码。
基于这些方面的考虑吧,linux内核提供了regmap子系统,而这些子系统针对spi、i2c设备的操作提供了一次抽象,对外提供对spi、i2c等设备相关寄存器的统一访问接口(regmap_write、regmap_read)等,而在regmap子系统内部再通过调用i2c、spi等设备的寄存器读写接口,实现对具体设备寄存器的读写操作。通过使用regmap子系统提供的接口,使hwmon、regulator子系统中基本上很少出现直接通过i2c、spi接口读写i2c/spi设备寄存器操作,取而代之的则是regmap_write/read等接口,同时regmap子系统提供缓存机制,也可以减小对设备的访问次数。

regmap子系统框架

regmap子系统主要包含regmap、regmap_bus两大部分,其中regmap表示一个慢速i/o设备的reg操作的映射、regmap_bus则表示一类慢速i/o设备的reg操作(如i2c设备可定义对应的regmap_bus,提供寄存器的读写操作接口、spi设备也定义对应的remap_bus,提供寄存器的读写接口)。

1、具体的regmap_bus,可提供对应的regmap创建接口,可由内核其他设备驱动模块调用(如我们上一专栏中使用regmap_init_i2c接口,创建i2c_client对应的regmap);
在这里插入图片描述

2、regmap子系统对外提供了regmap的寄存器读写接口,包含regmap_write、regmap_read、regmap_bulk_write、regmap_bulk_read等接口;
在这里插入图片描述

3、对于regmap而言,若该regmap是依附于具体regmap_bus,则借助regmap_bus的读写接口,实现对i/o设备的寄存器访问操作。
在这里插入图片描述

4、regmap内部提供了一些操作接口,实现对regmap_bus接口的封装调用(如包含对缓存的访问操作、在对寄存器进行写操作前,先对寄存器、值进行format操作,然后再调用remap_bus的读写接口进行寄存器的读写接口);
在这里插入图片描述
先使用regcache_read去读缓存的值,如果读失败,继续会调用map->reg_read去读实际寄存器的值,这个其实调用的还是regmap_bus得接口

	ret = map->bus->read(map->bus_context, map->work_buf,map->format.reg_bytes + map->format.pad_bytes,val, val_len);

5、借助于regmap_bus的读写接口,最终再调用具体外设的访问接口(如针对i2c设备,则调用i2c_transfer、i2c_master_send等接口实现对具体i2c设备的进行读写操作)。
在这里插入图片描述
在这里插入图片描述
针对regmap子系统而言,regmap_bus的实现由内核层完成、属于regmap子系统的一部分(目前实现了regmap_i2c、regmap_spi、regmap_mmio等regmap_bus),内核层通过实现remap_i2c、regmap_spi,只需要使用i2c、spi的regmap创建接口,然后就可使用regmap提供的操作接口regmap_write、regmap_read等,实现对这两类设备的访问操作。

regmap子系统数据结构与源代码

我们知道大多的传感器芯片(io扩展芯片、温度传感器、电源管理芯片、input设备、hwmon类型设备等等),基本上都是spi设备或者iic设备,而在这些设备的业务处理接口中充斥着大量的iic设备读写、spi设备读写的调用。因此linux内核子系统提供了regmap子系统,该子系统对外提供统一的读写接口,我们只需要在驱动的probe、remove(xxx_i2c_dev_probe、xxx_spi_dev_probe接口)接口中,完成regmap的创建,接着在具体的业务处理接口中直接调用regmap子系统提供的读写接口即可。

而regmap子系统主要的好处有两个:
1.提供统一的读写接口
2.提供缓存机制。
为了实现统一的读写接口,regmap子系统提供了regamp数据结构、regmap_bus数据结构、regcache_ops数据结构等,下面我们来简要说明下。

针对regmap子系统而言,其提供的主要数据结构抽象可理解如下(数据结构间的关联图如下所示):

1、regmap_bus数据结构,该数据结构即对具体总线控制器map的抽象(i2c、spi模块均完成了regmap_bus的定义,其中定义了对i2c设备、spi设备的统一读写接口);
drivers/base/regmap/regmap-i2c.c
在这里插入图片描述
在这里插入图片描述
2、regmap数据结构即为对具体设备的map(如一个i2c设备、spi设备均需要一个regmap),而regmap里则包含regcache相关的支持、该regmap关联的regmap、寄存器是否可读写等接口;
在regmap_init函数里来填充regmap结构体
在这里插入图片描述

3、为了在进行regmap初始化时,对regmap进行初始化,regmap也提供了数据结构regmap_config,实现对regmap的初始化操作。

这篇关于regmap子系统-之-readmap_read读7bit寄存器问题定位的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/mahao1107/article/details/120434722
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/487949

相关文章

MySQL启动报错:InnoDB表空间丢失问题及解决方法

《MySQL启动报错:InnoDB表空间丢失问题及解决方法》在启动MySQL时,遇到了InnoDB:Tablespace5975wasnotfound,该错误表明MySQL在启动过程中无法找到指定的s... 目录mysql 启动报错:InnoDB 表空间丢失问题及解决方法错误分析解决方案1. 启用 inno

Java使用MethodHandle来替代反射,提高性能问题

《Java使用MethodHandle来替代反射,提高性能问题》:本文主要介绍Java使用MethodHandle来替代反射,提高性能问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录一、认识MethodHandle1、简介2、使用方式3、与反射的区别二、示例1、基本使用2、(重要)

电脑蓝牙连不上怎么办? 5 招教你轻松修复Mac蓝牙连接问题的技巧

《电脑蓝牙连不上怎么办?5招教你轻松修复Mac蓝牙连接问题的技巧》蓝牙连接问题是一些Mac用户经常遇到的常见问题之一,在本文章中,我们将提供一些有用的提示和技巧,帮助您解决可能出现的蓝牙连接问... 蓝牙作为一种流行的无线技术,已经成为我们连接各种设备的重要工具。在 MAC 上,你可以根据自己的需求,轻松地

Java 中的跨域问题解决方法

《Java中的跨域问题解决方法》跨域问题本质上是浏览器的一种安全机制,与Java本身无关,但Java后端开发者需要理解其来源以便正确解决,下面给大家介绍Java中的跨域问题解决方法,感兴趣的朋友一起... 目录1、Java 中跨域问题的来源1.1. 浏览器同源策略(Same-Origin Policy)1.

如何清理MySQL中的binlog问题

《如何清理MySQL中的binlog问题》:本文主要介绍清理MySQL中的binlog问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目http://www.chinasem.cn录清理mysql中的binlog1.查看binlog过期时间2. 修改binlog过期

如何解决yum无法安装epel-release的问题

《如何解决yum无法安装epel-release的问题》:本文主要介绍如何解决yum无法安装epel-release的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录yum无法安装epel-release尝试了第一种方法第二种方法(我就是用这种方法解决的)总结yum

IDEA下"File is read-only"可能原因分析及"找不到或无法加载主类"的问题

《IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题》:本文主要介绍IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题,具有很好的参... 目录1.File is read-only”可能原因2.“找不到或无法加载主类”问题的解决总结1.File

idea中project的显示问题及解决

《idea中project的显示问题及解决》:本文主要介绍idea中project的显示问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录idea中project的显示问题清除配置重China编程新生成配置总结idea中project的显示问题新建空的pr

redis在spring boot中异常退出的问题解决方案

《redis在springboot中异常退出的问题解决方案》:本文主要介绍redis在springboot中异常退出的问题解决方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴... 目录问题:解决 问题根源️ 解决方案1. 异步处理 + 提前ACK(关键步骤)2. 调整Redis消费者组

Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题

《Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题》:本文主要介绍Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录一、前言二、系统架构检测三、卸载旧版 Go四、下载并安装正确版本五、配置环境变量六、验证安装七、常见