找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 10828|回复: 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,代码如下:
$ L9 N0 G  q+ F/ N: o  C EFI_BREAKPOINT( );
% L( X2 N, ~4 Z3 f4 g% a  Status = gBS->OpenProtocol (& l  O9 y- m! B& F0 i0 L) u
                  Controller,+ f4 n/ Q* E# u2 Z+ A# `
                  &gEfiPciIoProtocolGuid,) x3 t  t0 N# U2 ]
                  (VOID **) &PciIo,4 g- R2 ~; C' ~1 r# Z
                  This->DriverBindingHandle,! p* @9 \9 V% B- |, @/ G" d
                  Controller,
; k) [* _  p' [5 v8 b# W                  EFI_OPEN_PROTOCOL_BY_DRIVER, U, Q) h4 Q: v9 D7 n/ l: ~
                  );
4 F3 L* b# z- z, v: [5 Z4 Y2 `  if (EFI_ERROR (Status)) {2 Q7 E: J  I5 @5 c
    return Status;
' x: H3 b( f/ d0 u1:在NT32下打开一个PCIIO protocal,应该是与硬件没有任何关系的,为什么却fail?用VS studio调试跟踪发现,其实是在执行handle.c 文件中的CoreGetProtocolInterface( )函数时,在 Look at each protocol interface for a match时没有找到匹配protocal返回一个unsupport状态值。
- e/ ~5 B2 S- p) U* m  g; L+ f" d  y2:当我在用EDK中提供的AtapiScsiPassThruDriverBindingSupported( )测试时,同样会出现此现象。5 _1 v$ j+ T: v4 ^
请问:2 n: Q- _( ~0 P2 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。
! Y6 F" H- r8 A1 v- Y2 }: @3 k4 P
3 o! J% l1 c: Q; l) E对一个想管理某种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).
6 z# c7 q. k. `( U+ X& t7 O1 Y1 z8 b" C: I" i, O; {
UEFI 规范中connect all controller的示例程序片断:
2 j7 i" H( `2 N6 n  d) `  Status = gBS->LocateHandleBuffer (
. M. `3 P) C6 z4 p                  AllHandles,
) G+ ?3 Y- L- r  M                  NULL,
7 n& _3 ^( I  J; n9 r                  NULL,
' Z- }! M) ^- R, @- S                  &HandleCount,8 \  |0 P  e( w0 ]5 b# ~- ^1 W
                  &HandleBuffer+ @. v' Y3 |& n
                  );
" Z6 r3 b3 a7 G$ _' C7 p4 W  if (EFI_ERROR (Status)) {: b" h1 f) X& W+ K
    return Status;- ]( Q! q! R2 P8 O
  }( J- F' K7 H3 T- U" b; }- y
% k3 u; n6 n6 g% C5 ?8 G
  for (Index = 0; Index < HandleCount; Index++) {/ z( b3 g, \5 }
    Status = gBS->ConnectController (HandleBuffer[Index], NULL, NULL, TRUE);% f' r! t" @% x6 m
  }
回复

使用道具 举报

 楼主| 发表于 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-8-11 17:03 , Processed in 0.049831 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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