Linux regulator子系統分析之四 虛擬regulator device驅動實現

2020-08-29 jerry的編程路

在前面幾章,我們分析了regulator子系統框架,主要是從數據結構及數據結構間的關聯分析了regulator子系統。為了讓大家對regulator子系統有一個深入的認識,我們本章將實現一個虛擬的regulator device驅動,從而掌握對regulator子系統的開發流程。

本章的主要內容分為如下幾部分:

一、 regulator device 驅動開發流程簡要說明

二、virt regulator device簡要介紹

三、virt regulator device driver設計

四、virt regulator consumer實現

一、預備知識

針對本文章,讀者需要了解如下幾方面的內容:

  1. Regulator 子系統相關的接口;
  2. 熟悉platform 驅動開發;
  3. 熟悉iic驅動開發;
  4. 熟悉device驅動子系統中屬性文件的創建等接口
  5. 熟悉regmap相關的接口調用

二、 regulator device 驅動開發流程簡要說明

  1. 創建struct regulator_desc類型的變量,包括regulator device的類型、寄存器定義、操作函數(struct regulator_ops類型的變量);
  2. 創建struct regulator_config類型的變量,包括regulator device相關的約束信息、consumer信息、regmap/enable gpio等相關信息;
  3. 調用regulator_register,完成regulator device的註冊。

Regulator consumer的開發

  1. 通過regulator_get接口,依據supply name、device name在regulator_map查找是否存在對應的regulator_map信息,若存在則獲取到對應的regulator_dev,並創建struct regulator 類型的變量;
  2. 通過regulator_get獲取到struct regulator類型的變量後,則可以進行regulator的enable/disable等操作;
  3. 通過regulator_put釋放regulator。

三、virt regulator device簡要介紹

本次我們需要取得的虛擬regulator device是一個iic設備,該設備包含兩個寄存器:

  1. 寄存器0x01表示電壓輸出選擇寄存器,其中bit[7:4]表示輸出電壓的select id,支持8個電壓輸出選擇,最小輸出電壓為2000000,電壓調節步進為200000uV
  2. 寄存器0x2表示電壓輸出的使能與去使能,其中bit4為1表示電壓輸出使能;0表示關閉電壓輸出


四、virt regulator device driver設計

針對virt regulator device driver的設計,我們主要分為如下兩部分:

  1. 創建i2c device、i2c driver,主要進行virt regulator device的驅動,在i2c driver的probe接口中,完成regulator device相關的約束信息的配置、consumer相關的配置信息、iic client對應的regmap的創建,並將這些信息作為platform device init data數據,創建對應的platform device;
  2. 完成regulator device platform driver,在該platform driver的probe接口中,依據platform device init data、struct regulator_desc類型變量(包括voltage sel寄存器、voltage sel mask、enable reg、enable reg mask、struct regulator_ops等配置),調用regulator_register,完成regulator_dev的創建及註冊;

下圖即為這兩部分的關聯,在virt regulator i2c device與i2c driver進行綁定時,在i2c devicedriver的probe接口中完成platform device的註冊,而在platform device與platform driver進行綁定時,在platform driver 的probe接口中,即完成上述2中所需完成的功能。

相關數據結構:

  1. virt_regulator_plat_data_t主要用於platform device相關的initdata信息,包含struct regulator_init_data類型變量(用於regulator_device相關的約束信息、consumer信息)、regmap(主要表示該virt regulator iic client對應的regmap,從而在regulator platform device driver中隱藏對virt regulator訪問的真實接口信息(直接使用regmap_read、regmap_write即可訪問該virt regulator));
  2. struct virt_regulator_dev主要表示一個虛擬的regulator device,包含regulator_dev成員

regulator_desc定義

因為我們定義的virt regulator提供電壓的輸出配置、電壓輸出的使能等內容,且這些操作可直接通過操作regmap實現,因此,此處的list_voltage、map_voltage、get_voltage_sel等接口直接使用regulator子系統定義的接口即可,無須額外實現這些接口。

regulator_init_data的定義

針對該virt regulator,其電壓約束信息為2800000uV,有一個consumer,該consumer的的supply類型名稱為virt-vcc,consumer對應的設備名稱為virt_consumer01;


sysfs屬性文件

因我們是virt regulator device,我們只能通過藉助sysfs來作為virt regulator device相關的寄存器的通信機制;此處主要創建voltage_sel、voltage_enable兩個屬性文件,用於dump virt regulator device的電壓輸出選擇、電壓使能信息。

五、virt regulator consumer實現

為了驗證該virt regulator device,我們創建一個簡單的platform device,在該platform devicedriver的probe接口中完成regulator的獲取以及regulator device的電壓輸出使能操作;而在該platform device driver的remove接口中完成regulator的釋放以及關閉regulator device的電壓輸出。

代碼實現也比較簡單,如下圖所示:

六、驗證說明

本次驗證的驅動包括如下幾個:

  1. virt_i2c_controller目錄下存儲的是虛擬iic控制器驅動代碼,實現虛擬iic控制器模擬、virt regulator device模擬;
  2. virt0701_driver目錄下存儲的是virt regulator對應的iic driver以及virt regulator對應的platform device;
  3. virt_regulator_chip目錄下存儲的是virt regulator對應的platform device driver;
  4. virt_consumer目錄下存儲的是virt regulator的consumer。

驗證步驟:

  1. 執行insmod virt_i2c_controller.ko;
  2. 執行insmod virt0701_driver.ko;
  3. 執行insmod virt_regulator_chip.ko;

此時在目錄/sys/bus/i2c/devices/0-0030下,可通過voltage_sel、voltage_enable查看virt regulator相關的輸出電壓選擇、電壓輸出使能信息,如下所示,此時該regulator device還沒有使能,而voltager sel中已經根據上述驅動中定義的regulator device的約束信息,將輸出電壓設置為280000uV.

然後執行命令insmod virt_consumer.ko,此時電壓輸出使能已設置


至此,我們完成了virt regulator device driver的開發,基本上熟悉了regulator子系統下的驅動開發,我們也算是完成了regulator子系統的驅動分析。本篇文章的連結稍後會在評論中給出。

相關焦點

  • Linux regulator子系統分析之三 regulator註冊、註銷接口分析
    在上一章我們介紹了regulator子系統相關的數據結構間的關聯以及每一個數據結構的定義。針對數據結構間的關聯則需要regulator子系統提供的接口實現。而本章我們就說明這些接口。本章的章節如下:一、regulator device的註冊與註銷二、regulator的註冊與註銷(regulator device的使用者)三、regulator子系統提供的接口一、regulator device的註冊與註銷針對regulator device的註冊與註銷函數主要涉及regulator_register、regulator_unregister
  • Linux regulator子系統分析之一 總體概述
    Linux regulator 子系統主要用於管理電壓、電流電源設備的電壓、電流輸入使能、動態調整電壓、電流等,屬於電源管理的一部分。從本章開始我們分析regulator子系統。主要分為如下幾部分:一、regulator子系統總體概述二、regulator相關數據結構分析三、regulator相關註冊、註銷函數分析四、regulator設備驅動實現本章主要對regulator子系統進行簡要說明。
  • Linux regulator子系統分析之二 從數據結構理解系統實現
    上一章我們分析了regulator子系統的總體框架,本章我們將從數據結構入手,從而理解regulator子系統實現。 針對linux 內核各子系統學習而言,在理解了各子系統的實現背景後,再從數據結構入手,可快速理解其子系統的實現流程。因此本章我們從regulator子系統的數據結構入手,從而理解regulator子系統的實現。
  • LINUX IIO子系統分析之七 虛擬iio設備驅動實現
    四、虛擬IIO DEVICE DRIVER的測試驗證一、 虛擬IIO DEVICE的說明 本次我們將實現一個虛擬的溫度傳感器晶片(晶片型號為virt0824),該設備提供2個channel,並且提供7個寄存器,定義如下:Channel0_current_temp
  • Linux regmap子系統分析之一 系統概述
    本系統專欄主要涉及如下幾個子章節:一、regmap子系統概述二、regmap子系統數據結構分析三、regmap子系統接口說明四、regmap bus實例說明(以i2c為例)本章我們主要對regmap子系統做一個簡單的說明。
  • Linux pinctrl子系統分析之四 pinctrl device的註冊與註銷
    前面我們分析了pinctrl子系統相關的數據結構等內容,本章我們分析pinctrl device的註冊與註銷接口。 針對pinctrl device的註冊與註銷主要涉及pinctrl_register、pinctrl_unregister、devm_pinctrl_register、devm_pinctrl_unregister這幾個接口。
  • Linux regmap子系統分析之三 regmap bus實例分析
    在前面一章我們分析了regmap子系統的數據結構,基本上熟悉了數據結構的關聯,也就大概理解了regmap子系統的實現流程,本章我們簡要介紹下regmap子系統中接口的調用過程,然後介紹下regmap bus的實現及其提供的regmap的創建及註銷接口。
  • Linux CommonClock Framework分析之四 gpio clk gate驅動實現
    前面我們已經完成了CCF子系統的分析,也說明了如何實現CCF驅動,本章為該專欄的最後一篇文章, 本章我們將實現一個虛擬的gpio clk gate驅動。:Platform device、platform drvierGpio 驅動使用Clk provider驅動開發流程 二、clk provider driver的實現流程說明 關於clk provider
  • LINUX IIO子系統專欄分析之一 IIO子系統概述
    從本章開始,我們進行IIO子系統專欄的分析文檔,本次IIO子系統專欄分析文檔大概包含如下幾章:一、 IIO子系統概述二、IIO子系統相關數據結構分析三、iio trigger 介紹四、iio event介紹五、iio buffer介紹六、iio device的註冊與註銷介紹七、iio trigger
  • LINUX IIO子系統分析之三 IIO trigger分析
    ,我在中斷子系統專欄也實現了一個虛擬的irq chip,實現的原理和此處trigger實現的虛擬irq chip的原理是一樣的)。 而iio trigger沒有選用該方法,其為每一個trigger實現了一個虛擬的irq chip,而在進行iio trigger與iio device的綁定操作時,為待綁定的iio device申請一個該trigger尚未使用的虛擬irq,並完成對該中斷的註冊操作;而當外部設備驅動觸發該trigger後,該trigger則遍歷已註冊的中斷,調用其對應的中斷處理函數進行相應的處理,這也就實現了調用所有已綁定的
  • Linux V4l2子系統專欄之一 子系統概述
    從本章開始,我們開始分析V4L2子系統(Video for Linux two),主要用於音視頻設備的框架。V4l2主要用於驅動視頻輸出設備(video outpt interface)、Video overlay interface、Video output overlay device、VBI interface、Radio interface等。
  • 輕鬆掌握pinctrl子系統驅動開發——一個虛擬pinctrl dev驅動開發
    這周主要對pinctrl子系統進行分析,該分析的基本上已經分析完成,唯一沒有細說的估計就是gpio與pinctrl之間的關聯了。本章即是pinctrl子系統分析的最後一章,本章我們主要實現一個虛擬的pinctrl device驅動,以便我們能夠使用pinctrl子系統提供的接口,實現pinctrl device的驅動開發(本章實現的驅動代碼可以在ubuntu18.04系統上正常運行)。
  • LINUX IIO子系統分析之二 IIO子系統數據結構分析
    基本就是這些內容,iio子系統主要藉助字符設備文件以及sysfs屬性文件實現數據的獲取與參數設定等操作。),現在僅需要關注pollfunc即可,基本上沒有使用pollfunc_event的;channels是該iio device所有channel相關的參數信息,我們在iio_chan_spec中將詳細說明;channel_attr_list鍊表包含了IIO子系統為所有channel創建的動態屬性(針對hwmon子系統我們之前也分析過,其主要通過在sysfs下創建屬性文件實現與
  • 走進Regulator(1):誰的LDO在震蕩?
    本來原理圖已經approve了,突然一個regulator成功地吸引了我的注意,經過多方思考後,還是把電路換掉了。得,這樣一來又耽誤掉半天時間。應了那句歌詞:load board 不是你想順,想順就能順的。出於各種應用場景,我們在load board上經常需要把不同的電壓轉成5V或者3.3V。這時候就需要選擇一個regulator。
  • Linux CommonClock Framework分析之二 CCF子系統內部實現簡述
    (本次分析CCF子系統是基於linux4.4內核的)。從我們分析的這麼多的外設子系統而言,讀者有沒有發現該CCF子系統的數據結構中沒有使用設備驅動模型,沒包含struct device類型的變量。這應該是clk provider主要為系統提供時鐘,而一些系統clk的初始化及使能會早於設備驅動模型的初始化,因此沒有使用設備驅動模型,但是還是使用了引用計數功能的。
  • Linux input子系統編程、分析與模板
    內核中的輸入子系統自底向上分為設備驅動層,輸入核心層,事件處理層。由於每種輸入的設備上報的事件都各有不同,所以為了應用層能夠很好識別上報的事件,內核中也為應用層封裝了標準的接口來描述一個事件,這些接口在"/include/upai/linux/input"中。
  • LINUX IIO子系統分析之六 IIO設備驅動開發流程說明
    前面五章我們基本上把IIO 子系統的內部設計實現均作了說明,本章我們將說明iio device的驅動開發流程,本章的主要內容大致安排如下:一、IIO子系統的關鍵技術點總結 二、IIO DEVICE的註冊與註銷接口說明 三、IIO DEVICE的驅動開發流程
  • LINUX IIO子系統分析之四 IIO EVENT設計分析
    所謂匿名即該字符設備文件節點並不會顯示在文件系統中(無法在應用層中找到該文件名稱),且一個iio device同一時刻僅可創建一個匿名字符設備文件節點。 二、IIO EVENT設計分析iio event相關的數據結構struct iio_event_interface是iio event相關的數據結構,該數據結構的定義如下該數據結構主要是對event子模塊的定義
  • LINUX IIO子系統分析之五 iio buffer介紹
    而/dev/iio:deviceX主要實現兩個功能:用於讀取iio device緩存的已採集數據,從而讓應用程式對採集的數據進行分析;藉助該字符設備文件的ioctl接口,實現匿名iio event fd的創建,從而讓應用程式藉助select/epoll監控該匿名文件是否有event信息可讀; 如下即是
  • LINUX 中斷子系統專欄之二 虛擬中斷控制器驅動實現
    在上一篇文章中,我們簡要分析了中斷子系統框架,本章我們將通過實現一個虛擬的中斷控制器驅動,說明如何進行中斷控制器驅動開發。本章的內容大概分為如下幾部分:一、實現虛擬中斷控制器的可行性說明二、中斷控制器驅動的開發流程三、虛擬中斷控制器驅動設計說明一、實現虛擬中斷控制器的可行性說明在進行虛擬中斷控制器的設計之前,我們先說明下linux系統中硬體中斷觸發後的處理過程。