找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 11067|回复: 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,代码如下:  N4 o6 T0 v# p8 l9 b- P& l! |5 C
EFI_BREAKPOINT( );
1 @" z* w0 w% Y- ]0 c) r4 b  Status = gBS->OpenProtocol (5 G$ g, T9 P1 Z
                  Controller,
& N% v! x. M. e: C# I                  &gEfiPciIoProtocolGuid,
. n- G( c. F* n                  (VOID **) &PciIo,4 y2 S9 O1 t" V, A( Y
                  This->DriverBindingHandle,! k- U6 E! |" K6 `' S" V2 t/ C
                  Controller,
! @0 D% T, M# H9 ~- a                  EFI_OPEN_PROTOCOL_BY_DRIVER
& H3 V2 `% p/ Q& C# f                  );
( ~  s: b( `7 B- V" C% ?3 c  if (EFI_ERROR (Status)) {; N$ d/ a0 O  G, p
    return Status;/ g) c  E0 G- x: f; _2 r! L2 C. N1 W
1:在NT32下打开一个PCIIO protocal,应该是与硬件没有任何关系的,为什么却fail?用VS studio调试跟踪发现,其实是在执行handle.c 文件中的CoreGetProtocolInterface( )函数时,在 Look at each protocol interface for a match时没有找到匹配protocal返回一个unsupport状态值。
) @" Z: \2 b* x% F5 Y. C2:当我在用EDK中提供的AtapiScsiPassThruDriverBindingSupported( )测试时,同样会出现此现象。2 }( m0 r6 w) H3 r
请问:
, h6 S0 U$ Z& T! M7 q4 _当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。
) T5 P& l3 ~0 G- \+ @4 B: J4 v# e; Y: f! B8 i+ j
对一个想管理某种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).
! P3 v( s' t% E" C3 I/ R4 m3 s. _
1 ]* S4 I/ T! o0 _. h) iUEFI 规范中connect all controller的示例程序片断:; l  @$ i/ D* q- f7 l+ y+ k5 _/ l
  Status = gBS->LocateHandleBuffer (
) U, g# N7 B7 b+ V                  AllHandles,3 X8 a% c. d5 z; @5 N) U; s# M( b
                  NULL,8 P6 ~3 S8 |3 i  s
                  NULL,
, u& ]$ F: r  {4 ~" a6 Y! I                  &HandleCount,
+ B8 b( H) g2 {9 K                  &HandleBuffer# Y" s1 e( }- Q3 r
                  );
0 d% }% L- H8 H- _( s0 \  if (EFI_ERROR (Status)) {
6 R. F2 ?. a, c    return Status;
6 {- {2 u; {/ W6 B5 J& p7 w& @  }
& }! a7 l9 Y7 x0 c* @# q! h# Y
9 a- r( {" F2 k' `2 Y  E1 a" `  for (Index = 0; Index < HandleCount; Index++) {
+ M# ]8 t4 b9 o" p    Status = gBS->ConnectController (HandleBuffer[Index], NULL, NULL, TRUE);2 K# n, @$ b: ^! 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, 2026-7-21 22:13 , Processed in 3.245017 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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