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

相关文章

如何解决idea的Module:‘:app‘platform‘android-32‘not found.问题

《如何解决idea的Module:‘:app‘platform‘android-32‘notfound.问题》:本文主要介绍如何解决idea的Module:‘:app‘platform‘andr... 目录idea的Module:‘:app‘pwww.chinasem.cnlatform‘android-32

kali linux 无法登录root的问题及解决方法

《kalilinux无法登录root的问题及解决方法》:本文主要介绍kalilinux无法登录root的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录kali linux 无法登录root1、问题描述1.1、本地登录root1.2、ssh远程登录root2、

SpringBoot应用中出现的Full GC问题的场景与解决

《SpringBoot应用中出现的FullGC问题的场景与解决》这篇文章主要为大家详细介绍了SpringBoot应用中出现的FullGC问题的场景与解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录Full GC的原理与触发条件原理触发条件对Spring Boot应用的影响示例代码优化建议结论F

关于pandas的read_csv方法使用解读

《关于pandas的read_csv方法使用解读》:本文主要介绍关于pandas的read_csv方法使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录pandas的read_csv方法解读read_csv中的参数基本参数通用解析参数空值处理相关参数时间处理相关

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

Pyserial设置缓冲区大小失败的问题解决

《Pyserial设置缓冲区大小失败的问题解决》本文主要介绍了Pyserial设置缓冲区大小失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录问题描述原因分析解决方案问题描述使用set_buffer_size()设置缓冲区大小后,buf

resultMap如何处理复杂映射问题

《resultMap如何处理复杂映射问题》:本文主要介绍resultMap如何处理复杂映射问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录resultMap复杂映射问题Ⅰ 多对一查询:学生——老师Ⅱ 一对多查询:老师——学生总结resultMap复杂映射问题

java实现延迟/超时/定时问题

《java实现延迟/超时/定时问题》:本文主要介绍java实现延迟/超时/定时问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java实现延迟/超时/定时java 每间隔5秒执行一次,一共执行5次然后结束scheduleAtFixedRate 和 schedu

如何解决mmcv无法安装或安装之后报错问题

《如何解决mmcv无法安装或安装之后报错问题》:本文主要介绍如何解决mmcv无法安装或安装之后报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mmcv无法安装或安装之后报错问题1.当我们运行YOwww.chinasem.cnLO时遇到2.找到下图所示这里3.

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col