|
當我們在重新規劃新的system or hardware platform的時候
6 v, F; s( G3 _+ V) f常用的作法是拿原廠的reference design當參考
* J2 K3 g0 N; n" ]3 n7 q上頭component常常會換掉
2 S5 V# K9 H* d6 g; n$ N- d舊的平台和新的平台之間
, |7 A; d6 v$ n9 O5 O' ]. t; Q常常某些部份只是位址的更動
6 D5 p4 n* m- _9 E6 h* z, X例如:本來GPU的base address是0x80001000換到0x80002000
' q4 e r" N+ [' yhardware的功能和行為是一樣的
5 `" c" C' s* m, E0 ]/ n3 v2 z! H* r
面對的這樣的問題,在舊一點的Linux Kernel我們通常可以用
" \; e2 Y" s- w1) dynamical insert module 的方式將新的 base address 傳給 driver
5 _8 j0 V( E* a2 `! Q或者, ~5 R& d5 M4 q4 ?! F& x
2) 更改 driver 的 code 直接使用新的 0x80002000 的 base address0 L/ d, |% J. N7 P+ h
^4 D. V. D) n0 q/ n' r5 r+ q在新一點的Linux的kernel導入的所謂的platform driver的概念
$ }% Z5 x4 E$ U" O, t$ ^概念上我們將某一些和platform相關的資訊放在platform的level (arch/arm/mach-xxx/)7 I2 k' Q4 e0 \) a
原本的driver放在./drivers/3 |/ P" c, D- x- e% w. Z
這樣一來只要選擇到對的platform,相對應的資訊就會pass給driver
P; x, x6 C! ], K如此一來對developer來講就變得比較直覺2 W* d+ \- F- n' Z
driver本身只要針對不同的設定去動作
9 `2 W6 x1 y0 r C/ R- F" E% j不需要因為平台改變了1 i8 z+ U! k0 K& y
就改寫driver |
|