找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 10342|回复: 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,代码如下:% h% e. r  i6 s/ o1 C/ \& q2 G' ^
EFI_BREAKPOINT( );
3 @$ h$ d$ C5 w  m$ d  Status = gBS->OpenProtocol (
7 _2 ]  e9 G4 i0 N$ I0 }. S                  Controller,
7 L2 L, O$ R8 l+ P% _( G! @                  &gEfiPciIoProtocolGuid,
# K3 n" Y# i+ r+ L# K+ P                  (VOID **) &PciIo,0 w/ ^" P. |+ s4 P  K- B
                  This->DriverBindingHandle,
( M) o: f9 {: j0 ~                  Controller,
" ~9 f9 p7 Q* E6 D9 c: x' B                  EFI_OPEN_PROTOCOL_BY_DRIVER% I2 P. x6 @$ _# }+ f7 h) U6 ~' C
                  );+ E1 s7 T- y+ ?
  if (EFI_ERROR (Status)) {/ D3 u+ Q! M& I- F0 ?) y
    return Status;7 P% d0 e* {) D! G; x9 U
1:在NT32下打开一个PCIIO protocal,应该是与硬件没有任何关系的,为什么却fail?用VS studio调试跟踪发现,其实是在执行handle.c 文件中的CoreGetProtocolInterface( )函数时,在 Look at each protocol interface for a match时没有找到匹配protocal返回一个unsupport状态值。
( c) y: `# z" R; S2:当我在用EDK中提供的AtapiScsiPassThruDriverBindingSupported( )测试时,同样会出现此现象。5 Z# F( O1 n0 z( k/ |+ V
请问:
' O2 G8 g- b9 a  x" p当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。- X" a9 h7 V% ?: L: v  S5 n* _' E
, l( x9 z; ~7 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).
! _9 X  E4 w! K3 ~4 f/ E1 m6 k# i8 G
UEFI 规范中connect all controller的示例程序片断:
: c# F) O* i% C+ }& H2 `3 F) J/ Z  Status = gBS->LocateHandleBuffer (
& K  k  k+ z/ s. x- r                  AllHandles,5 t( z/ L, u1 _6 g* b
                  NULL,, |7 K7 m, h* N  h% H9 ?
                  NULL,6 }4 {# Y4 x; S7 V' C$ G
                  &HandleCount,1 a8 w, I4 ^2 a+ w
                  &HandleBuffer* M  d  h5 x0 W9 y1 l
                  );, Z# |/ x% H$ c
  if (EFI_ERROR (Status)) {: o0 Y6 p: ^  u( `
    return Status;. o5 z5 q: w) i; N' A! M+ e
  }
; Y  m. d" S! x7 n  N/ W- O( \  X6 j5 g" |  o  E
  for (Index = 0; Index < HandleCount; Index++) {6 H( |; D2 E; E" X+ I* V
    Status = gBS->ConnectController (HandleBuffer[Index], NULL, NULL, TRUE);3 b" z; Z0 H! |+ i0 }4 q4 R
  }
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-2 10:42 , Processed in 0.024825 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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