對clock時鍾框架見解


clock時鍾框架稱為common clock framework

從圖中我們可以看出時鍾提供者(clock provider)和時鍾使用者(clock consumer)是通過common clock framework來通信的,而通信的基礎都是設備樹

provider側:解析設備樹的的#clock-cells(必須有,若屬性值為0,表示provider就提供一個clock output輸出,若屬性值為1,表示provider就提供多個clock output輸出)和#clock-output-names(非必須有)屬性,通過clk_register等一系列注冊函數把硬件時鍾樹注冊,然后調用of_clk_add_provider接口(這是provider和consumer連接的橋梁)組成時鍾鏈表供時鍾使用者查詢使用

consumer側:解析設備樹#clocks ,#clock-names 等屬性,調用clk_get,devm_clk_get,clk_enable,clk_set_rate等一系列接口函數從provider側組織好的時鍾鏈表中獲取匹配的時鍾句柄(struct clk類型)

對我們使用者(device driver)來說,struct clk只是訪問clock的一個句柄,不用關心它內部的具體形態。所以只需知道以下常用接口就可以:

clock獲取有關的API:device driver在操作設備的clock之前,需要先獲取和該clock關聯的struct clk指針,獲取的接口如下:

struct clk *clk_get(struct device *dev, const char *id);

struct clk *devm_clk_get(struct device *dev, const char *id);

void clk_put(struct clk *clk);

void devm_clk_put(struct device *dev, struct clk *clk);

struct clk *clk_get_sys(const char *dev_id, const char *con_id);

struct clk *of_clk_get(struct device_node *np, int index);

struct clk *of_clk_get_by_name(struct device_node *np, const char *name);

struct clk *of_clk_get_from_provider(struct of_phandle_args *clkspec);

clock控制有關的API:

int clk_prepare(struct clk *clk)

void clk_unprepare(struct clk *clk)

static inline int clk_enable(struct clk *clk)

static inline void clk_disable(struct clk *clk)

static inline unsigned long clk_get_rate(struct clk *clk)

static inline int clk_set_rate(struct clk *clk, unsigned long rate)

static inline long clk_round_rate(struct clk *clk, unsigned long rate)

static inline int clk_set_parent(struct clk *clk, struct clk *parent)

static inline struct clk *clk_get_parent(struct clk *clk)

--------------------------------------------------------------------------------------------------------------------

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM