|
发表于 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。" n% z. J$ U! g- g$ i; m R9 P
! u3 J) F3 p. d, T
对一个想管理某种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).
% m0 K+ h$ D2 G1 {2 a; ` [6 q" N0 }+ n! L
UEFI 规范中connect all controller的示例程序片断:
6 c' D5 W& ?( P6 B( i4 q& C8 N Status = gBS->LocateHandleBuffer (
4 t$ a/ V- ^, a# k' | AllHandles,
% U# _5 y/ R E+ j @ NULL,
: V* T' L7 y- g% C5 N NULL,/ p _; k5 Z v# n, Z
&HandleCount,+ r f$ ?* i# H' _1 Y& [
&HandleBuffer
6 p5 `( p7 C6 ^* s$ ]) H P2 } );
3 l/ |- f* G- c# j( o4 x if (EFI_ERROR (Status)) {
! Q9 \3 ^2 v$ \0 q return Status;
, }. {0 U9 U) C0 o6 |2 w }5 A) Y9 F0 G# F. u/ j1 H
1 R) m, J9 X& c2 q- s, e: i/ g for (Index = 0; Index < HandleCount; Index++) {: S1 A( H% F% d/ d
Status = gBS->ConnectController (HandleBuffer[Index], NULL, NULL, TRUE);
2 f; z' K3 q* f3 O3 S+ v } |
|