|
這樣的機制對於生產SoC的vendor相當便利
8 Q! {+ ~! `# Q; ^) W5 s因為不同的SoC經常需要對base address做調整
) h7 J- V% d% [6 x5 Q不同的SoC只要從platform level傳遞變更的資訊給driver
2 o3 T" O. b" x) l* n1 u6 a新的平台就可以得到driver的支援
, D6 v$ s3 }) W, B/ a而對下游的廠商來說
# ?0 _8 P, i c8 O" i' y7 `他們編譯新的kernel時,只要選擇對的platform+ z( t! T6 F; Z! S9 b, R" N& Q
就可以得到對的結果
" l: Z+ c2 ?- X2 L5 m' F% B3 K# ?4 N
由以上的介紹% y4 f2 R7 @% W, a$ `! B
我們可以得知platform driver需要透過兩個部分的支援* z: j; w3 l& t& }- F( Q% G
1) platform level - 提供硬體平台資訊,例如irq line, base address, etc。7 j5 y' R, h k% ~! v% d; m
2) driver level - 控制硬體平台和實現功能。
; h/ T1 V. q& b8 W7 J- Z; H8 f, p, x* r+ w! X
step 1) 首先,概念上我們必須對系統註冊一個新的platform device,使用的方式就是呼叫
& F9 S6 x" e V7 | J6 R) yplatform_device_register( information ); 將所有platform用到的device和相關的資7 b1 H6 M, ]/ Q# E# U2 x- C
訊註冊。
g! _5 h$ |% @' d! Q) t+ d# r# I/ { Y( D+ w# x
step 2) 接著drvier level這邊,我們會使用 platform_driver_register()將driver註冊到系統: A1 P* M1 {9 {, F3 |8 y1 T
裡頭,假如有任何platform device指定了這個driver,就可以將driver初始化,請它
. F0 w# O, F/ a6 W! y( s( N% S; q來服務這個device。( r. w c( c s6 [3 ?0 Y8 v
5 v% J; J' N& j3 E0 y# D明眼人應該不難發現 ^9 l/ e3 f9 e
新的機制將hardware information和功能實作的分開了, Q7 b S0 H1 K l
資訊放到platform level規劃
7 ?) R% `- Q/ u- h" w5 ^" s將driver功能實作獨立出來* u, U% u2 j; j4 A: [
(其實有點像是C++導入了template的概念,將資料型別和演算法分開) |
|