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

      在前面幾章,我們分析了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 device driver的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 device driver的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子系統的驅動分析。

     本篇文章涉及的代碼鏈接如下,代碼已在ubuntu16.04上完成測試驗證:https://gitee.com/jerry_chg/virt_regulator.git

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章