linux裝置驅動程式之時鐘管理(3)----我的那塊兒蛋糕
21世紀不缺什麼了?不缺程式員了,不缺屌絲程式員了,滿山遍野的程式員,各種培訓機構,每個月都有n多個程式員橫空出世,他們一代代的替換著那些遠離這個行業的人。話說程式員有很多境界,比如像我這種,就屬於比較浮躁的程式員,以為自己會的東西不少,其實什麼都不會。
時間長了,發現自己真的什麼也沒有,哎,難到真的什麼也沒有嘛?不是,至少屌絲程式員好有一個夢,每天可能還能吃上一塊兒蛋糕。
最近祖國三大軍區都有演戲,什麼遠程彈道飛彈,巨浪,東風全上了,儼然要有跟小日本火拚的姿態,趁著還是和平的時候,多吃兩塊蛋糕吧,不知道明天還有沒有機會吃到。
那時鐘管理這邊,怎麼去拿到那個蛋糕著?
80行 你看見了,那個dev_id其實就是所屬裝置的name啦
81行 又套一層,哎,短小又精悍的函數啊。不廢話,進入。。
68行 鎖住互斥鎖,這個互斥鎖是全域的,給你好看:
69行根據 那個兩個id調用clk_find函數尋找我們需要的clk,沒什麼可說的,直接進入
40行 一個for迴圈,在clocks這個全域的鏈表裡遍曆,所有的鎖都連結在上面呢
42-46行,如果dev_id匹配,那麼match+=2
47-50行,如果con_id匹配,那麼match+=1
如果mach大於零,說明之後有一個匹配上了,如果match=3,兩個條件都匹配,這是最完美的情況了,如果不是,那麼繼續迴圈吧。
我們從注釋上可以看出,匹配的優先程度是:dev+con > dev only > con only
好的,返回到clk_get_sys函數
第70-71 如果沒有找到cl設定為NULL
72行 釋放鎖
73行 返回要找的clk
這個過程也很簡單,沒有想象的那麼複雜。
呵呵。。時鐘時擷取到了,有沒有興趣看一下他們的使能,禁止,設定頻率的那幾個函數?其實也非常簡單,他們都是平台相關的,還是以三星的s3c2410為例子看一個函數吧,其它的函數都跟它類似,不用多講了就,咱們看一個常用的,上代碼:
這是一個三星平台的通用函數,其它的,諸如2410,6410等等吧,都是可以用的,因為它與具體的板級脫離開 ,都是用一個函數指標實現的具體操作。
90-90行 判斷一個clk的有效性,體現出了健壯性函數的一個很好的例子
92行,你看到了又調用了它本身,分明他媽的是個嵌套嘛,不過你看一個參數,呵呵。。明白了吧,使能一個裝置的clock,一定要保定它父裝置的clock是使能的啊。
94-99行 你看到了啊。。使能的時候是要禁止中斷的哦,親。
97行,直接調用了clk結構中的enable函數,這個是在具體的板級檔案中實現的 ,對於咱們這兒就是s3c2410-clock.c,好的,進去看看嘍,親。
你看到了哦,親,他們的enable函數都指向了同一個函數s3c2410_clkcon_enable,你沒有個疑問嗎?這個函數好強大哦,什麼樣的使能它都能處理?進去看看不就知道啦。走你:
呵呵。。有木有恍然大悟?呵呵。。好吧,你成才了。。呵呵。。看到了,就是靠這個控制標誌clk->ctrlbit,在寫控制器中時鐘控制器的相應位來實現的,親,記得給好評哦,講的我都累了。
我歇會兒啊,聽聽歌。。你可以繼續學習了。我得休息下了,睡會兒。哭泣,美女走了!