|
发表于 2009-3-17 14:57:51
|
显示全部楼层
Driver Binding Protcol.support()用来支持将driver和要管理的device动态匹配起来,driver不能对传入的handle有任何假定,传入的handle有可能是device handle或者是和硬件无关的image handle和service handle。driver在support()函数中判断传入的handle是不是自己要管理的device的handle。
0 Y$ c6 t. i: X- G, R1 ]- x0 v
" |$ X1 U5 U) s. s. }* K对一个想管理某种PCI device的driver来说传入的handle没有PCI IO Protocl是正常的。没有PCI IO Protcol说明这个handle不是PCI device handle,甚至根本就不是device handle。(PCI bus driver在enumeration的时候会有发现的每个PCI device创建一个device handle,并在此handle上安装PCI IO Protocol).; _/ a/ L: ]5 e9 z/ P! ~
! \ o* S2 U% k: b
UEFI 规范中connect all controller的示例程序片断:2 x0 \) D! R- g5 k+ ~5 b
Status = gBS->LocateHandleBuffer (
1 m, s* N; W% X' w' C+ {- y AllHandles,0 H/ D- b* |& S; K; `
NULL,
7 y4 b% V2 I* z) ^0 @ NULL,
. M* j' b) _. A. q H &HandleCount,
. v5 j4 u3 |3 }9 c1 c &HandleBuffer
1 u1 f8 T! Z) ~8 p, A% R7 E );, P* O* h, |% k9 U7 F, ?. @
if (EFI_ERROR (Status)) {
6 l% c" k8 t: H/ c4 f return Status;- G- E8 r, X7 s+ u! q6 ]
}
8 ]' W; V; ^2 Q# J8 t
' L0 P+ \% y0 s1 h! z l for (Index = 0; Index < HandleCount; Index++) {
1 J# a' }9 I* D# a! I Status = gBS->ConnectController (HandleBuffer[Index], NULL, NULL, TRUE);+ K1 A) j: J" ?; `. g) I+ Q* I
} |
|