前面我們已經完成了CCF子系統的分析,也說明了如何實現CCF驅動,本章為該專欄的最後一篇文章,
本章我們將實現一個虛擬的gpio clk gate驅動。本章大概分為如下幾個章節:
一、 本次驅動開發涉及的知識點
二、clk provider driver的實現流程說明
三、gpio clk gate driver驅動設計
本次驅動實踐主要涉及如下幾個方面的知識點:
關於clk provider driver的開發流程,在上一篇文章中已經做了說明,此處再說明一下,主要實現
流程包括如下兩步:
本次我們主要實現gpio clk gate driver,本次實現的平臺為ubuntu16.04,我們使用之前模擬的gpio chip driver,提供gpio index,從而通過gpio 的值實現gpio clk gate driver。。另外針對clk gate,僅需要提供enable、disable、is_enabled接口即可。
結構體struct virt_gpio_clk_gate作為本次gpio clk gate driver的數據結構,主要包含clk provier device、gpio index描述信息;
struct virt_gpio_clk_gate
{
struct gpio_desc *gpiod_clk_gate;
struct clk_hw hw;
};
而結構體gpio_clk_gate_platform_data主要用於傳遞platform device for clk provider的enable gpio index信息,因為此次我們使用ubuntu16.04進行驗證,因此使用該模式傳遞gpio 信息,包含gpio index、是否低有效等信息。
struct gpio_clk_gate_platform_data
{
int enable_gpio_index;
int active_low;
};
Gpio clk provider driver的實現如下,主要完成clk provider device註冊、clk_ops的實現(enable、disable、is_enabled)等。如下即為clk provider driver的probe接口,主要調用clk_register完成clk provider的註冊、並調用of_clk_add_provider/clk_register_clkdev實現clk provider的map。
該gpio clk gate provider 的clk_ops操作接口定義如下:
該consumer driver驅動主要用於驗證gpio clk provider driver是否生效,我們在probe接口完成clk的enable操作;而在remove接口完成clk 的disable操作。接口實現如下:
該驅動使用的是gpio driver子系統專欄中實現的虛擬gpio驅動,本處不再細述,想要了解的童鞋請參考之前的文章。
此時gpio已經改變,clk已經使能;
此時gpio已經修改為0,clk 已經關閉;
以上就是本章的主要內容,我們主要實現一個gpio clk gate provider driver,至此我們基本上已完成CCF子系統的學習,本章的驅動代碼連結稍後給出。