Regmap 操作函數
1、Regmap 申請與初始化
regmap 支持多種物理總線,比如 I2C 和 SPI,我們需要根據所使用的接口來選擇合適的 regmap 初始化函數。Linux 內核提供了針對不同接口的 regmap 初始化函數。
SPI 接口初始化函數為 regmap_init_spi
I2C 接口的初始化函數為 regmap_init_i2c
不管是什么接口,全部使用 regmap_exit 這個函數來釋放 regmap
我們一般會在 probe 函數中初始化 regmap_config,然后申請并初始化 regmap。
2、regmap 設備訪問 API 函數
不管是 I2C 還是 SPI 等接口,還是 SOC 內部的寄存器,對于寄存器的操作就兩種:讀和寫。regmap 提供了最核心的兩個讀寫操作:regmap_read 和 regmap_write。這兩個函數分別用來讀/寫寄存器。
在 regmap_read 和 regmap_write 的基礎上還衍生出了其他一些 regmap 的 API 函數,首先是regmap_update_bits 函數。看名字就知道,此函數用來修改寄存器指定的 bit,函數原型如下:
int
regmap_update_bits
(structregmap*
map
,
unsigned
int
reg,
unsigned
int
mask,
unsigned
int
val,
函數參數和返回值含義如下:
map:要操作的 regmap。
reg:要操作的寄存器。
mask:掩碼,需要更新的位必須在掩碼中設置為 1。
val:需要更新的位值。
返回值:0,寫成功;其他值,寫失敗。
比如要將寄存器的 bit1 和 bit2 置 1,那么 mask 應該設置為 0X00000011,此時 val 的 bit1 和 bit2 應該設置為 1,也就是 0Xxxxxxx11。
如果要清除寄存器的 bit4 和 bit7,那么 mask 應該設置為 0X10010000,val 的 bit4 和 bit7 設置為 0,也就是 0X0xx0xxxx。
接下來看一下 regmap_bulk_read 函數,此函數用于讀取多個寄存器的值,函數原型如下:
int
regmap_bulk_read
(structregmap*
map
,
unsigned
int
reg,
void
*val,
size_t
val_count)
函數參數和返回值含義如下:
map:要操作的 regmap。
reg:要讀取的第一個寄存器。
val:讀取到的數據緩沖區。
val_count:要讀取的寄存器數量。
返回值:0,寫成功;其他值,讀失敗。
另外也有多個寄存器寫函數 regmap_bulk_write,函數原型如下:
int
regmap_bulk_write
(structregmap*
map
,
unsigned
int
reg,
const
void
*val,
size_t
val_count)
函數參數和返回值含義如下:
map:要操作的 regmap。
reg:要寫的第一個寄存器。
val:要寫的寄存器數據緩沖區。
val_count:要寫的寄存器數量。
返回值:0,寫成功;其他值,讀失敗。
關于 regmap 常用到 API 函數就講解到這里,還有很多其他功能的 API 函數,大家自行查 閱 Linux 內核即可,內核里面對每個 API 函數都有詳細的講解。
-
Linux
+關注
關注
87文章
11232瀏覽量
208958 -
函數
+關注
關注
3文章
4308瀏覽量
62445 -
系統
+關注
關注
1文章
1010瀏覽量
21320
發布評論請先 登錄
相關推薦
評論