|
1#
樓主 |
發表於 2009-12-20 15:19:34
|
只看該作者
這樣的機制對於生產SoC的vendor相當便利! Q( r I' ^& z" x# J* N& l
因為不同的SoC經常需要對base address做調整
. m: q! P3 d9 R i8 \ r不同的SoC只要從platform level傳遞變更的資訊給driver4 O3 x3 _3 ]8 w4 M K" I8 o
新的平台就可以得到driver的支援8 u5 e% ~8 D7 z5 `% w3 U
而對下游的廠商來說# C# M- `' S1 w$ a: S, `, X7 J
他們編譯新的kernel時,只要選擇對的platform3 k7 O. F: ^" r8 w' n
就可以得到對的結果
( v' T& w6 h" e! B* S/ j; n/ n! T( M, b- S3 C
由以上的介紹4 T5 g- S+ ?0 t# p
我們可以得知platform driver需要透過兩個部分的支援
, M: u- P6 p- k8 S# I1) platform level - 提供硬體平台資訊,例如irq line, base address, etc。# D6 ?7 c ^8 R" [: M
2) driver level - 控制硬體平台和實現功能。
, ~0 t: b0 H4 e5 a
5 Z( M( Z( m4 P: ?step 1) 首先,概念上我們必須對系統註冊一個新的platform device,使用的方式就是呼叫
3 @+ W5 G5 C# l, J2 c( O+ Lplatform_device_register( information ); 將所有platform用到的device和相關的資& p" T! Z$ c4 L+ i, H j" \
訊註冊。
( m- `- _+ b9 B7 ?
$ ]! {2 M4 X+ ?1 {+ M8 k Ostep 2) 接著drvier level這邊,我們會使用 platform_driver_register()將driver註冊到系統% {7 p* s* Z( M2 ~2 I% E
裡頭,假如有任何platform device指定了這個driver,就可以將driver初始化,請它
1 W1 [, w5 w+ l0 B+ }來服務這個device。/ J( y0 F$ ?( k6 ` f# o1 r4 E
" p+ P8 p. R0 B( s" ~& H/ M$ u明眼人應該不難發現
- o3 a3 n1 g* g3 C3 }新的機制將hardware information和功能實作的分開了 p- U* O( k$ y1 i4 B; F
資訊放到platform level規劃
7 ^$ n7 [" ^" J2 G5 f將driver功能實作獨立出來
; V: e5 E: O9 }- F9 i1 I(其實有點像是C++導入了template的概念,將資料型別和演算法分開) |
|