1. 程式人生 > >迅為iTOP-4412核心板調整電壓

迅為iTOP-4412核心板調整電壓

本文轉自:http://www.topeetboard.com



      iTOP-4412核心板使用的電源管理晶片是三星專門針對4412研發的S5M8767,8767提供9路BUCK和28路LDO輸出,每路電壓的大小可以通過


軟體進行設定。S5M8767的驅動位於核心drivers/regulator/s5m8767.c,CPU是通過I2C匯流排來控制它。S5M8767註冊到核心裡面的


regulator模組。Regulator模組是核心中用於控制系統中某些裝置的電壓/電流供應,在嵌入式系統(尤其是手持裝置)中,控制耗電


量很重要,直接影響到電池的續航時間。所以。如果系統中某一個模組暫時不使用,就可以通過regulator關閉其電源;或者降低提供給


該模組的電壓、電流大小。 


      S5M8767驅動的主要作用就是呼叫regulator_register函式向核心註冊regulator_dev裝置,每個regulator_dev代表一個regulator裝置,


核心可以分別控制每個regulator。


      為了實現S5m8767驅動我們還需要在平臺相關的程式碼裡定義regulator_init_data結構,regulator_init_data用來建立父子regulator、


手電模組之間的樹狀結構,以及一些regulator的基本資訊,比如電壓大小,下面我們來看下regulator_init_data結構,程式碼在


arch/arm/mach-exynos/mach-itop4412.c裡面,在這個檔案裡使用巨集REGULATOR_INIT來定義28個LDO的regulator_init_data結構,


#define REGULATOR_INIT(_ldo, _name, _min_uV, _max_uV, _always_on, _ops_mask,\
_disabled) \
static struct regulator_init_data s5m8767_##_ldo##_init_data = {\
.constraints = {\
.name= _name,\
.min_uV = _min_uV,\
.max_uV = _max_uV,\
.always_on = _always_on,\
.boot_on = _always_on,\
.apply_uV = 1,\
.valid_ops_mask = _ops_mask,\
.state_mem = {\
.disabled = _disabled,\
.enabled = !(_disabled),\
}\
},\
.num_consumer_supplies = ARRAY_SIZE(s5m8767_##_ldo##_supply),\
.consumer_supplies = &s5m8767_##_ldo##_supply[0],\
}


上面的巨集定義中,第三個和第四個引數指定了LDO的電壓最小值和最大值,第五個引數設定LDO在系統開始執行時是輸出還是關閉的(1是輸出,0是關閉),


第六個引數是LDO具有哪些功能,例如可以修改電壓,電流,改變狀態等等通過位掩碼的方式設定,第七個引數是設定在休眠的時候是否由PWREN引腳控制它的開關(1是由PWREN控制,0是不受PWREN控制),休眠的時候PWREN為低電平,LDO會關閉,系統


喚醒,PWREN為高電平,LDO會輸出。

例如LDO2的定義,如下:


REGULATOR_INIT(ldo2, "VDDQ_M12", 1500000, 1500000, 1,
REGULATOR_CHANGE_STATUS, 1)

根據定義,可以知道LDO2輸出的電壓是1.5v,系統啟動的時候會預設輸出,系統休眠的時候會關閉。其他的LDO的設定原理與LDO2是一樣的。


系統中BUCK的定義,例如BUCK1如下:


static struct regulator_init_data s5m8767_buck1_data = {
.constraints = {
.name= "vdd_mif range",
.min_uV = 900000,
.max_uV = 1100000,
.valid_ops_mask= REGULATOR_CHANGE_VOLTAGE |
 REGULATOR_CHANGE_STATUS,
.state_mem = {
.disabled = 1,
},
},
.num_consumer_supplies= 1,
.consumer_supplies= &s5m8767_buck1_consumer,
};


根據上面的定義,可以知道BUCK1的電壓範圍在0.9v到1.1v,他具有可以修改電壓,修改狀態的功能(變數valid_ops_mask)。可以使用函式


regulator_set_voltage修改BUCK1的電壓。其他幾個BUCK的定義原理和BUCK1是一樣的


如果我們想要修改8767的某個LDO的輸出電壓,就可以通過修改對應的LDO的regulator_init_data結構體裡面的電壓值來實現,修改BUCK的電


壓可以使用函式regulator_set_voltage來實現。注意:在修改輸出電壓的時候,一定要參照8767的datasheet,確保修改的電壓在datasheet規


定的範圍內