C_and_CPP 板


LINE

开发平台(Platform): (Ex: Win10, Linux, ...) 编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出) VScode 额外使用到的函数库(Library Used): (Ex: OpenGL, ...) 问题(Question): 我自己创一个驱动程序模型来驱动程序,它作用是提供一个协议来读取 PCI 设备。 首先我其实只是在用一个新的协议来包PciIo(不确定自己这样写的架构对不对) 测试过後 Supported跟Start似乎都正常, 我另外写一个app.c的来呼叫我新的协议也可以呼叫(只是呼叫出来的东西好像不太理想) 但在disconnect地方出现问题,他无法断开连结是什麽原因? 程式码(Code):(请善用置底文网页, 记得排版,禁止使用图档) #include <Uefi.h> #include <Library/UefiLib.h> #include <Library/UefiBootServicesTableLib.h> #include <Library/UefiDriverEntryPoint.h> #include <Protocol/DriverBinding.h> #include <Protocol/ComponentName2.h> #include <Protocol/PciIo.h> #define LANGUAGE_CODE_ENGLISH "en" // ========================================================== // define My Pci device EFI_GUID gMyPciProtocolGuid = {0xa1bd7202, 0xd040, 0x46ed, {0xb0, 0xcd, 0xf5, 0x2f, 0xa3, 0xad, 0xe7, 0xa6}}; typedef struct _MY_PROTOCOL MY_PROTOCOL; typedef EFI_STATUS (EFIAPI *MY_PROTOCOL_FUNCTION) ( IN MY_PROTOCOL *This, IN EFI_PCI_IO_PROTOCOL *PciIo ); struct _MY_PROTOCOL { MY_PROTOCOL_FUNCTION Function; EFI_PCI_IO_PROTOCOL *PciIo; }; EFI_STATUS EFIAPI MyProtocolFunction ( IN MY_PROTOCOL *This, IN EFI_PCI_IO_PROTOCOL *PciIo ) { UINT32 Data; // Call the PciIo function return PciIo->Pci.Read ( PciIo, EfiPciIoWidthUint32, 0, 1, &Data ); } // ========================================================== // Function Prototypes for Driver Binding Protocol Interface EFI_STATUS EFIAPI Supported( IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath ); EFI_STATUS EFIAPI Start( IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath ); EFI_STATUS EFIAPI Stop( IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN UINTN NumberOfChildren, IN EFI_HANDLE *ChildHandleBuffer ); EFI_STATUS EFIAPI GetDriverName( IN EFI_COMPONENT_NAME2_PROTOCOL *This, IN CHAR8 *Language, OUT CHAR16 **DriverName ); EFI_STATUS EFIAPI GetControllerName( IN EFI_COMPONENT_NAME2_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN EFI_HANDLE ChildHandle OPTIONAL, IN CHAR8 *Language, OUT CHAR16 **ControllerName ); // ========================================================== // EFI Driver Binding Protocol Instance EFI_DRIVER_BINDING_PROTOCOL gMyPciDriverBinding = { Supported, //Supported Start, //Start, Stop, //Stop, 0xa, //Version, NULL, //Image Handle, NULL //DriverBindingHandle, }; EFI_COMPONENT_NAME2_PROTOCOL gMyPciDriverComponentName2 = { GetDriverName, GetControllerName, LANGUAGE_CODE_ENGLISH }; // ========================================================== // Functions for Driver Binding Protocol Interface EFI_STATUS EFIAPI Supported( IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath ) { Print(L"driver-model driver Pci Driver Supported\n"); EFI_STATUS Status; UINT16 VendorId; EFI_PCI_IO_PROTOCOL *PciIo; Status = gBS->OpenProtocol ( ControllerHandle, &gEfiPciIoProtocolGuid, (VOID **)&PciIo, This->DriverBindingHandle, ControllerHandle, EFI_OPEN_PROTOCOL_BY_DRIVER ); if (EFI_ERROR (Status)) { return Status; } // Read the Vendor ID of the PCI device Status = PciIo->Pci.Read( PciIo, EfiPciIoWidthUint16, 0x00, 1, &VendorId ); if (EFI_ERROR(Status)) { return Status; } gBS->CloseProtocol ( ControllerHandle, &gEfiPciIoProtocolGuid, This->DriverBindingHandle, ControllerHandle ); if (VendorId == 0x8086) { Print(L"VendorId: %x\n", VendorId); return EFI_SUCCESS; } return EFI_UNSUPPORTED; } EFI_STATUS EFIAPI Start( IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath ) { Print(L"driver-model driver Pci Driver Start\n"); EFI_STATUS Status; EFI_PCI_IO_PROTOCOL *PciIo; MY_PROTOCOL myProtocol = {MyProtocolFunction,NULL}; Status = gBS->OpenProtocol ( ControllerHandle, &gEfiPciIoProtocolGuid, (VOID **)&PciIo, This->DriverBindingHandle, ControllerHandle, EFI_OPEN_PROTOCOL_BY_DRIVER ); if (EFI_ERROR (Status)) { return Status; } myProtocol.Function = MyProtocolFunction; myProtocol.PciIo = PciIo; // Install the protocol on the handle for the specified PCI device Status = gBS->InstallMultipleProtocolInterfaces( &ControllerHandle, &gMyPciProtocolGuid, myProtocol, NULL ); Print(L"install protocol(gMyPciProtocolGuid): %r\n", Status); if (EFI_ERROR(Status)) { Print(L"Failed to install protocol: %r\n", Status); return Status; } gBS->CloseProtocol ( ControllerHandle, &gEfiPciIoProtocolGuid, This->DriverBindingHandle, ControllerHandle ); return Status; } EFI_STATUS EFIAPI Stop( IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN UINTN NumberOfChildren, IN EFI_HANDLE *ChildHandleBuffer ) { Print(L"driver-model driver Pci Driver Stop\n"); EFI_STATUS Status; MY_PROTOCOL *myProtocol; Status = gBS->OpenProtocol( ControllerHandle, &gMyPciProtocolGuid, (VOID**)&myProtocol, ControllerHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL); if (EFI_ERROR(Status)) { return Status; } Status = gBS->UninstallMultipleProtocolInterfaces ( ControllerHandle, &gMyPciProtocolGuid, myProtocol, NULL ); if (EFI_ERROR (Status)) { Print(L"Failed to Uninstall protocol: %r\n", Status); return Status; } Status = gBS->CloseProtocol ( ControllerHandle, &gEfiPciIoProtocolGuid, This->DriverBindingHandle, ControllerHandle ); Print(L"Protocol has been Uninstalled : %r.\n", Status); return EFI_SUCCESS; } EFI_STATUS EFIAPI GetDriverName( IN EFI_COMPONENT_NAME2_PROTOCOL *This, IN CHAR8 *Language, OUT CHAR16 **DriverName ) { Print(L"driver-model driver Pci Driver Name Get Driver Name\n"); //Supports only English if (Language == NULL || AsciiStrCmp( Language, LANGUAGE_CODE_ENGLISH) == 0) { StrCpyS (*DriverName, StrSize(L"My PCI Driver"), L"My PCI Driver"); return EFI_SUCCESS; } else { return EFI_UNSUPPORTED; } } EFI_STATUS EFIAPI GetControllerName( IN EFI_COMPONENT_NAME2_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN EFI_HANDLE ChildHandle OPTIONAL, IN CHAR8 *Language, OUT CHAR16 **ControllerName ) { return EFI_UNSUPPORTED; } // ========================================================== // Pci Protocol Functions Implementation EFI_STATUS EFIAPI MyPciDriverEntryPoint ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { EFI_STATUS Status; // Install driver model protocol(s). Status = EfiLibInstallDriverBindingComponentName2 ( ImageHandle, SystemTable, &gMyPciDriverBinding, ImageHandle, NULL, &gMyPciDriverComponentName2 ); if (EFI_ERROR(Status)) { Print(L"Failed to install protocol: %r\n", Status); return Status; } return Status; } 补充说明(Supplement): -- 有没有准备好我不知道, 但我已经做了我最好的选择。 --
QR Code



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 59.124.228.31 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1679541775.A.25E.html
1F:→ ssdoz2sk: Disconnect 出现问题是指你 unload driver image 时候, 03/26 01:19
2F:→ ssdoz2sk: 出现 Unsupported? 看起来是没有 UNLOAD_IMAGE 的 func 03/26 01:21
3F:→ ssdoz2sk: inf 也要有相对应的设定,可以参考 03/26 01:22
4F:→ ssdoz2sk: MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressDxe 03/26 01:23
5F:推 lchbird: 两个问题。第一个是Start中的myProtocil是local variabl 04/04 21:19
6F:→ lchbird: e,会出事。第二个是在Start中PciIo被close了,这不用cl 04/04 21:19
7F:→ lchbird: ose,Stop中才需要close。 04/04 21:19







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:BabyMother站内搜寻

TOP