|
|
发表于 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。- o4 z' @3 d5 K( P+ s: S4 K
# _2 C3 o! p0 F
对一个想管理某种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).* I& X9 Z+ }& p% H! o, m$ m
( B5 a2 s( S" E k
UEFI 规范中connect all controller的示例程序片断:
: |' |3 c! R, o8 x! w4 u; T5 J8 r# L+ ~ Status = gBS->LocateHandleBuffer (
& l3 D# L. n& }9 _9 E AllHandles,7 k ^5 s- k' [3 G+ A
NULL,
; e% W/ H6 S" R/ {% q3 W2 | NULL,
4 P9 T' g; w; r &HandleCount,2 U$ X$ x0 ^' g) D
&HandleBuffer, e* O$ _& f K* e
);
, k1 v9 j& G1 i1 W# n% L2 J if (EFI_ERROR (Status)) {- D: Q/ x+ U' u, N8 W
return Status;
& E1 v8 u, m( Q& b' n/ \# p }
3 H$ f: v; P, K/ ?4 {4 e v9 J, t
- a& Q/ _7 L/ Q2 s for (Index = 0; Index < HandleCount; Index++) {
* e! w# _% ^6 B: N' A Status = gBS->ConnectController (HandleBuffer[Index], NULL, NULL, TRUE);
* p+ @0 K% i( s/ a7 p5 R# }+ n! ?2 d } |
|