Linux regmap子系统分析之一 系统概述

   由于最近工作有点忙,好久没有更新了(主要是懒…)。本周开始我们学习下regmap子系统的架构。本系统专栏主要涉及如下几个子章节:

一、regmap子系统概述

二、regmap子系统数据结构分析

三、regmap子系统接口说明

四、regmap bus实例说明(以i2c为例)

 

 

本章我们主要对regmap子系统做一个简单的说明。涉及的内容如下:

一、 regmap子系统的作用

二、regmap子系统框架说明

 

 

一、 regmap子系统的作用

    在前面几个专栏的分析中(hwmon子系统、pwm子系统、gpio子系统、regulator子系统),涉及到spi 设备、i2c设备的访问操作,会有所不同。如针对i2c设备我们通过接口i2c_transfer、i2c_master_send等接口进行读写操作,而针对spi 设备我们则通过接口spi_write、spi_sync、spi_async等接口实现读写操作。尤其在hwmon子系统、regulator子系统中,大部分的设备基本上就是i2c、spi设备。虽然直接调用i2c或spi设备的操作接口也很方便,但这些子系统中的读写接口中充斥着大量的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、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的读写接口进行寄存器的读写接口);
  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提供的操作接口,实现对这两类设备的访问操作。

 

Linux regmap子系统分析之一 系统概述

 

       通过regmap子系统的抽象,具体的设备驱动模块只需要调用regmap_write、regmap_read等通用接  口,即可实现对i2c/spi设备的访问。本章我们主要对remap子系统进行一个概述,下一章我们进行regmap子系统的数据结构定义的说明,通过我们学习regmap子系统的实现,对我们以后进行驱动模块或者应用模块的开发设计也会有一个较好的提升。