|
|
发表于 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。; L* [* i" n9 [/ \( B9 j
. u7 t$ h! V; `8 _ N; h) e
对一个想管理某种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).) C# c9 h6 R. Q& v L4 H5 |$ R W# ^ i
1 w. v- c9 `$ I
UEFI 规范中connect all controller的示例程序片断:5 ^" V, ?& I$ D: ]# i, C0 A
Status = gBS->LocateHandleBuffer (
: p& w+ ~3 F& C/ B' a AllHandles,6 d z) A' e2 Q1 L1 v0 R* D5 f1 \( j3 Y+ S
NULL,
# g6 X2 j' m! k/ T w6 E1 L" F& B NULL,4 n( r+ r) K- D1 j) F
&HandleCount,
: Y$ j" e& ^+ X4 F, J. R6 ~ &HandleBuffer, d' w- M6 c! B0 I+ E4 P# Z
);
( Q$ S/ Y, @$ b, e" X. f; T8 H if (EFI_ERROR (Status)) {6 s8 F- Y8 \$ D5 N
return Status;; h. |' c2 o4 Z: R
}
8 ^- ^: M1 }0 g: \4 f" G. s3 [3 s8 Y7 e
for (Index = 0; Index < HandleCount; Index++) {
; Q" X: z. ]6 z, y! ?, v) Y7 p Status = gBS->ConnectController (HandleBuffer[Index], NULL, NULL, TRUE);* f, ~9 d; m! L+ i M1 E" N/ E" B: g
} |
|