之前的文章設置clock的時候多次提到了(Operating Performance Point)OPP,例如DEVFreq、CPUFreq等,在現(xiàn)代SoC上存在有Power Domain,也可以以Power Domain為單位進行OPP的電壓頻率定義。
1. 什么是OPP,怎么用?
在SoC內(nèi),某些domain可以運行在較低的頻率和電壓下,而其他domain可以運行在較高的頻率和電壓下,某個domain所支持的<頻率,電壓>對的集合被稱為Operating Performance Point,縮寫OPP。
在DTS中配置后自動有OPP框架驅(qū)動加載使用,例如CPU的OPP,從設備樹文件arch/arm/boot/dts/imx6ull.dtsi中找到
cpu0: cpu@0 { compatible = "arm,cortex-a7"; device_type = "cpu"; reg = <0>; clock-latency = <61036>; /* two CLK32 periods */ operating-points = < /* kHz uV */ 900000 1275000 792000 1225000 528000 1175000 396000 1025000 198000 950000 >; fsl,soc-operating-points = < /* KHz uV */ 900000 1175000 792000 1175000 528000 1175000 396000 1175000 198000 1175000 >;
2. 系統(tǒng)初始化加載OPP信息
DT_MACHINE_START --》imx6ul_init_late --》imx6ul_opp_init --》_of_add_opp_table_v1(dev); --》_opp_add_v1 --》_opp_add
_of_add_opp_table_v1中會根據(jù)DTS中信息找到對應的信息:
_opp_add_v1中會把DTS中信息提取出來,存入struct dev_pm_opp *new_opp;
這里struct dev_pm_opp如下:
struct dev_pm_opp { struct list_head node; bool available; unsigned long rate; unsigned long u_volt; struct device_opp *dev_opp; struct rcu_head head; };
node:用于鏈表管理此設備下的opp。
available:用于判斷此opp使能可以使用。
rate:頻率,單位Hz
u_volt:電壓。
dev_opp:struct device_opp類型指針,指向此opp所屬的設備。
3. 觸發(fā)使用
例如輸入命令:
echo 700000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed
__cpufreq_driver_target->__target_index->cpufreq_driver->target_index
static int set_target(struct cpufreq_policy *policy, unsigned int index) { struct private_data *priv = policy->driver_data; return dev_pm_opp_set_rate(priv->cpu_dev, policy->freq_table[index].frequency * 1000); }
dev_pm_opp_set_rate()函數(shù)在drivers/base/power/opp/core.c中定義
opp_table = _find_opp_table(dev); clk = opp_table->clk; freq = clk_round_rate(clk, target_freq); if ((long)freq <= 0) freq = target_freq; old_freq = clk_get_rate(clk); ret = _generic_set_opp_clk_only(dev, clk, old_freq, freq);
clk_set_rate進行頻率設置。
4. API介紹
dev_pm_opp_add :( WARNING: Do not use this function in interrupt context.)
向指定的設備添加一個頻率/電壓(opp table)組合,頻率和電壓的單位分別是Hz和uV。
dev_pm_opp_remove:
remove an opp from opp table.
dev_pm_opp_get:
increment the reference count of opp.
dev_pm_opp_enable:
用于使能指定的OPP,調(diào)用dev_pm_opp_add添加進去的OPP,默認是enable的。
dev_pm_opp_disable:
雖然設備支持某些OPP,但driver有可能覺得比較危險,不想使用,則可以調(diào)用dev_pm_opp_disable接口,禁止該OPP。
dev_pm_opp_get_voltage:
獲得電壓。
dev_pm_opp_get_freq:
獲得頻率。
dev_pm_opp_set_regulators:
進行voltage scaling
dev_pm_opp_put_regulators:
free the resources acquired by the OPP core
dev_pm_opp_set_rate:
This routine configures the device for the OPP with the lowest frequency greater than or equal to the target frequency.
dev_pm_opp_get_opp_count:
獲取opp table opps numbers
dev_pm_opp_of_add_table :
解析并初始化一個設備的opp table。
OPP的查詢接口包括:
dev_pm_opp_find_freq_floor,查詢小于或者等于指定freq的OPP,在返回OPP的同時,從freq指針中返回實際的freq值;
dev_pm_opp_find_freq_ceil,查詢大于或者等于指定freq的OPP,在返回OPP的同時,從freq指針中返回實際的freq值;
dev_pm_opp_find_freq_exact,精確查找指定freq的OPP,同時通過available變量,可以控制是否查找處于disable狀態(tài)的OPP。上面兩個查找接口,是不查找處于disable狀態(tài)的OPP的。
后記:
Linux驅(qū)動的套路其實就是DTS里面有個compatible,然后內(nèi)核啟動的時候走各種平臺設備初始化就會去尋找加載,然后變成鏈表結(jié)構(gòu)體。在使用的時候:用戶通過設備節(jié)點或者中斷產(chǎn)生或者內(nèi)核進程觸發(fā)就可以運行。
審核編輯:劉清
-
電源管理
+關注
關注
115文章
6140瀏覽量
144111 -
DTS
+關注
關注
1文章
50瀏覽量
16070 -
觸發(fā)器
+關注
關注
14文章
1995瀏覽量
61013
原文標題:電源管理入門-10 OPP介紹
文章出處:【微信號:OS與AUTOSAR研究,微信公眾號:OS與AUTOSAR研究】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論