Linux regmap子系統分析之三 regmap bus實例分析

2020-08-29 jerry的編程路

在前面一章我們分析了regmap子系統的數據結構,基本上熟悉了數據結構的關聯,也就大概理解了regmap子系統的實現流程,本章我們簡要介紹下regmap子系統中接口的調用過程,然後介紹下regmap bus的實現及其提供的regmap的創建及註銷接口。

一、regmap子系統接口調用關係

針對regmap子系統提供的讀寫接口包含regmap_read、regmap_write、regmap_raw_read、regmap_raw_write等接口,此處我們主要說明regmap_read、regmap_write這兩個接口的調用流程。

regmap_write接口調用

regmap_write的調用包含如下三個大分支:

  1. 若regmap創建時提供了reg_write接口、reg_read接口,則regmap_write直接調用該reg_write接口;
  2. 若根據reg bits、reg value bits的值,確定其reg_write接口為_regmap_bus_formatted_write接口(即reg+pad+write的位數為16bits),首先對寄存器與寄存器值執行formart操作,然後調用regmp bus提供的write接口,執行寫操作;
  3. 若reg bits、reg valut bits的位數均是8bits的整數倍,則針對reg、value均提供format接口,且將其寫接口設置為_regmap_bus_raw_write,然後完成reg、value的format操作,並確認是否需要進行page方式訪問及page選擇等。然後在進行寫操作時,若是異步寫則調用regmap bus的異步寫接口即可;若是同步寫,則調用regmap bus的write/gather_write接口執行寫操作。


regmap_read接口調用

針對regmap讀操作,也包含如下幾個大的方向:

  1. 若支持從cache中獲取,則直接調用regcache_read從cache中獲取值即可;
  2. 若regmap創建時提供了reg_write接口、reg_read接口,則regmap_write直接調用該reg_read接口;
  3. 調用_regmap_bus_read接口進行讀操作,在讀之前也需要判斷是否需要進行page選擇,最終也是調用regmap bus的讀接口即可。


以上即是regmap_read/regmap_write的調用邏輯,針對regmap_raw_read、regmap_raw_write接口的調用也大致類似,此處不再細述讀者可自行查找。

regmap bus的實現及其提供的regmap的創建及註銷接

此處我們選擇iic regmap bus的創建及其提供的regmap的創建及註銷接口。

iic regmap bus的定義

如下圖所示,iic regmap bus提供了read、write、gather_write接口,而read、write接口則主要調用i2c_transfer接口實現對i2c設備的讀寫操作,相對來說也是比較簡單的。

iic regmap的創建接口

iic regmap的創建接口為regmap_init_i2c,該接口即是對regmap_init接口的調用,並傳遞iic regmap_bus變量,這樣創建的iic regmap變量中執行的regmap_bus即為regmap_i2c,然後在regmap_write、regmap_read接口的調用中,最終即調用了regmap_i2c的read、write接口,即調用regmap_i2c_read、regmap_i2c_write接口,實現與i2c設備的通信操作。

iic regmap的註銷接口

對於iic/spi regmap的註銷接口,直接調用regmap_exit接口即可。


regmap的使用

在regulator子系統專欄的虛擬regulator 設備驅動的開發中,我們就已經實現了regmap的創建與註銷操作,只需要在i2c設備驅動的probe接口中調用devm_regmap_init_i2c接口完成i2c regmap的創建後,即可進行regmap_write、regmap_read的調用。

至此我們即完成regmap子系統的分析,regmap子系統設計也不是很複雜,我們就不大篇幅介紹。

下一章我們分析下linux設備資源管理、iio子系統等內容。

相關焦點

  • Linux regmap子系統分析之一 系統概述
    本周開始我們學習下regmap子系統的架構。本系統專欄主要涉及如下幾個子章節:一、regmap子系統概述二、regmap子系統數據結構分析三、regmap子系統接口說明四、regmap bus實例說明(以i2c為例)本章我們主要對regmap子系統做一個簡單的說明。
  • Linux regmap子系統分析之二 從數據結構分析系統實現
    上一章我們簡要分析了regmap子系統,本章我們將從regmap子系統的數據結構介紹regmap子系統的實現。 一、數據結構間的關聯及說明 針對regmap子系統,我們首先要知道regmap子系統要解決的痛點是什麼?
  • Linux regulator子系統分析之四 虛擬regulator device驅動實現
    在前面幾章,我們分析了regulator子系統框架,主要是從數據結構及數據結構間的關聯分析了regulator子系統。為了讓大家對regulator子系統有一個深入的認識,我們本章將實現一個虛擬的regulator device驅動,從而掌握對regulator子系統的開發流程。
  • Linux regulator子系統分析之二 從數據結構理解系統實現
    上一章我們分析了regulator子系統的總體框架,本章我們將從數據結構入手,從而理解regulator子系統實現。 針對linux 內核各子系統學習而言,在理解了各子系統的實現背景後,再從數據結構入手,可快速理解其子系統的實現流程。因此本章我們從regulator子系統的數據結構入手,從而理解regulator子系統的實現。
  • Linux pinctrl子系統分析之五 pinctrl map註冊與註銷
    前面我們分析了pinctrl device的註冊與註銷接口。本章我們分析pinctrl maps的註冊,pinctrl maps屬於board pin描述相關的範疇。,進行設備與pinctrl map、pinctrl device綁定時,若該設備所對應的pinctrl map未註冊到系統中,則調用pinctrl_dt_to_map,將該設備對應pinctrl map添加系統pinctrl map list上(該方式下也是調用pinctrl_register_map)。
  • Linux regulator子系統分析之三 regulator註冊、註銷接口分析
    在上一章我們介紹了regulator子系統相關的數據結構間的關聯以及每一個數據結構的定義。針對數據結構間的關聯則需要regulator子系統提供的接口實現。而本章我們就說明這些接口。本章的章節如下:一、regulator device的註冊與註銷二、regulator的註冊與註銷(regulator device的使用者)三、regulator子系統提供的接口一、regulator device的註冊與註銷針對regulator device的註冊與註銷函數主要涉及regulator_register、regulator_unregister
  • Linux CommonClock Framework分析之三 驅動開發流程說明
    本篇文章主要介紹CCF子系統下驅動程序的開發,本章涉及如下三個方面的內容:一、clk註冊與註銷接口說明 二、clk驅動開發流程 三、clk使用流程 四、依據clk provider用途封裝的註冊接口 一、clk註冊與註銷接口說明
  • Linux pinctrl子系統分析之六 設備與pinctrl子系統的bind
    本章我們分析設備與pinctrl子系統的bind,在前面幾章我們介紹了soc pin 描述相關的數據結構與註冊接口、board pin 描述相關的數據結構與註冊接口,但是我們卻沒有看到是在何時由誰實現對設備相關的引腳進行引腳復用與引腳配置的,而這些就是本章的內容。
  • Java之Map遍歷方式性能分析:ketSet 與 entrySet
    keySet()方式:Set<String> keySet = map.keySet();//先獲取map集合的所有鍵的Set集合Iterator<String> it = keySet.iterator();//有了Set集合,就可以獲取其迭代器while (it.hasNext()) {String key = it.next();String
  • Linux設備樹的規範(dts和dtb)
    A null-terminated string (有結束符的字符串): compatible = 「simple-bus」;d. A bytestring(字節序列) :local-mac-address = [00 00 12 34 56 78]; 每個byte使用2個16進位數來表示e.
  • 輕鬆掌握pinctrl子系統驅動開發——一個虛擬pinctrl dev驅動開發
    這周主要對pinctrl子系統進行分析,該分析的基本上已經分析完成,唯一沒有細說的估計就是gpio與pinctrl之間的關聯了。本章即是pinctrl子系統分析的最後一章,本章我們主要實現一個虛擬的pinctrl device驅動,以便我們能夠使用pinctrl子系統提供的接口,實現pinctrl device的驅動開發(本章實現的驅動代碼可以在ubuntu18.04系統上正常運行)。
  • Golang map源碼分析
    map結構整體為一個數組,數組每個元素可以理解成一個槽,槽是一個鍊表結構,槽的每個節點可存8個元素,搞清楚了map的結構,想想對應的增刪改查操作也不是那麼難[key] 源碼分析//go:linkname reflect_mapaccess reflect.mapaccess map[key]func reflect_mapaccess(t *maptype, h *hmap, key unsafe.Pointer) unsafe.Pointer { val, ok := mapaccess2(t, h, key
  • LINUX IIO子系統分析之七 虛擬iio設備驅動實現
    前面幾章我們基本完成了IIO子系統的所有內容,而該章即為本專欄的結束篇,主要用來實現一個虛擬的IIO DEVICE DRIVER,本章的內容主要包括如下幾部分:一、 虛擬IIO DEVICE的說明 二、虛擬IIO DEVICE DRIVER實現所需的知識點 三、虛擬IIO DEVICE DRIVER的數據結構及實現說明
  • Linux pinctrl子系統分析之四 pinctrl device的註冊與註銷
    前面我們分析了pinctrl子系統相關的數據結構等內容,本章我們分析pinctrl device的註冊與註銷接口。 針對pinctrl device的註冊與註銷主要涉及pinctrl_register、pinctrl_unregister、devm_pinctrl_register、devm_pinctrl_unregister這幾個接口。
  • LINUX IIO子系統分析之三 IIO trigger分析
    上一章我們分析了IIO子系統的數據結構定義,本章我們主要介紹IIO TRIGGER的設計實現,主要內容如下:一、數據結構簡述 二、設計實現說明 三、提供接口說明一、數據結構簡述irq chip,在trigger內部,當多個trigger consumer註冊時,則trigger內部會為其分配一個虛擬的irq,並根據trigger consumer提供給pollfunc,為該irq註冊中斷處理函數,這樣當該trigger觸發後,則會遍歷所有該trigger上已註冊的虛擬irq,調用其中斷處理函數從而執行trigger consumer提供的處理函數(關於linux中斷子系統的內容可參考我之前寫的中斷子系統專欄
  • Java集合-Map
    Map接口不是Collection 的子接口,因此,它的行為與其他Collection 類型稍有不同。=    new HashMap<String, MyObject>();這個Mao只能接受String類型的Key和MyObject 實例的value,同時訪問和迭代它們不需要強制類型轉換:for(MyObject anObject : map.values()){   /
  • Linux CommonClock Framework分析之四 gpio clk gate驅動實現
    前面我們已經完成了CCF子系統的分析,也說明了如何實現CCF驅動,本章為該專欄的最後一篇文章, 本章我們將實現一個虛擬的gpio clk gate驅動。本章大概分為如下幾個章節:一、 本次驅動開發涉及的知識點 二、clk provider driver的實現流程說明 三、gpio clk gate driver驅動設計一、 本次驅動開發涉及的知識點本次驅動實踐主要涉及如下幾個方面的知識點
  • 淺談分析Arm linux 內核移植及系統初始化的過程二
    Resource定義的實例將被添加到platform_device結構體對象中去。);//setup processor and machine and destinate some pointers for do_initcalls() s5、淺談分析Arm linux 內核移植及系統初始化的過程 諮詢QQ:313807838// for example init_machine
  • LINUX 中斷子系統專欄之二 虛擬中斷控制器驅動實現
    在上一篇文章中,我們簡要分析了中斷子系統框架,本章我們將通過實現一個虛擬的中斷控制器驅動,說明如何進行中斷控制器驅動開發。本章的內容大概分為如下幾部分:一、實現虛擬中斷控制器的可行性說明二、中斷控制器驅動的開發流程三、虛擬中斷控制器驅動設計說明一、實現虛擬中斷控制器的可行性說明在進行虛擬中斷控制器的設計之前,我們先說明下linux系統中硬體中斷觸發後的處理過程。
  • 大咖說|Linux ALSA 音頻設備驅動分析
    unsigned int freq_in, unsigned int freq_out);int (*set_jack)(struct snd_soc_codec *codec, struct snd_soc_jack *jack, void *data);/* Codec IO 相關函數 */struct regmap