找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 10356|回复: 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 X. P) O7 p  ]  w! r EFI_BREAKPOINT( );. M  y2 V" Q$ D- Q! h( }0 @
  Status = gBS->OpenProtocol (. ]. q% v9 {! k, P; R$ @
                  Controller,( c$ u) U1 G, a7 j* N3 y$ B
                  &gEfiPciIoProtocolGuid,
7 w* S4 K) d9 M+ s: J5 C4 a' V                  (VOID **) &PciIo,
4 `  @, b9 T( f; `. h2 r  E  Y                  This->DriverBindingHandle,: ~/ Q2 W2 Z3 N
                  Controller,5 I+ O. p1 C6 Y6 I
                  EFI_OPEN_PROTOCOL_BY_DRIVER. F( u" J9 {) ]
                  );3 _4 e7 F7 c9 W, j
  if (EFI_ERROR (Status)) {
5 ^7 L" m1 X# O. G7 j  F5 F    return Status;8 h0 h8 a) I+ \) @
1:在NT32下打开一个PCIIO protocal,应该是与硬件没有任何关系的,为什么却fail?用VS studio调试跟踪发现,其实是在执行handle.c 文件中的CoreGetProtocolInterface( )函数时,在 Look at each protocol interface for a match时没有找到匹配protocal返回一个unsupport状态值。
1 U- n& X) k+ w4 c9 J! r" A2:当我在用EDK中提供的AtapiScsiPassThruDriverBindingSupported( )测试时,同样会出现此现象。
9 N& X0 O; J, ?6 C# t1 Z请问:5 a* x/ x: U& i$ s* o
当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。3 C/ n/ I2 r/ k8 v5 E
8 ]6 w6 Z; J4 x3 m; M) t' v
对一个想管理某种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).# a" g3 [  M$ x

8 N) v% z* S9 ~- [2 H- cUEFI 规范中connect all controller的示例程序片断:
' ^, V  W, f5 f& s* [' y! ?8 u  Status = gBS->LocateHandleBuffer (
# s- t3 p5 |. s( u  R1 H+ X                  AllHandles,
, j: z! T6 q7 N) }: z                  NULL,
. @, d6 p" X( I' a8 o                  NULL,
" ?; q2 U8 o; y5 k                  &HandleCount,
8 a* x; p1 a3 E; u1 O" k% t6 J                  &HandleBuffer
! N  I% C2 K/ l0 P' g( L                  );
& o7 c5 M# M: a  e% j" I3 _; A  if (EFI_ERROR (Status)) {* P  }6 a5 H& f) y
    return Status;7 p! X- Y& `( x& u) b  x6 W
  }. q: s* v9 h/ n0 y  {
/ c5 ^# E+ X* F; W( F2 e
  for (Index = 0; Index < HandleCount; Index++) {% C$ S: P* A! c% `7 {; f- b) M4 F
    Status = gBS->ConnectController (HandleBuffer[Index], NULL, NULL, TRUE);. G$ f. K% ^4 t) a3 _6 k. F
  }
回复

使用道具 举报

 楼主| 发表于 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-22 10:29 , Processed in 0.034329 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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