找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 9731|回复: 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,代码如下:
8 o, m1 {4 L9 A4 [, o1 E4 g EFI_BREAKPOINT( );% Y! j0 \, H& w% Y% ?
  Status = gBS->OpenProtocol (6 C. f2 V$ B7 u6 [9 H& [
                  Controller,
1 q4 W& N, b% d7 |$ E4 t- K                  &gEfiPciIoProtocolGuid,
9 |" W3 ^0 x, d/ O0 N5 {; b# o                  (VOID **) &PciIo,
0 C( x" w/ q7 Y% b                  This->DriverBindingHandle,
3 ^9 P9 F" V# H2 V5 A: Q                  Controller,8 G- ?% B" f3 i8 f/ Q$ l" j
                  EFI_OPEN_PROTOCOL_BY_DRIVER
5 M4 V) z. r$ `  b' P                  );( x5 p- A: [, a; v' y
  if (EFI_ERROR (Status)) {
$ @5 x& M+ |0 W( }1 J    return Status;
  m' C! K8 o( _7 X3 h  N1:在NT32下打开一个PCIIO protocal,应该是与硬件没有任何关系的,为什么却fail?用VS studio调试跟踪发现,其实是在执行handle.c 文件中的CoreGetProtocolInterface( )函数时,在 Look at each protocol interface for a match时没有找到匹配protocal返回一个unsupport状态值。
4 B8 f6 x% U9 d2:当我在用EDK中提供的AtapiScsiPassThruDriverBindingSupported( )测试时,同样会出现此现象。; e7 y0 D1 }  G) n- e" @8 x
请问:& |0 ^5 b. H& `6 n
当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。" 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  }
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 17:57 , Processed in 0.029084 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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