Chip123 科技應用創新平台
標題:
Linux Platform Device & Driver~
[打印本頁]
作者:
gogojesse
時間:
2009-12-20 03:19 PM
標題:
Linux Platform Device & Driver~
當我們在重新規劃新的system or hardware platform的時候
9 J$ U3 S" u2 `+ d5 y! K' F. A8 S
常用的作法是拿原廠的reference design當參考
8 E, ^+ C# i6 w/ x9 d2 H
上頭component常常會換掉
1 ?4 `+ k7 w9 M, t( K0 S% s! J
舊的平台和新的平台之間
" v+ C1 Z$ ~4 y( a
常常某些部份只是位址的更動
6 \4 V- o; z B: b) v: j
例如:本來GPU的base address是0x80001000換到0x80002000
8 n$ n8 F _; N& a6 d
hardware的功能和行為是一樣的
/ K7 V2 x% f' U3 E" R& l
/ J' r7 K9 A! b; p- v$ J, }
面對的這樣的問題,在舊一點的Linux Kernel我們通常可以用
0 k9 |4 E' Q+ w; ], f
1) dynamical insert module 的方式將新的 base address 傳給 driver
' k; ^$ |' _% P; |/ `$ m
或者
2 ^, P% W8 @( d5 k
2) 更改 driver 的 code 直接使用新的 0x80002000 的 base address
% U+ y, d1 G1 H0 i
5 W: N- U5 V/ ]2 {% q5 u
在新一點的Linux的kernel導入的所謂的platform driver的概念
6 E& [9 m5 O- C, d) [
概念上我們將某一些和platform相關的資訊放在platform的level (arch/arm/mach-xxx/)
4 K, e2 F% l8 X+ ^" [
原本的driver放在./drivers/
C$ x! e, ^$ l" q
這樣一來只要選擇到對的platform,相對應的資訊就會pass給driver
& L# G# W4 h6 ?- D
如此一來對developer來講就變得比較直覺
! x0 Z+ D- I& A8 s" x9 k8 |- M
driver本身只要針對不同的設定去動作
; q4 T9 F* L! O
不需要因為平台改變了
1 B/ |0 @3 j# {
就改寫driver
作者:
gogojesse
時間:
2009-12-20 03:19 PM
這樣的機制對於生產SoC的vendor相當便利
: W% c* d' X7 H s
因為不同的SoC經常需要對base address做調整
$ \6 Q6 [( |/ R6 h: ?- j# N4 t
不同的SoC只要從platform level傳遞變更的資訊給driver
3 F% N: O' g& O1 Y$ M1 e
新的平台就可以得到driver的支援
- g1 |( i+ @5 Y# m( k4 D4 h, Z
而對下游的廠商來說
8 T& O+ A5 E; Q
他們編譯新的kernel時,只要選擇對的platform
. }$ @, G! ]" H
就可以得到對的結果
! i8 D$ p5 h( y) ]/ W
9 d, m' I0 Y! b, G. r
由以上的介紹
* h' K0 W$ W3 W- r/ i
我們可以得知platform driver需要透過兩個部分的支援
+ v O+ L9 J" ]" x
1) platform level - 提供硬體平台資訊,例如irq line, base address, etc。
9 c a6 `6 y5 ~5 b
2) driver level - 控制硬體平台和實現功能。
, g2 y/ a: P$ ?% b f/ r, H
8 Y% a, r3 C, s* s" u/ H7 j3 @) u
step 1) 首先,概念上我們必須對系統註冊一個新的platform device,使用的方式就是呼叫
; \* _) m. |/ q9 e+ ?+ n
platform_device_register( information ); 將所有platform用到的device和相關的資
/ H" j1 n$ |& V$ g
訊註冊。
' ?1 B! x) x7 B; ^% ^+ m
" v$ R) Q9 R( w. k: C
step 2) 接著drvier level這邊,我們會使用 platform_driver_register()將driver註冊到系統
9 C) J0 E- v+ r+ F
裡頭,假如有任何platform device指定了這個driver,就可以將driver初始化,請它
. b# e- J, t% F& k. \
來服務這個device。
; D: ^5 | i7 H* x
9 A' K6 g# x2 ]" T. I o
明眼人應該不難發現
' }) x2 Y2 u3 w) `2 A& L* o: }
新的機制將hardware information和功能實作的分開了
4 l3 l2 S. n8 P; p
資訊放到platform level規劃
6 N; z% w( j: b9 R- z
將driver功能實作獨立出來
* H$ b, A8 v( [& m, V
(其實有點像是C++導入了template的概念,將資料型別和演算法分開)
歡迎光臨 Chip123 科技應用創新平台 (http://chip123.com/)
Powered by Discuz! X3.2