// drivers/base/regmap/regmap-i2c.cstructregmap*regmap_init_i2c(structi2c_client*i2c,conststructregmap_config*config){// regmap_bus 定位了对应总线的读写函数。conststructregmap_bus*bus=regmap_get_i2c_bus(i2c,config);if(IS_ERR(bus))returnERR_CAST(bus);returnregmap_init(&i2c->dev,bus,&i2c-...
// first step: define regmap_configstaticconststruct regmap_config xxx_regmap_config={.reg_bits=10,.val_bits=14,.max_register=40,.cache_type=REGCACHE_RBTREE,.volatile_reg=false,.readable_reg=false,};// second step: initialize regmap in driver loadingregmap=regmap_init_i2c(i2c_client,&xxx...
Linux 下使用i2c_transfer来读写 I2C 设备中的寄存器,SPI 接口的话使用 spi_write/spi_read等。I2C/SPI 芯片又非常的多,因此 Linux 内核里面就会充斥了大量的 i2c_transfer 这类的冗余代码,再者,代码的复用性也会降低。比如icm20608这个芯片既支持 I2C 接口,也支持 SPI 接口。假设我们在产品设计阶段一开始将 icm...
1)注册方法regmap_bus和对象i2c: 通过把struct regmap_bus regmap_i2c和i2c->dev注册到regmap模块中去,而regmap_bus中已经实现了read和write函数(调用的就是i2c_master_send与i2c_transfer) 2)使用注册的对象和方法 当调用regmap_read或者regmap_write的时候,这两个函数会取出struct regmap中的content即i2c,并调用之...
对于regmap_config中的信息,需要对i2c总线进行检查,并将最大读写值设置到regmap_bus中。最终会调用__regmap_init函数将配置写入regmap并返回。完成regmap注册后,就可以利用regmap_bus开始进行寄存器读写。regmap读写寄存器分析 regmap_write(context, reg, val)是regmap-i2c中定义的函数,用于写入寄存器。
Linux引入regmap是为了统一管理内核的i2c,spi等总线,将i2c、spi驱动做了一次重构,把I/O读写的重复逻辑在regmap中实现。只需初始化时指定总线类型、寄存器位宽等关键参数,即可通过regmap模型接口来操作器件寄存器。 将i2c、spi、mmio、irq等抽象出统一接口regmap_read,regmap_write,regmap_update_bits等接口,从而提高代码...
抽象出来,用一套统一接口来操作寄存器,统一操作i2c、i3c、spi、mmio、sccb、sdw、slimbus、irq等。 regmap框架分为三层: ①、底层物理总线:regmap支持的物理总线有i2c、i3c、spi、mmio、sccb、sdw、slimbus、irq、spmi 和 w1。 ②、regmap核心层:用于实现regmap核心。
不管是 I2C 还是 SPI 等接口,还是 SOC 内部的寄存器,对于寄存器的操作就两种:读和写。regmap 提供了最核心的两个读写操作:regmap_read和 regmap_write。这两个函数分别用来读/写寄存器。 在regmap_read 和 regmap_write 的基础上还衍生出了其他一些 regmap 的 API 函数,首先是regmap_update_bits 函数。看名字就...
regmap是Linux内核中用于简化硬件寄存器操作的一种机制,它通过提供统一的接口来操作I2C、SPI、MMIO、IRQ等总线的寄存器,从而减少了代码冗余并提高了驱动的可移植性。以下是其实现原理的详细介绍: regmap的实现原理 目的:减少I/O驱动上的重复逻辑代码,提供一种通用的接口来操作底层硬件上的寄存器。 核心结构:regmap_...
内核3.1引入了一套新的API机制:regmap,主要为I2C,SPI,IRQ等操作提供统一接口,提高代码可重用性,减少重复逻辑。 以I2C为例: 要让设备跟I2C通信,以前的办法是调用i2c_transfer接口,其实regmap最终还是调用到i2c_transfer,只不过中间加了一层缓冲,这样统一了接口,减少了底层I/O的操作次数。