|
2#
樓主 |
發表於 2009-12-20 15:19:34
|
只看該作者
這樣的機制對於生產SoC的vendor相當便利 i8 ^- p) k: b6 c( m: s
因為不同的SoC經常需要對base address做調整
3 v+ Z" X+ c9 f- r% m1 X不同的SoC只要從platform level傳遞變更的資訊給driver: M. B6 v" j/ N) X8 A
新的平台就可以得到driver的支援6 ~$ U' }) u; {# E) w
而對下游的廠商來說
$ U$ N3 c+ b# K+ v7 c7 u$ E8 C他們編譯新的kernel時,只要選擇對的platform
7 {2 N; p- l+ [- _: q' W就可以得到對的結果0 q' J2 _9 P6 c* Q( V, p; j
, D" n* F6 Z" q* A由以上的介紹6 G4 I V$ E1 x, z# d1 [
我們可以得知platform driver需要透過兩個部分的支援9 s, c7 r* g/ _) \; o1 v7 P
1) platform level - 提供硬體平台資訊,例如irq line, base address, etc。; I/ M; k5 L0 y+ Q6 q% i
2) driver level - 控制硬體平台和實現功能。
1 q& c& D. O) C- v J5 m4 t' p5 X% V5 K6 i M; M8 `# z7 O
step 1) 首先,概念上我們必須對系統註冊一個新的platform device,使用的方式就是呼叫
. f! p& t, h3 c/ @platform_device_register( information ); 將所有platform用到的device和相關的資 W0 @0 m3 j: v3 L3 v# [
訊註冊。
5 i; ^' z2 X" ]; a' h- {) O* s e5 E
step 2) 接著drvier level這邊,我們會使用 platform_driver_register()將driver註冊到系統# ~3 V* @; |4 u9 o9 c
裡頭,假如有任何platform device指定了這個driver,就可以將driver初始化,請它
& y3 P1 A7 Z" B6 l來服務這個device。' X$ Z9 {" p/ T8 z2 T6 Z: F* Z, t @; r
) o) C% D8 n: z1 J7 V0 x* _: R明眼人應該不難發現# ~- d& J7 U8 \0 O- m1 y1 [: t6 Z _
新的機制將hardware information和功能實作的分開了' g- T# v8 }0 l. F8 r, F! {
資訊放到platform level規劃1 g2 t% \/ {2 h5 D
將driver功能實作獨立出來
/ k6 z- W% X' ?( j5 j(其實有點像是C++導入了template的概念,將資料型別和演算法分開) |
|