找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 10563|回复: 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,代码如下:' I' Y' ^5 S" h- Z3 q3 @6 p
EFI_BREAKPOINT( );
4 m& Q) v  e8 J  Status = gBS->OpenProtocol (! D: F( `( @( a! c) w/ U7 [
                  Controller,
, g7 X" t, [6 X( Q# E                  &gEfiPciIoProtocolGuid,
6 M1 @9 j$ G( O                  (VOID **) &PciIo,0 K) H$ T$ d, ?3 Q( b0 i
                  This->DriverBindingHandle,
( L4 |, z3 o+ c) o0 l' `                  Controller,/ b7 s8 b, p( e" }% _; E
                  EFI_OPEN_PROTOCOL_BY_DRIVER
% L) q$ {8 ]$ k& h3 h5 S                  );8 r: _* P. K  u- B* w
  if (EFI_ERROR (Status)) {
3 T* D5 a$ m; T4 b% ^    return Status;* K, K6 d* G* J0 s4 z" |; \
1:在NT32下打开一个PCIIO protocal,应该是与硬件没有任何关系的,为什么却fail?用VS studio调试跟踪发现,其实是在执行handle.c 文件中的CoreGetProtocolInterface( )函数时,在 Look at each protocol interface for a match时没有找到匹配protocal返回一个unsupport状态值。
+ g9 Q5 }- h- @( V; f: j0 I- P9 E2:当我在用EDK中提供的AtapiScsiPassThruDriverBindingSupported( )测试时,同样会出现此现象。/ {  [- s. T8 I& a. u
请问:& G5 {& o$ O, e/ \! j9 Y
当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。! f% c& L7 B; u. q2 v4 F9 t0 D

  l- e3 G! ?& Z- x1 O$ |对一个想管理某种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).4 e7 B  E. S* _% h- h6 [& d
* f$ b# B" C! P' N2 J, M
UEFI 规范中connect all controller的示例程序片断:% _7 c  n8 I; r; A: Z
  Status = gBS->LocateHandleBuffer (, {, ?7 w: Y8 b! y) D' C
                  AllHandles,
( n( D' H6 f# m6 h; y" ^                  NULL,# ~$ `8 N: x: A  i! q7 x+ [" @
                  NULL,
: t( I& o: T# ?' a2 X' j6 K% R                  &HandleCount,7 Z7 W) s. B- ?6 n& G
                  &HandleBuffer
& R7 k3 w( }* d+ O  ?9 J6 y                  );# R% u  `$ o) h& b' f- S, _7 |
  if (EFI_ERROR (Status)) {
& M# K6 D9 Y$ R! _% J8 F    return Status;
- B' ]: M& X7 U  }
4 r" {* D0 s4 ~6 `2 H& E" B
/ k8 y* u. R2 j1 {: M  for (Index = 0; Index < HandleCount; Index++) {, b: U% m' ]7 O" y
    Status = gBS->ConnectController (HandleBuffer[Index], NULL, NULL, TRUE);
2 Y+ I. O' y) g. q  }
回复

使用道具 举报

 楼主| 发表于 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-12-21 17:19 , Processed in 2.238049 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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