Chip123 科技應用創新平台
標題:
Linux Platform Device & Driver~
[打印本頁]
作者:
gogojesse
時間:
2009-12-20 03:19 PM
標題:
Linux Platform Device & Driver~
當我們在重新規劃新的system or hardware platform的時候
0 U2 a3 V* s7 F- b
常用的作法是拿原廠的reference design當參考
7 M4 N: T5 _0 M. `2 ?; s; z
上頭component常常會換掉
; Y& B3 Q4 N! R3 C6 B& m! h" |
舊的平台和新的平台之間
% N, v& N: \+ R8 A# R; T
常常某些部份只是位址的更動
/ ?7 Z! b- `+ ^2 ?$ Z6 h
例如:本來GPU的base address是0x80001000換到0x80002000
* v! R `) V. j" w# X+ w- l8 ?7 {) r
hardware的功能和行為是一樣的
* o0 }- U9 T d6 _" @; E, K
1 L8 C1 d( p- v2 h
面對的這樣的問題,在舊一點的Linux Kernel我們通常可以用
, V$ E0 k% F( H. V, L
1) dynamical insert module 的方式將新的 base address 傳給 driver
6 ?) v2 v- \& j! r, ~5 |
或者
, {9 n# D0 A% J5 q; C
2) 更改 driver 的 code 直接使用新的 0x80002000 的 base address
- l8 {- n1 }( o
$ K7 v/ q4 {( V; h. [' B
在新一點的Linux的kernel導入的所謂的platform driver的概念
6 y, A1 {4 }0 S' O
概念上我們將某一些和platform相關的資訊放在platform的level (arch/arm/mach-xxx/)
+ B7 H: q- B: v: M/ T9 B# ]
原本的driver放在./drivers/
; O/ j0 B9 |! y8 E$ x) R
這樣一來只要選擇到對的platform,相對應的資訊就會pass給driver
/ T% y X" g( y: ~; W
如此一來對developer來講就變得比較直覺
2 p f9 @) t* _& N4 f! {% @
driver本身只要針對不同的設定去動作
* a' {9 _8 B( \* Y5 n- @% q
不需要因為平台改變了
& I, f4 _- Q4 u0 [/ i" l: R' {
就改寫driver
作者:
gogojesse
時間:
2009-12-20 03:19 PM
這樣的機制對於生產SoC的vendor相當便利
; a& b" @. ^9 k$ o9 O7 H) o+ o; q
因為不同的SoC經常需要對base address做調整
& g+ |3 X, X5 }
不同的SoC只要從platform level傳遞變更的資訊給driver
; P4 m0 A& X5 Z1 G
新的平台就可以得到driver的支援
+ ^9 h- |: P) w- |/ X: V
而對下游的廠商來說
8 Y( C3 z* w) ]- ?
他們編譯新的kernel時,只要選擇對的platform
5 i7 T' F" g2 ?
就可以得到對的結果
* X' B" l, K4 M) y' t. Q
* Z! F2 h3 K: u
由以上的介紹
" H% h& \2 g6 z9 L R7 n
我們可以得知platform driver需要透過兩個部分的支援
4 m9 T8 u; i9 u4 O& d( ?
1) platform level - 提供硬體平台資訊,例如irq line, base address, etc。
9 k+ x* F4 C5 A; D1 ~5 Z
2) driver level - 控制硬體平台和實現功能。
6 z: x; P% `6 n2 ~, P# Y) d
; ^9 k. q( ]( v d# ~ n
step 1) 首先,概念上我們必須對系統註冊一個新的platform device,使用的方式就是呼叫
) ^& u A, V. B; \6 ]. f5 g! Q
platform_device_register( information ); 將所有platform用到的device和相關的資
& k8 `+ \ ~( O) m8 r1 b
訊註冊。
o- d* u, e; ]0 _1 u0 U
3 n, k$ t1 P* v" s1 }# v& j
step 2) 接著drvier level這邊,我們會使用 platform_driver_register()將driver註冊到系統
: ^- e3 M0 z( x6 u5 [
裡頭,假如有任何platform device指定了這個driver,就可以將driver初始化,請它
* |; F$ U& S0 E7 V, U
來服務這個device。
j" ~' R c; v9 s
# B0 n- H6 f; o2 N
明眼人應該不難發現
) }: n! g' I) i. [; N
新的機制將hardware information和功能實作的分開了
5 m& ~4 v; ~, j, Y; |/ W
資訊放到platform level規劃
0 B7 G& B4 _4 @+ [
將driver功能實作獨立出來
$ s& q5 g' O" Z+ d& a
(其實有點像是C++導入了template的概念,將資料型別和演算法分開)
歡迎光臨 Chip123 科技應用創新平台 (http://chip123.com/)
Powered by Discuz! X3.2