iTOP-4412開(kāi)發(fā)板的核心板使用的電源管理芯片是三星專(zhuān)門(mén)針對4412研發(fā)的S5M8767,S5M8767提供9路BUCK和28路LDO輸出,每路電壓的大小可以通過(guò)軟件進(jìn)行設置。 詳情了解:http://topeetboard.com 更多了解:https://arm-board.taobao.comS5M8767的驅動(dòng)位于內核的drivers/regulator/s5m8767.c文件中,Exynos 4412處理器是通過(guò)I2C總線(xiàn)來(lái)控制S5M8767的。S5M8767在系統啟動(dòng)的過(guò)程中會(huì )注冊到內核里面的regulator模塊里面。 regulator模塊是內核用于控制系統中某些設備的電壓/電流供應,在嵌入式系統(尤其是手持設備)中,控制耗電量很重要,它直接影響到電池的續航時(shí)間。所以,如果系統中某一個(gè)模塊暫時(shí)不使用,就可以通過(guò)regulator關(guān)閉其電源;或者降低提供給該模塊的電壓、電流大小來(lái)達到降低功耗的目的。 S5M8767驅動(dòng)的主要作用就是調用regulator_register函數向內核注冊regulator_dev設備,每個(gè)regulator_dev代表一個(gè)regulator設備,內核可以分別控制每個(gè)regulator。 為了實(shí)現S5m8767驅動(dòng)還需要在平臺相關(guān)的代碼里定義regulator_init_data結構,regulator_init_data用來(lái)建立父子regulator、受電模塊之間的樹(shù)狀結構,以及一些regulator的基本信息,比如電壓大小等,下面我們來(lái)看下regulator_init_data結構的定義,代碼在arch/arm/mach-exynos/mach-itop4412.c里面,在這個(gè)文件里使用宏REGULATOR_INIT定義了28個(gè)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, \ .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], \ } 上面的宏定義中,第三個(gè)和第四個(gè)參數指定了LDO的電壓最小值和最大值,第五個(gè)參數設置LDO在系統開(kāi)始運行時(shí)是輸出還是關(guān)閉的(1是輸出,0是關(guān)閉)。 第六個(gè)參數是LDO具有哪些功能,例如可以修改電壓,電流,改變狀態(tài)等等,通過(guò)位掩碼的方式設置,第七個(gè)參數是設置在休眠的時(shí)候是否由PWREN引腳控制它的開(kāi)關(guān)(1是由PWREN控制,0是不受PWREN控制),休眠的時(shí)候PWREN為低電平,LDO會(huì )關(guān)閉,系統喚醒,PWREN為高電平,LDO會(huì )輸出。 例如LDO2的定義,如下: REGULATOR_INIT(ldo2, "VDDQ_M12", 1500000, 1500000, 1, REGULATOR_CHANGE_STATUS, 1) 根據定義,可以知道LDO2輸出的電壓是1.5v,系統啟動(dòng)的時(shí)候會(huì )默認輸出,系統休眠的時(shí)候會(huì )關(guān)閉。其他的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,他具有可以修改電壓,修改狀態(tài)的功能(變量valid_ops_mask)?梢允褂煤瘮祌egulator_set_voltage修改BUCK1的電壓。其他幾個(gè)BUCK的定義原理和BUCK1是一樣的 如果我們想要修改8767的某個(gè)LDO的輸出電壓,就可以通過(guò)修改對應LDO的regulator_init_data結構體里面的電壓值來(lái)實(shí)現,修改BUCK的電壓可以使用函數regulator_set_voltage來(lái)實(shí)現。 注意:因為S5M8767的每個(gè)BUCK和LDO都有各自規定的輸出最大值,因此在修改輸出電壓的時(shí)候,一定要參照S5M8767的datasheet,確保修改的電壓在datasheet規定的范圍內。

