按位操作外部设备的寄存器:方法二

来源:互联网 发布:win7桌面时钟软件 编辑:程序博客网 时间:2024/06/05 07:31


方法介绍:


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接口的实现,根据不同总线封装出具体设备的位操作函数。如下:





原创粉丝点击