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寄存器问题定位的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/487949

相关文章

springboot3.4和mybatis plus的版本问题的解决

《springboot3.4和mybatisplus的版本问题的解决》本文主要介绍了springboot3.4和mybatisplus的版本问题的解决,主要由于SpringBoot3.4与MyBat... 报错1:spring-boot-starter/3.4.0/spring-boot-starter-

在 Spring Boot 中使用异步线程时的 HttpServletRequest 复用问题记录

《在SpringBoot中使用异步线程时的HttpServletRequest复用问题记录》文章讨论了在SpringBoot中使用异步线程时,由于HttpServletRequest复用导致... 目录一、问题描述:异步线程操作导致请求复用时 Cookie 解析失败1. 场景背景2. 问题根源二、问题详细分

解读为什么@Autowired在属性上被警告,在setter方法上不被警告问题

《解读为什么@Autowired在属性上被警告,在setter方法上不被警告问题》在Spring开发中,@Autowired注解常用于实现依赖注入,它可以应用于类的属性、构造器或setter方法上,然... 目录1. 为什么 @Autowired 在属性上被警告?1.1 隐式依赖注入1.2 IDE 的警告:

解决java.lang.NullPointerException问题(空指针异常)

《解决java.lang.NullPointerException问题(空指针异常)》本文详细介绍了Java中的NullPointerException异常及其常见原因,包括对象引用为null、数组元... 目录Java.lang.NullPointerException(空指针异常)NullPointer

Android开发中gradle下载缓慢的问题级解决方法

《Android开发中gradle下载缓慢的问题级解决方法》本文介绍了解决Android开发中Gradle下载缓慢问题的几种方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、网络环境优化二、Gradle版本与配置优化三、其他优化措施针对android开发中Gradle下载缓慢的问

关于Nginx跨域问题及解决方案(CORS)

《关于Nginx跨域问题及解决方案(CORS)》文章主要介绍了跨域资源共享(CORS)机制及其在现代Web开发中的重要性,通过Nginx,可以简单地解决跨域问题,适合新手学习和应用,文章详细讲解了CO... 目录一、概述二、什么是 CORS?三、常见的跨域场景四、Nginx 如何解决 CORS 问题?五、基

MySQL安装时initializing database失败的问题解决

《MySQL安装时initializingdatabase失败的问题解决》本文主要介绍了MySQL安装时initializingdatabase失败的问题解决,文中通过图文介绍的非常详细,对大家的学... 目录问题页面:解决方法:问题页面:解决方法:1.勾选红框中的选项:2.将下图红框中全部改为英

Nginx启动失败:端口80被占用问题的解决方案

《Nginx启动失败:端口80被占用问题的解决方案》在Linux服务器上部署Nginx时,可能会遇到Nginx启动失败的情况,尤其是错误提示bind()to0.0.0.0:80failed,这种问题通... 目录引言问题描述问题分析解决方案1. 检查占用端口 80 的进程使用 netstat 命令使用 ss

mybatis和mybatis-plus设置值为null不起作用问题及解决

《mybatis和mybatis-plus设置值为null不起作用问题及解决》Mybatis-Plus的FieldStrategy主要用于控制新增、更新和查询时对空值的处理策略,通过配置不同的策略类型... 目录MyBATis-plusFieldStrategy作用FieldStrategy类型每种策略的作

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多