找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 10822|回复: 2

EDK:open PCI IO PROTOCAL fail

[复制链接]
发表于 2009-3-17 13:50:56 | 显示全部楼层 |阅读模式
在EDK中做SCSI driver,环境是NT32,要在driver binding protocal support( )中打开pciio协议,当编译的时候发现open pciio protocal fail,代码如下:$ {' @. R7 q( i: e6 l
EFI_BREAKPOINT( );
0 l5 R- Q/ J5 E. A. Y3 v/ L! t  Status = gBS->OpenProtocol (* F6 D$ v. y, R9 q
                  Controller,
8 E3 C0 |& v) G1 {) p  g                  &gEfiPciIoProtocolGuid,
& o* |4 F. A) _3 U" v7 W                  (VOID **) &PciIo,. {" N; R0 X: j( }
                  This->DriverBindingHandle,5 b1 M& D6 w& `' ^8 I
                  Controller,
) D2 Q: Y- F! E/ c8 j; C                  EFI_OPEN_PROTOCOL_BY_DRIVER$ `2 u" {6 u7 ?2 f" w$ S- o
                  );
" Z7 z  f8 u8 f0 y. W5 K  if (EFI_ERROR (Status)) {( x+ [& n) F% A7 h1 B
    return Status;
5 a! o  Y* v, P* Q, I: g! H1:在NT32下打开一个PCIIO protocal,应该是与硬件没有任何关系的,为什么却fail?用VS studio调试跟踪发现,其实是在执行handle.c 文件中的CoreGetProtocolInterface( )函数时,在 Look at each protocol interface for a match时没有找到匹配protocal返回一个unsupport状态值。
$ U8 A( _& M5 U2:当我在用EDK中提供的AtapiScsiPassThruDriverBindingSupported( )测试时,同样会出现此现象。
) J0 m* B- c; T" J, _: P6 @* Q5 O请问:
5 s9 m% R' u' {! b当invoke support( )时传递的controller参数需要硬件支持吗?如果不需要为什么会fail掉呢
发表于 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。3 L9 O1 M) \6 b6 H( G
* m& ?* E( C2 j- O' I8 u' _) R
对一个想管理某种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).& j" j4 O/ c7 J# b1 s3 p
6 k8 O) w! G' P3 l% Q
UEFI 规范中connect all controller的示例程序片断:9 c& y. b6 c3 q+ P
  Status = gBS->LocateHandleBuffer (! q4 b3 Q* B' a2 F7 B
                  AllHandles,
, t8 ^, n( a; X7 X                  NULL,( P6 `' l7 ]7 a
                  NULL,
8 K9 C5 D0 c5 f5 V  g" g# k8 j                  &HandleCount,
. O$ z8 @* [2 J$ J3 n                  &HandleBuffer) b( ~, N& h' |! z8 W
                  );2 |/ W/ Y% z5 j5 R
  if (EFI_ERROR (Status)) {) H+ v# V( k) o5 ], Z) B
    return Status;
* A% }# k* |  v8 {" x, a1 l7 k  }
4 K7 ^! Y: T4 X1 R( E4 I1 D* P  G& e% I
  for (Index = 0; Index < HandleCount; Index++) {* l( f, m3 ?1 Q0 C
    Status = gBS->ConnectController (HandleBuffer[Index], NULL, NULL, TRUE);
) [- C! W% |3 K4 N/ v  }
回复

使用道具 举报

 楼主| 发表于 2009-3-23 17:37:16 | 显示全部楼层
多谢,后来追踪一下代码是这样的,在connect controller to a driver时,会调用Status = DriverBinding->supported(  ),如果controller支持该driver的话,接下来会调用Status = DriverBinding->Start ( )去执行driver的start( ).
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入计匠网

本版积分规则

Archiver|手机版|小黑屋|计匠网

GMT+8, 2026-4-4 16:20 , Processed in 0.100578 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表