找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 10823|回复: 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,代码如下:
9 u# {: c/ o4 _( h EFI_BREAKPOINT( );
4 {% o3 o7 E: Q, l  Status = gBS->OpenProtocol (& c* [" C' a. e& g
                  Controller,
/ x# @% s' W1 ~* c                  &gEfiPciIoProtocolGuid,+ T! U- X( P. t" G3 V: J8 j9 |8 @
                  (VOID **) &PciIo,8 z6 I( z( [/ Z3 @, T& q  W
                  This->DriverBindingHandle,2 p* U- z9 j* G6 X. Y8 B
                  Controller,& B: X" ~) K6 s( y" K8 Y: B4 Z  j
                  EFI_OPEN_PROTOCOL_BY_DRIVER" ?7 Q! u0 ?* ~+ G! w+ n5 ~
                  );
4 T: l8 ^' h. q0 A4 q- Q" J  if (EFI_ERROR (Status)) {
, K6 n2 v. _) d* r# j9 P    return Status;  W+ [% l  {' m( ^
1:在NT32下打开一个PCIIO protocal,应该是与硬件没有任何关系的,为什么却fail?用VS studio调试跟踪发现,其实是在执行handle.c 文件中的CoreGetProtocolInterface( )函数时,在 Look at each protocol interface for a match时没有找到匹配protocal返回一个unsupport状态值。/ `3 v. u5 K6 E  H2 _5 A. m/ l
2:当我在用EDK中提供的AtapiScsiPassThruDriverBindingSupported( )测试时,同样会出现此现象。8 @2 d1 w3 e! F/ P. u0 v& W) k) M
请问:! M; }0 _) x6 w) S6 `& g- g
当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。
+ C% s9 Z5 u! G. w2 K
& I1 p( Q8 ?8 f0 `* o  ?/ j) ]+ D  p对一个想管理某种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).
; L- ^( J4 e! H3 i# i& d6 w" U# A0 Y4 j1 m0 I, U: r. Z
UEFI 规范中connect all controller的示例程序片断:
0 |+ F" Z. C& }0 G: r: ]& Z# M  Status = gBS->LocateHandleBuffer (1 p  p* M9 H* p1 I' M& t# [
                  AllHandles,
# w3 p) z% F4 K                  NULL,
$ c, ~& q6 j) t. f% |, _                  NULL,
# {* |$ l6 H; R* f+ w, [& y; o: N                  &HandleCount,( [8 N. C# G% j4 |
                  &HandleBuffer% _6 }6 z6 A1 a9 r
                  );
0 `, _; t( S# c1 @; T  if (EFI_ERROR (Status)) {+ W$ o! ~' l7 r# h9 q7 U
    return Status;
: b3 _( Q5 e5 A3 [6 s. k6 i1 Q- K  }& U& C+ a+ G0 Z. h2 ?

9 |) m( D+ S3 J. C  for (Index = 0; Index < HandleCount; Index++) {
. c( N" l/ e$ f+ W0 i    Status = gBS->ConnectController (HandleBuffer[Index], NULL, NULL, TRUE);9 w: u- t* R( Z2 y  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, 2026-4-4 16:21 , Processed in 0.176087 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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