Linux 下大部分設備的驅動開發都是操作其內部寄存器,比如 I2C/SPI 設備的本質都是一樣的,通過 I2C/SPI 接口讀寫芯片內部寄存器。芯片內部寄存器也是同樣的道理,比如 I.MX6ULL的 PWM、定時器等外設初始化,最終都是要落到寄存器的設置上。
Linux 下使用 i2c_transfer 來讀寫 I2C 設備中的寄存器,SPI 接口的話使用 spi_write/spi_read等。I2C/SPI 芯片又非常的多,因此 Linux 內核里面就會充斥了大量的 i2c_transfer 這類的冗余代碼,再者,代碼的復用性也會降低。比如 icm20608 這個芯片既支持 I2C 接口,也支持 SPI 接口。假設我們在產品設計階段一開始將 icm20608 設計為 SPI 接口,但是后面發現 SPI 接口不夠用,或者 SOC 的引腳不夠用,我們需要將 icm20608 改為 I2C 接口。這個時候 icm20608 的驅動就要大改,我們需要將 SPI 接口函數換為 I2C 的,工作量比較大。
基于代碼復用的原則,Linux 內核引入了 regmap 模型,regmap 將寄存器訪問的共同邏輯抽象出來,驅動開發人員不需要再去糾結使用 SPI 或者 I2C 接口 API 函數,統一使用 regmapAPI 函數。這樣的好處就是統一使用 regmap,降低了代碼冗余,提高了驅動的可以移植性。regmap 模型的重點在于:
通過 regmap 模型提供的統一接口函數來訪問器件的寄存器,SOC 內部的寄存器也可以使用 regmap 接口函數來訪問。
regmap 是 Linux 內核為了減少慢速 I/O 在驅動上的冗余開銷,提供了一種通用的接口來操作硬件寄存器。另外,regmap 在驅動和硬件之間添加了 cache,降低了低速 I/O 的操作次數,提高了訪問效率,缺點是實時性會降低。
什么情況下會使用 regmap:
①、硬件寄存器操作,比如選用通過 I2C/SPI 接口來讀寫設備的內部寄存器,或者需要讀寫 SOC 內部的硬件寄存器。
②、提高代碼復用性和驅動一致性,簡化驅動開發過程。
③、減少底層 I/O 操作次數,提高訪問效率。
-
Linux
+關注
關注
87文章
11232瀏覽量
208961 -
模型
+關注
關注
1文章
3178瀏覽量
48731 -
系統
+關注
關注
1文章
1010瀏覽量
21320
發布評論請先 登錄
相關推薦
評論