Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 2735|回復: 1
打印 上一主題 下一主題

Linux Platform Device & Driver~

  [複製鏈接]
跳轉到指定樓層
1#
發表於 2009-12-20 15:19:15 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
當我們在重新規劃新的system or hardware platform的時候0 j2 P8 n( Y5 i! J! e3 E/ N! [
常用的作法是拿原廠的reference design當參考& R& u8 n, _# Q' e9 g: {
上頭component常常會換掉& h4 P# C8 B- A, G# R& {# P
舊的平台和新的平台之間( E& O6 x$ J% W) z
常常某些部份只是位址的更動
! F  z' O, V9 f* {8 M2 t0 K9 }例如:本來GPU的base address是0x80001000換到0x80002000* Y6 @. a! E& a8 `: Y8 |
hardware的功能和行為是一樣的
% i# f4 q5 o6 v) T' {2 X) y+ v, G6 }; I
9 c+ u( y) V" ?- H面對的這樣的問題,在舊一點的Linux Kernel我們通常可以用
* A+ `! x$ v6 X) a! M: i2 w5 R1 u1) dynamical insert module 的方式將新的 base address 傳給 driver
" `% f) v' Q- p1 `0 ^2 s$ q+ r或者
3 c2 |2 I, w4 O# S: R5 I+ d  B2) 更改 driver 的 code 直接使用新的 0x80002000 的 base address
, h2 W$ w+ q" J0 x* q, l) {. w7 e" u, w8 }( T+ e
在新一點的Linux的kernel導入的所謂的platform driver的概念
. x/ ?( t. z: @" ?概念上我們將某一些和platform相關的資訊放在platform的level (arch/arm/mach-xxx/)  T1 ]) E5 H/ r' o4 {8 P7 n
原本的driver放在./drivers/% f& F  ~$ k* _+ \( }
這樣一來只要選擇到對的platform,相對應的資訊就會pass給driver, i/ p2 ~( I9 B* K, e6 s% R* r
如此一來對developer來講就變得比較直覺
# F- ^* f" C' X. ~" t: Kdriver本身只要針對不同的設定去動作
" |! {- a- F3 U8 @不需要因為平台改變了
. k  r" c6 v- X! y- g' ~1 Q就改寫driver
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂1 踩 分享分享
2#
 樓主| 發表於 2009-12-20 15:19:34 | 只看該作者
這樣的機制對於生產SoC的vendor相當便利
  V5 L5 }/ P$ z& o& o0 A因為不同的SoC經常需要對base address做調整
8 f! s# `$ H) f不同的SoC只要從platform level傳遞變更的資訊給driver$ s8 u: V; B: a! N0 ]: d
新的平台就可以得到driver的支援
2 Q) j, T' P8 r& E而對下游的廠商來說0 G+ i) F7 x- H' M$ J; D
他們編譯新的kernel時,只要選擇對的platform1 i. j: E( \! N2 |
就可以得到對的結果9 w( k! ~% w3 C* }

* M, e% ]  H# g1 |由以上的介紹
4 J8 G* o8 j2 C- c# n8 }5 g  L我們可以得知platform driver需要透過兩個部分的支援, P9 b* ]0 ?1 Z, R/ R) ?& ^
1) platform level - 提供硬體平台資訊,例如irq line, base address, etc。  q+ n0 x6 C% f9 x" x: P: x
2) driver level - 控制硬體平台和實現功能。
% T: n8 [0 m/ r" a$ k; j9 F* `. Q! g8 ~+ V2 x
step 1) 首先,概念上我們必須對系統註冊一個新的platform device,使用的方式就是呼叫+ N. y" B0 {! E! e$ y  B' S6 ^! t
platform_device_register( information ); 將所有platform用到的device和相關的資
3 K5 z. J, [8 ?$ {訊註冊。* Q- E9 H( E! i5 s, c

, J# q+ g. Q* h+ y3 t/ X2 Istep 2) 接著drvier level這邊,我們會使用 platform_driver_register()將driver註冊到系統! P( n) o$ K/ ]+ E1 g3 g
裡頭,假如有任何platform device指定了這個driver,就可以將driver初始化,請它
1 g& `4 n' i1 H  T7 Y3 g5 B0 v來服務這個device。
$ j0 Q$ e8 i7 ]. M  U" [; \5 B/ x/ p8 S
明眼人應該不難發現- n. g/ S8 \9 X, v( m/ X& }
新的機制將hardware information和功能實作的分開了, \' j8 \' B( l. A7 A
資訊放到platform level規劃
1 I, ]) j4 b- U0 R* l5 }* [- D將driver功能實作獨立出來  h3 |7 O$ |  J) n- W
(其實有點像是C++導入了template的概念,將資料型別和演算法分開)
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

首頁|手機版|Chip123 科技應用創新平台 |新契機國際商機整合股份有限公司

GMT+8, 2024-5-6 12:21 PM , Processed in 0.100006 second(s), 16 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表