|
2#
樓主 |
發表於 2009-12-20 15:19:34
|
只看該作者
這樣的機制對於生產SoC的vendor相當便利9 ?* E/ N* r }1 s" {$ n: }
因為不同的SoC經常需要對base address做調整' `7 V `( t3 {) F; Z6 I; t' b; x
不同的SoC只要從platform level傳遞變更的資訊給driver) I& P) D0 \0 B8 s' `& A
新的平台就可以得到driver的支援
! y8 E) l' B' i! d* l+ Q0 ~而對下游的廠商來說6 v- h L) b5 H! v
他們編譯新的kernel時,只要選擇對的platform
" y3 a7 c+ a3 [3 l9 J就可以得到對的結果
. y. o5 x1 l5 ^6 J+ @2 f
' Q, ^7 g" u/ e: ]2 w [: }/ u由以上的介紹
6 D2 A# Q/ ^ P: H/ _6 L我們可以得知platform driver需要透過兩個部分的支援( T6 x1 I& j) a4 P, l; q
1) platform level - 提供硬體平台資訊,例如irq line, base address, etc。
! P6 m: [/ q, o2 N6 u2) driver level - 控制硬體平台和實現功能。0 S: z% F1 G% I6 J! g
8 m8 v2 q/ F; x' R j! p2 ]$ ?
step 1) 首先,概念上我們必須對系統註冊一個新的platform device,使用的方式就是呼叫
% Y' I$ q% `/ jplatform_device_register( information ); 將所有platform用到的device和相關的資
3 L \; Q( \& |1 D/ q: t5 x3 {訊註冊。) U. }6 q; `& c( U: w& H4 {, F
: z, }3 A3 \: D) h$ Estep 2) 接著drvier level這邊,我們會使用 platform_driver_register()將driver註冊到系統
" a1 f4 R7 z' B, ^) R( |5 L& p裡頭,假如有任何platform device指定了這個driver,就可以將driver初始化,請它
6 x3 e( d" p- y! ^) q/ E2 J來服務這個device。
) t/ s6 P$ M+ v% H1 {; Q) [* Y% `+ N
明眼人應該不難發現- S, R5 {- S& |* n$ o8 q5 }, c: {
新的機制將hardware information和功能實作的分開了
; a8 H. A- P f! v" D資訊放到platform level規劃. ^3 `# X- e' H% K
將driver功能實作獨立出來
% ?* W3 R% W- Y. z ?" t(其實有點像是C++導入了template的概念,將資料型別和演算法分開) |
|