時鐘API的使用
對于一般的驅(qū)動開發(fā)(非clock驅(qū)動),我們只需要在dts中配置時鐘,然后在驅(qū)動調(diào)用通用的時鐘API接口即可。
1、設備樹中配置時鐘
mmc0:mmc0@0x12345678{
compatible = "xx,xx-mmc0";
......
clocks = < &peri PERI_MCI0 >;//指定mmc0的時鐘來自PERI_MCI0,PERI_MCI0的父時鐘是peri
clocks-names = "mmc0"; //時鐘名,調(diào)用devm_clk_get獲取時鐘時,可以傳入該名字
......
};
以mmc的設備節(jié)點為例,上述mmc0指定了時鐘來自PERI_MCI0,PERI_MCI0的父時鐘是peri,并將所指定的時鐘給它命名為"mmc0"。
2、驅(qū)動中使用API接口
簡單的使用:
/* 1、獲取時鐘 */
host- >clk = devm_clk_get(&pdev- >dev, NULL); //或者devm_clk_get(&pdev- >dev, "mmc0")
if (IS_ERR(host- >clk)) {
dev_err(dev, "failed to find clock sourcen");
ret = PTR_ERR(host- >clk);
goto probe_out_free_dev;
}
/* 2、使能時鐘 */
ret = clk_prepare_enable(host- >clk);
if (ret) {
dev_err(dev, "failed to enable clock source.n");
goto probe_out_free_dev;
}
probe_out_free_dev:
kfree(host);
在驅(qū)動中操作時鐘,第一步需要獲取struct clk
指針句柄,后續(xù)都通過該指針進行操作,例如:設置頻率:
ret = clk_set_rate(host- >clk, 300000);
獲得頻率:
ret = clk_get_rate(host- >clk);
注意:devm_clk_get()的兩個參數(shù)是二選一,可以都傳入,也可以只傳入一個參數(shù)。
像i2c、mmc等這些外設驅(qū)動,通常只需要使能門控即可,因為這些外設并不是時鐘源,它們只有開關(guān)。如果直接調(diào)用clk_ser_rate
函數(shù)設置頻率,clk_set_rate
會向上傳遞,即設置它的父時鐘頻率。例如在該例子中直接調(diào)用clk_set_rate
函數(shù),最終設置的是時鐘源peri
的頻率。
-
Linux
+關(guān)注
關(guān)注
87文章
11327瀏覽量
209966 -
API
+關(guān)注
關(guān)注
2文章
1507瀏覽量
62217 -
開發(fā)
+關(guān)注
關(guān)注
0文章
370瀏覽量
40878 -
時鐘
+關(guān)注
關(guān)注
11文章
1740瀏覽量
131633
發(fā)布評論請先 登錄
相關(guān)推薦
評論