Linux 下大部分設(shè)備的驅(qū)動(dòng)開(kāi)發(fā)都是操作其內(nèi)部寄存器,比如 I2C/SPI 設(shè)備的本質(zhì)都是一樣的,通過(guò) I2C/SPI 接口讀寫芯片內(nèi)部寄存器。芯片內(nèi)部寄存器也是同樣的道理,比如 I.MX6ULL的 PWM、定時(shí)器等外設(shè)初始化,最終都是要落到寄存器的設(shè)置上。
Linux 下使用 i2c_transfer 來(lái)讀寫 I2C 設(shè)備中的寄存器,SPI 接口的話使用 spi_write/spi_read等。I2C/SPI 芯片又非常的多,因此 Linux 內(nèi)核里面就會(huì)充斥了大量的 i2c_transfer 這類的冗余代碼,再者,代碼的復(fù)用性也會(huì)降低。比如 icm20608 這個(gè)芯片既支持 I2C 接口,也支持 SPI 接口。假設(shè)我們?cè)?a target="_blank">產(chǎn)品設(shè)計(jì)階段一開(kāi)始將 icm20608 設(shè)計(jì)為 SPI 接口,但是后面發(fā)現(xiàn) SPI 接口不夠用,或者 SOC 的引腳不夠用,我們需要將 icm20608 改為 I2C 接口。這個(gè)時(shí)候 icm20608 的驅(qū)動(dòng)就要大改,我們需要將 SPI 接口函數(shù)換為 I2C 的,工作量比較大。
基于代碼復(fù)用的原則,Linux 內(nèi)核引入了 regmap 模型,regmap 將寄存器訪問(wèn)的共同邏輯抽象出來(lái),驅(qū)動(dòng)開(kāi)發(fā)人員不需要再去糾結(jié)使用 SPI 或者 I2C 接口 API 函數(shù),統(tǒng)一使用 regmapAPI 函數(shù)。這樣的好處就是統(tǒng)一使用 regmap,降低了代碼冗余,提高了驅(qū)動(dòng)的可以移植性。regmap 模型的重點(diǎn)在于:
通過(guò) regmap 模型提供的統(tǒng)一接口函數(shù)來(lái)訪問(wèn)器件的寄存器,SOC 內(nèi)部的寄存器也可以使用 regmap 接口函數(shù)來(lái)訪問(wèn)。
regmap 是 Linux 內(nèi)核為了減少慢速 I/O 在驅(qū)動(dòng)上的冗余開(kāi)銷,提供了一種通用的接口來(lái)操作硬件寄存器。另外,regmap 在驅(qū)動(dòng)和硬件之間添加了 cache,降低了低速 I/O 的操作次數(shù),提高了訪問(wèn)效率,缺點(diǎn)是實(shí)時(shí)性會(huì)降低。
什么情況下會(huì)使用 regmap:
①、硬件寄存器操作,比如選用通過(guò) I2C/SPI 接口來(lái)讀寫設(shè)備的內(nèi)部寄存器,或者需要讀寫 SOC 內(nèi)部的硬件寄存器。
②、提高代碼復(fù)用性和驅(qū)動(dòng)一致性,簡(jiǎn)化驅(qū)動(dòng)開(kāi)發(fā)過(guò)程。
③、減少底層 I/O 操作次數(shù),提高訪問(wèn)效率。
-
Linux
+關(guān)注
關(guān)注
87文章
11182瀏覽量
208519 -
模型
+關(guān)注
關(guān)注
1文章
3073瀏覽量
48587 -
系統(tǒng)
+關(guān)注
關(guān)注
1文章
1006瀏覽量
21277
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論