按位操作外部设备的寄存器:方法二
方法介绍:
Kernel驱动程序主要通过I2C / SPI / SPMI等总线操作外部设备的寄存器,
Kernel Regmap提供了非常方便的总线操作接口集,其中,regmap_update_bits() / regmap_write_bits()
就是用于简化按位操作外部设备的寄存器的通用接口。
regmap_update_bits() / regmap_write_bits()调用的_regmap_update_bits()实现原型如下:
如上图四个步骤实现解析 :
1、参数mask用于指定需要操作的寄存器bit/bits
Kernel标准宏集:
、
定义单个Bit mask
定义l Bit To h Bit mask
将寄存器指定位置为1:
REG |= (1<<n)
将寄存器指定位置为0:
REG &= ~(1<<n)
将寄存器指定l , m , n 位置为1:
REG |= (1<<l) |(1<<m) |(1<<n)
2、从设备中读取寄存器的旧值,保存到orig
3、将orig旧值mask对应bits清0 ;同时orig旧值mask对应bits赋值val 。更新寄存器暂存到tmp。
4、 将暂存值tmp写入到外部设备寄存器中。
方法特点:
封装性强,使用简单。
应用举例:
1、为每个寄存器定义寄存器addr宏、和Bit/Bits mask宏:
2、外部设备驱动程序封装一个位操作函数接口
方法总结:
如果外部设备驱动不想使用、或无法使用Kernel Regmap架构,
参考 _regmap_update_bits接口的实现,根据不同总线封装出具体设备的位操作函数。如下: