找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 10953|回复: 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,代码如下:
2 M, }% O$ O- w2 Q; t. H EFI_BREAKPOINT( );% s7 Q/ B! O) X3 U. x
  Status = gBS->OpenProtocol (
1 C, X: `# E1 g& J/ W                  Controller,( L$ F8 J: [9 H1 y5 L
                  &gEfiPciIoProtocolGuid," ~8 x4 W0 J: i
                  (VOID **) &PciIo,
* |7 H5 w: ~3 D$ n                  This->DriverBindingHandle,
3 v) w& \/ L6 Z, u7 f3 ~                  Controller,$ G8 S" ~8 D2 b$ @8 D
                  EFI_OPEN_PROTOCOL_BY_DRIVER# S7 ]: W! ^3 q. I1 Z+ y, [
                  );# a# F" c, h9 [3 ]
  if (EFI_ERROR (Status)) {% ]+ E/ H3 h1 B+ ~4 p6 Q1 r; F' U
    return Status;! \7 _4 T+ k6 G7 o
1:在NT32下打开一个PCIIO protocal,应该是与硬件没有任何关系的,为什么却fail?用VS studio调试跟踪发现,其实是在执行handle.c 文件中的CoreGetProtocolInterface( )函数时,在 Look at each protocol interface for a match时没有找到匹配protocal返回一个unsupport状态值。
, `5 B5 {# G: B$ k: K2:当我在用EDK中提供的AtapiScsiPassThruDriverBindingSupported( )测试时,同样会出现此现象。, d* i: u; `  N
请问:  N& u/ E( Z2 b! [' l* Z
当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。1 d# C6 H# ?3 u* B( @0 h+ O  x  n
8 y; C6 S; U6 g  u  N, e: c
对一个想管理某种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 I2 U% P' C& V+ h0 \( k
# S+ }* N6 W; mUEFI 规范中connect all controller的示例程序片断:/ e6 ?8 u- z# F- f6 @
  Status = gBS->LocateHandleBuffer (
6 c$ S+ e/ M7 q7 [2 j- j                  AllHandles,6 g, S( l1 i4 L  A) @& y: _1 y
                  NULL,7 x6 Q* y' h( A0 k3 x3 y
                  NULL,4 u! [: P# i1 Z" r
                  &HandleCount,% G$ R- z7 p, Y* F1 `5 q
                  &HandleBuffer
. o: w) w0 i; a                  );' h& B$ C4 g* C9 F
  if (EFI_ERROR (Status)) {$ i- q! k# V# c# ~2 `
    return Status;
  Z8 I& c' Y4 X& n6 ^  }
. g7 A* u  F1 o* _; P3 X
% n# M- Y, x# d+ ^4 W& O7 Y  for (Index = 0; Index < HandleCount; Index++) {
+ _( v$ [% U5 w& w3 e0 t    Status = gBS->ConnectController (HandleBuffer[Index], NULL, NULL, TRUE);
* R1 d( t5 |2 k' P  }
回复

使用道具 举报

 楼主| 发表于 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-10-12 08:07 , Processed in 0.058298 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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