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, L1) 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時,只要選擇對的platform5 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 Z2) driver level - 控制硬體平台和實現功能。6 z: x; P% `6 n2 ~, P# Y) d

; ^9 k. q( ]( v  d# ~  nstep 1) 首先,概念上我們必須對系統註冊一個新的platform device,使用的方式就是呼叫
) ^& u  A, V. B; \6 ]. f5 g! Qplatform_device_register( information ); 將所有platform用到的device和相關的資
& k8 `+ \  ~( O) m8 r1 b訊註冊。
  o- d* u, e; ]0 _1 u0 U3 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