当前位置: 首页 > news >正文

编写一个DXE driver 提供遍历pcie设备配置空间的protocol

PCIe (Peripheral Component Interconnect Express)设备配置空间是每个 PCIe 设备都具有的一个标准化寄存器集合,用于存储设备的硬件信息、资源需求和功能配置。
它分为两部分:

  • PCI 兼容配置空间(前 256 字节):
    与传统 PCI 设备兼容,包含设备的基本信息,如设备 ID、供应商 ID、类代码等。
    包括 64 字节的 Header 和 192 字节的能力结构。
  • PCIe 扩展配置空间(从 0x100 到 0xFFF,共 4096 字节):
    提供额外的配置寄存器,支持更高级的功能,如 PCIe 能力寄存器。
    扩展能力寄存器以链表形式管理,每个寄存器包含一个能力 ID 和一个指向下一个寄存器的指针。

.dsc

#
# create a new DXE protocol to traverse PcieMdeModulePkg/Universal/TraversePcieDxe/TraversePcieDxe.inf {<LibraryClasses>BasePciExpressLib|MdePkg/Library/BasePciExpressLib/BasePciExpressLib.inf}
#

.fdf

#
# create a new DXE protocol to traverse Pcie
INF  MdeModulePkg/Universal/TraversePcieDxe/TraversePcieDxe.inf
#

.dec

  # # create a new DXE protocol to traverse Pcie## Include/Protocol/TraversePcie.hgEfiTraversePcieProtocolGuid = { 0xAD3316CA, 0x5B03, 0xEFE4, {0x54, 0xE5, 0xF7, 0xC5, 0x04, 0x6E, 0x29, 0xD5 }}#

.inf

## @file
#
#
##[Defines]INF_VERSION                    = 0x00010005BASE_NAME                      = TraversePcieDxeFILE_GUID                      = AD3316CA-5B03-EFE4-54E5-F7C5046E29D5MODULE_TYPE                    = DXE_DRIVERVERSION_STRING                 = 1.0ENTRY_POINT                    = TraversePcieEntryPoint#
# The following information is for reference only and not required by the build tools.
#
#  VALID_ARCHITECTURES           = IA32 X64 EBC
#[Sources]
TraversePcie.c[Packages]MdePkg/MdePkg.decMdeModulePkg/MdeModulePkg.dec[LibraryClasses]DevicePathLibUefiBootServicesTableLibUefiDriverEntryPointBasePciExpressLibDebugLib[Protocols]gEfiTraversePcieProtocolGuid ## PRODUCES[Depex]TRUE

.c

/** @fileCopyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent**/#include <Protocol/TraversePcie.h>
#include <Uefi.h>
#include <Library/UefiDriverEntryPoint.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/DevicePathLib.h>
#include <Library/PcdLib.h>
#include <Library/PciExpressLib.h>
#include <Library/DebugLib.h>EFI_STATUS
EFIAPI
ToTraversePcie(IN CONST EFI_TRAVERSE_PCIE_PROTOCOL   *ReadPcieNode)
{UINTN  StartAddress;UINTN  Size;UINT8  Buffer[4352];EFI_STATUS Status;StartAddress = 0xE0000000;Size = sizeof(Buffer);DEBUG((DEBUG_INFO,"\n\nStart to PCIeReadBuffer\n\n"));Status = PciExpressReadBuffer (StartAddress,Size,&Buffer);UINTN OX = 0;DEBUG((DEBUG_INFO,"\nPCIe: \n"));for (int index = 0; index < Size; index++){DEBUG((DEBUG_INFO,"%u ",Buffer[index]));OX++;if (OX == 15){OX = 0;DEBUG((DEBUG_INFO,"\n"));}}return Status;}GLOBAL_REMOVE_IF_UNREFERENCED CONST EFI_TRAVERSE_PCIE_PROTOCOL mTraversePcie = {ToTraversePcie
};EFI_STATUS
EFIAPI
TraversePcieEntryPoint (IN EFI_HANDLE        ImageHandle,IN EFI_SYSTEM_TABLE  *SystemTable)
{EFI_STATUS  Status;EFI_HANDLE  Handle;Handle = NULL;Status = EFI_UNSUPPORTED;DEBUG((DEBUG_INFO,"\n\nStart to traverse PCIe\n\n"));Status = gBS->InstallMultipleProtocolInterfaces (&Handle,&gEfiTraversePcieProtocolGuid,&mTraversePcie,NULL);return Status;
}

.h

/** @fileCopyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>SPDX-License-Identifier: BSD-2-Clause-Patent**/#ifndef __TRAVERSE_PCIE_PROTOCOL_H__
#define __TRAVERSE_PCIE_PROTOCOL_H__///
/// Traverse Pcie protocol
///
#define EFI_TRAVERSE_PCIE_PROTOCOL_GUID \{ \0xAD3316CA, 0x5B03, 0xEFE4, {0x54, 0xE5, 0xF7, 0xC5, 0x04, 0x6E, 0x29, 0xD5 } \}typedef struct _EFI_TRAVERSE_PCIE_PROTOCOL EFI_TRAVERSE_PCIE_PROTOCOL;typedef
EFI_STATUS
(EFIAPI *EFI_TRAVERSE_PCIE)(IN CONST EFI_TRAVERSE_PCIE_PROTOCOL   *ReadPcieNode);struct _EFI_TRAVERSE_PCIE_PROTOCOL {EFI_TRAVERSE_PCIE    ReadPcie;
};extern EFI_GUID  gEfiTraversePcieProtocolGuid;#endif

在这里插入图片描述

http://www.dtcms.com/a/573871.html

相关文章:

  • 随笔之工作方法的“术”
  • 淘宝上做进出口网站有哪些我男同同性做视频网站
  • LLM中的选择性注意:从人类聚焦到模型聚焦
  • 从成本到战略:金仓 KingbaseES 的多维度优势与企业数据库选型的核心考量
  • 做pc网站排wordpress载入慢
  • Java注解在Spring Boot中的详细原理与使用情况解析
  • Python + WebSocket 实现实时体育比分系统(含数据库设计与前端演示)
  • 揭阳智能模板建站网站转应用
  • 多个网站 备案吗工作室网站建设要多大内存
  • 借助 TX Text Control:在 .NET C# 中验证 PDF/UA 文档
  • 高光谱成像系统赋能烟叶分选(烟叶除杂、烟叶霉变、烟叶烟梗区分、烟叶等级分选)
  • Java NIO 深度解析:从 BIO 到 NIO 的演进与实战​
  • 聊聊AIoT开发效率与安全:从ARMINO IDK框架说起
  • 0.5、提示词中 System、User、Assistant 的基本概念
  • 响应式网站设计建设制作温岭app开发公司
  • 门户网站用什么程序做广州手机app开发
  • 用Python和FastAPI构建一个完整的企业级AI Agent微服务脚手架
  • 青岛网站域名备案查询个人网站做哪些内容
  • Leet热题100--208. 实现 Trie (前缀树)--中等
  • 应用分析网站网站社区建设
  • 【上海海事大学主办】第六届智能电网与能源工程国际学术会议(SGEE 2025)
  • 每月网站开发费用网站改版如何做301
  • Will Al Replace Humans? From Stage to Symbiosis.
  • Springcloud核心组件之Sentinel详解
  • 饰品企业网站建设程序开发的步骤
  • 聊城网站建设科技公司网站自己的
  • 计算机视觉·TagCLIP
  • 做网站流量是什么wordpress自定义表
  • 静态页优秀网站南通网站制作公司
  • C# 串口通讯中 SerialPort 类的关键参数和使用方法