【UEFI实战】Redfish的BIOS实现1

news2024/12/22 22:59:46

Redfish的BIOS实现

EDK2提供了Redfish框架,用来实现带外的BIOS配置,其基本框架如下:

在这里插入图片描述

通过RedfishPkg中提供的Driver,可以实现BIOS与BMC或者其它的软件进行通信。它主要分为两个部分,分别是Client和Foundation。Client对应到UEFI应用,用于给Service交互,而Service就是前面说的BMC或者其它实现了Redfish的程序。

如何在BIOS下包含Redfish的内容

相关的模块都在RedfishPkg中,所以只需要在自己的项目中加入模块即可,主要是如下的模块:

!if $(REDFISH_ENABLE) == TRUE
  EmulatorPkg/Application/RedfishPlatformConfig/RedfishPlatformConfig.inf
  RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.inf
  RedfishPkg/RedfishHostInterfaceDxe/RedfishHostInterfaceDxe.inf
  RedfishPkg/RedfishRestExDxe/RedfishRestExDxe.inf
  RedfishPkg/RedfishCredentialDxe/RedfishCredentialDxe.inf
  RedfishPkg/RedfishDiscoverDxe/RedfishDiscoverDxe.inf
  RedfishPkg/RedfishConfigHandler/RedfishConfigHandlerDriver.inf
!endif

当然还有一些额外的Lib和PCD等,这些在后续如果使用到再说明。此外,Redfish还依赖于其它基础模块,也需要增加,它们主要是SecurePkg和NetworkPkg中的内容,前者是安全方面的支持而后者是网络基础模块。

模块介绍

下面介绍前面包含的模块。

RedfishHostInterfaceDxe.inf

该模块用于创建SMBIOS Type42,在《Redfish Host Interface Specification》有说明该类型的SMBIOS:

The SMBIOS Type 42 structure is used to describe a Management Controller Host Interface. It consists of standard
SMBIOS entry information, followed by interface descriptors (which detail the physical interface to the Redfish
Service), and protocol descriptors (which describe the supported payload encoding between the Host and Redfish
Service).

具体的数据说明(表1):

OffsetNameLengthDescription
00hType1字节SMBIOS类型值,这里就是42
01hLength1字节最少9个字节
02hHandle2字节Handle值,根据实际代码确定
04hInterface Type1字节对于网络接口的枚举是MCHostInterfaceTypeNetworkHostInterface,值是40h
05hInterface Specific Data Length1字节见后续说明
06hInterface Specific DataN字节见后续说明
06h+NProtocol Count1字节通常只有一个,所以值是1
07h+NProtocol RecordsM字节见后续说明

在代码中的实现:

///
/// Management Controller Host Interface (Type 42).
///
/// The information in this structure defines the attributes of a Management
/// Controller Host Interface that is not discoverable by "Plug and Play" mechanisms.
///
/// Type 42 should be used for management controller host interfaces that use protocols
/// other than IPMI or that use multiple protocols on a single host interface type.
///
/// This structure should also be provided if IPMI is shared with other protocols
/// over the same interface hardware. If IPMI is not shared with other protocols,
/// either the Type 38 or Type 42 structures can be used. Providing Type 38 is
/// recommended for backward compatibility. The structures are not required to
/// be mutually exclusive. Type 38 and Type 42 structures may be implemented
/// simultaneously to provide backward compatibility with IPMI applications or drivers
/// that do not yet recognize the Type 42 structure.
///
typedef struct {
  SMBIOS_STRUCTURE                  Hdr;
  UINT8                             InterfaceType;                  ///< The enumeration value from MC_HOST_INTERFACE_TYPE
  UINT8                             InterfaceTypeSpecificDataLength;
  UINT8                             InterfaceTypeSpecificData[4];   ///< This field has a minimum of four bytes
} SMBIOS_TABLE_TYPE42;

InterfaceType的值是40h的时候,对应的InterfaceTypeSpecificData数据如下:

OffsetNameLengthDescription
00hDevice Type1字节网络接口的底层也有不同的硬件,下面是具体的类型:
02h:USB网络接口
03h:PCI/PCIe网络接口
04h:USB网络接口v2
05h:PCI/PCIe网络接口v2
80h-FFh:OEM
其它:保留
01hDevice Descriptor DataN字节由于类型不同,所以对应的数据也不同

对应的代码:

///
///  Interface Specific Data starts at offset 06h of the SMBIOS Type 42 struct.
///  This table defines the Interface Specific data for Interface Type 40h. There
///  are 3 types of Device Descriptor3 defined , however only 1 may be used in
///  specific Tape 42 table.
///
typedef struct {
  UINT8            DeviceType;        ///< The Device Type of the interface.
  DEVICE_DESCRITOR DeviceDescriptor;  ///< The Device descriptor.
} REDFISH_INTERFACE_DATA;

其中的DeviceType的值在代码中的定义:

#define REDFISH_HOST_INTERFACE_DEVICE_TYPE_USB         0x02 // We don't support this type of interface.
                                                            // Use REDFISH_HOST_INTERFACE_DEVICE_TYPE_USB_V2 instead.
#define REDFISH_HOST_INTERFACE_DEVICE_TYPE_PCI_PCIE    0x03 // We don't support this type of interface.
                                                            // Use REDFISH_HOST_INTERFACE_DEVICE_TYPE_PCI_PCIE_V2 instead.
#define REDFISH_HOST_INTERFACE_DEVICE_TYPE_USB_V2      0x04
#define REDFISH_HOST_INTERFACE_DEVICE_TYPE_PCI_PCIE_V2 0x05

对应的DeviceDescriptor

///
/// Define union for the Host Interface Device Descriptor
///
typedef union {
    USB_INTERFACE_DEVICE_DESCRIPTOR_V2          UsbDeviceV2;     ///< Device type USB V2 device discriptor.
    PCI_OR_PCIE_INTERFACE_DEVICE_DESCRIPTOR_V2  PciPcieDeviceV2; ///< Device type PCI/PCIe V2 device discriptor.
    OEM_DEVICE_DESCRIPTOR                       OemDevice;       ///< OEM type device discriptor.
} DEVICE_DESCRITOR; /// Device descriptor data formated based on Device Type.

这里以PCI网卡为例说明其内容:

//
// Structure definitions of Host Interface device type 05h (PCI/PCIE V2)
//
typedef struct {
  UINT8                   Length;               ///< Length of the structure, including Device Type and Length fields.
  UINT16                  VendorId;             ///< The Vendor ID of the PCI/PCIe device.
  UINT16                  DeviceId;             ///< The Device ID of the PCI/PCIe device.
  UINT16                  SubsystemVendorId;    ///< The Subsystem Vendor ID of the PCI/PCIe device.
  UINT16                  SubsystemId;          ///< The Subsystem ID of the PCI/PCIe device.
  UINT8                   MacAddress [6];       ///< The MAC address of the PCI/PCIe network device.
  UINT16                  SegmemtGroupNumber;   ///< The Segment Group Number of the PCI/PCIe.
  UINT8                   BusNumber;            ///< The Bus Number of the PCI/PCIe device.
  UINT8                   DeviceFunctionNumber; ///< The Device/Function Number of the PCI/PCIe.
} PCI_OR_PCIE_INTERFACE_DEVICE_DESCRIPTOR_V2;

可以看到它包含了PCI的Bus/Dev/Fun/VendorId/DeviceId/SubVendorId/SubDeviceId等PCI基础信息,还有MAC地址。

Protocol的个数目前就是1,而其类型一般是“Redfish over IP Protocol“,其具体内容如下:

OffsetNameLengthDescription
00hProtocol Type1字节Redfish over IP Protocol的值是04h
01hProtocol Type Specific Data Length1字节见后续说明
02hProtocol Specific Record DataP字节见后续说明

其具体的内容如下:

//
//  the protocol-specific data for the "Redfish Over IP" protocol
//
typedef struct {
  EFI_GUID            ServiceUuid;  //same as Redfish Service UUID in Redfish Service Root resource

  //
  //  Unknown=00h,
  //  Static=01h,
  //  DHCP=02h,
  //  AutoConfigure=03h,
  //  HostSelected=04h,
  //  other values reserved
  //
  UINT8               HostIpAssignmentType;

  //
  //  Unknown=00h,
  //  Ipv4=01h,
  //  Ipv6=02h,
  //  other values reserved
  //
  UINT8               HostIpAddressFormat;

  //
  //  Used for Static and AutoConfigure.
  //  For IPV4, use the first 4 Bytes and zero fill the remaining bytes.
  //
  UINT8               HostIpAddress[16];

  //
  //  Used for Static and AutoConfigure.
  //  For IPV4, use the first 4 Bytes and zero fill the remaining bytes.
  //
  UINT8               HostIpMask[16];

  //
  //  Unknown=00h,
  //  Static=01h,
  //  DHCP=02h,
  //  AutoConfigure=03h,
  //  HostSelected=04h,
  //  other values reserved
  //
  UINT8               RedfishServiceIpDiscoveryType;

  //
  //  Unknown=00h,
  //  Ipv4=01h,
  //  Ipv6=02h,
  //  other values reserved
  //
  UINT8               RedfishServiceIpAddressFormat;

  //
  //  Used for Static and AutoConfigure.
  //  For IPV4, use the first 4 Bytes and zero fill the remaining bytes.
  //
  UINT8               RedfishServiceIpAddress[16];

  //
  //  Used for Static and AutoConfigure.
  //  For IPV4, use the first 4 Bytes and zero fill the remaining bytes.
  //
  UINT8               RedfishServiceIpMask[16];

  UINT16              RedfishServiceIpPort;  // Used for Static and AutoConfigure.
  UINT32              RedfishServiceVlanId;  // Used for Static and AutoConfigure.
  UINT8               RedfishServiceHostnameLength;   // length of the following hostname string
  UINT8               RedfishServiceHostname[1];  // hostname of Redfish Service
} REDFISH_OVER_IP_PROTOCOL_DATA;

以上就是Type42类型SMBIOS信息的内容。而本模块就是为了构建这个SMBIOS。其中的数据是根据实际的情况来确定的,比如使用PCIE还是USB网卡、MAC地址是什么、IP类型是什么等等,描述了详细的Redfish使用的接口的信息。

这些信息有一些在代码(包含通用的代码和平台相关的代码)中直接决定,而另外一些通过变量的方式写入,而这跟RedfishPlatformConfig.inf对应的模块相关。

RedfishPlatformConfig.inf

该模块已经在前面提过,它是一个UEFI应用,直接通过命令参数获取数据并存放到变量。下面是一个示例:

RedfishPlatformConfig.efi -s 192.168.10.101 255.255.255.0 192.168.10.123 255.255.255.0

它设置了一系列的IP供Redfish使用。

目前支持的变量包括:

  • HostIpAssignmentType
  • HostIpAddress
  • HostIpMask
  • RedfishServiceIpAddress
  • RedfishServiceIpMask
  • RedfishServiceIpPort

主要就是Client端和Service端的IP类型和地址,它们包含在REDFISH_OVER_IP_PROTOCOL_DATA这个结构体中,并被RedfishDiscoverDxe.inf使用到。

依赖
RedfishHostInterfaceDxe
RedfishPlatformConfig

RedfishRestExDxe.inf

本模块实现了基于HTTP的传输协议,用于Redfish数据通信。它安装了如下的两个接口供后续数据传输使用:

EFI_SERVICE_BINDING_PROTOCOL mRedfishRestExServiceBinding = {
  RedfishRestExServiceBindingCreateChild,
  RedfishRestExServiceBindingDestroyChild
};

EFI_REST_EX_PROTOCOL  mRedfishRestExProtocol = {
  RedfishRestExSendReceive,
  RedfishRestExGetServiceTime,
  RedfishRestExGetService,
  RedfishRestExGetModeData,
  RedfishRestExConfigure,
  RedfishRestExAyncSendReceive,
  RedfishRestExEventService
};

RedfishDiscoverDxe.inf

本模块的作用是发现Redfish Service端,比如BMC或者实现了Redfish的程序,而它依赖于前面模块中提到的需要设置的各类变量。

RedfishDiscoverDxe模块是一个UEFI Driver,所以有Supported/Start等接口:

EFI_DRIVER_BINDING_PROTOCOL gRedfishDiscoverDriverBinding = {
  RedfishDiscoverDriverBindingSupported,
  RedfishDiscoverDriverBindingStart,
  RedfishDiscoverDriverBindingStop,
  REDFISH_DISCOVER_VERSION,
  NULL,
  NULL
};

这里简单说明:

RedfishDiscoverDriverBindingSupported()函数主要是判断依赖的模块是否存在,其依赖的部分如下:

static REDFISH_DISCOVER_REQUIRED_PROTOCOL gRequiredProtocol[] = {
  {
    ProtocolTypeTcp4,
    L"TCP4 Service Binding Protocol",
    &gEfiTcp4ProtocolGuid,
    &gEfiTcp4ServiceBindingProtocolGuid,	// RequiredServiceBindingProtocolGuid
    &mRedfishDiscoverTcp4InstanceGuid,		// DiscoveredProtocolGuid
    Tcp4GetSubnetInfo
  },
  {
    ProtocolTypeTcp6,
    L"TCP6 Service Binding Protocol",
    &gEfiTcp6ProtocolGuid,
    &gEfiTcp6ServiceBindingProtocolGuid,	// RequiredServiceBindingProtocolGuid
    &mRedfishDiscoverTcp6InstanceGuid,		// DiscoveredProtocolGuid
    Tcp6GetSubnetInfo
  },
  {
    ProtocolTypeRestEx,
    L"REST EX Service Binding Protocol",
    &gEfiRestExProtocolGuid,
    &gEfiRestExServiceBindingProtocolGuid,	// RequiredServiceBindingProtocolGuid
    &mRedfishDiscoverRestExInstanceGuid,	// DiscoveredProtocolGuid
    NULL
  }
};

它的判断依据是:

  1. 判断RequiredServiceBindingProtocolGuid是否存在;
  2. 如果存在,再判断对应的DiscoveredProtocolGuid是否存在;
  3. 如果已经存在,表示UEFI Driver已经执行过,所以不需要再执行了;
  4. 如果不存在,则这个UEFI Driver需要再次被执行。

实际上这里的三种传输方式只需要支持一种即可,前面两种是不同版本的TCP方式,而最后一种是基于HTTP的传输实现,它的实现在模块RedfishRestExDxe.inf中。

RedfishDiscoverDriverBindingStart()构建网络接口并最终安装如下的Protocol供后续使用:

EFI_REDFISH_DISCOVER_PROTOCOL mRedfishDiscover = {
  RedfishServiceGetNetworkInterface,
  RedfishServiceAcquireService,
  RedfishServiceAbortAcquire,
  RedfishServiceReleaseService
};

这些接口会被RedfishConfigHandlerDriver.inf使用。

到目前为止的依赖关系:

依赖
依赖
依赖
RedfishDiscoverDxe
RedfishRestExDxe
RedfishHostInterfaceDxe
RedfishPlatformConfig

RedfishConfigHandlerDriver.inf

本模块是UEFI Redfish的处理中心。它也是一个UEFI Driver,因此包含如下的接口:

///
/// Driver Binding Protocol instance
///
EFI_DRIVER_BINDING_PROTOCOL gRedfishConfigDriverBinding = {
  RedfishConfigDriverBindingSupported,
  RedfishConfigDriverBindingStart,
  RedfishConfigDriverBindingStop,
  REDFISH_CONFIG_VERSION,
  NULL,
  NULL
};

RedfishConfigDriverBindingSupported()检测依赖关系,除了前面提到的RedfishDiscoverDxe模块,代码中主要依赖的是来自RedfishRestExDxe模块的接口,对应GUID是gEfiRestExProtocolGuidgEfiRestExServiceBindingProtocolGuid

RedfishConfigDriverBindingStart()里面是一个回调函数,这个回调函数会在gEdkIIRedfishConfigHandlerProtocolGuid安装的时候回调,而在回调函数中执行了该GUID对应的EDKII_REDFISH_CONFIG_HANDLER_PROTOCOL中的函数Init(),关于这个Protocol的具体实现还没有在当前的EDK2代码中,具体见[EDK2 Redfish feature driver](#EDK2 Redfish feature driver)中的说明。

到目前为止的依赖关系:

依赖
依赖
依赖
依赖
RedfishConfigHandlerDriver
RedfishDiscoverDxe
RedfishRestExDxe
RedfishHostInterfaceDxe
RedfishPlatformConfig

RestJsonStructureDxe.inf

本模块是一个帮助模块,用来处理JSON数据,它安装了如下的Protocol:

EFI_REST_JSON_STRUCTURE_PROTOCOL mRestJsonStructureProtocol = {
  RestJsonStructureRegister,
  RestJsonStructureToStruct,
  RestJsonStructureToJson,
  RestJsonStructureDestroyStruct
};

RedfishCredentialDxe.inf

本模块涉及到认证相关的内容,它提供了如下的Protocol:

EDKII_REDFISH_CREDENTIAL_PROTOCOL  mRedfishCredentialProtocol = {
  RedfishCredentialGetAuthInfo,
  RedfishCredentialStopService
};

Redfish相关的认证信息在《Redfish Host Interface Specification》中有定义,不过看规范的说明是已经弃用了,所以这里也不再介绍。

EDK2 Redfish feature driver

前面的介绍Redfish在EDK中的框架内容,但是真正的Redfish操作一个也没有介绍,而且也没有对Redfish Client的实现。这部分内容UEFI还没有放到正式版本中,而是在GitHub - tianocore/edk2-staging at edk2-redfish-client这个库中。

后续的文章中会介绍这部分内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/80949.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[论文解析]DREAMFUSION: TEXT-TO-3D USING 2D DIFFUSION

code links&#xff1a;dreamfusion3d.github.io 文章目录OverviewWhat problem is addressed in the paper?What is the key to the solution?What is the main contribution?What can we learn from ablation studies&#xff1f;Potential fundamental flaws; how this w…

MATLB|基于粒子群算法的能源管理系统EMS(考虑光伏、储能 、柴油机系统)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清…

原子操作类之18罗汉增强

原子操作类之18罗汉增强 是什么 都是java.util.concurrent.atomic包下的 有红框圈起来的&#xff0c;也有蓝框圈起来的&#xff0c;为什么&#xff1f; 阿里巴巴Java开发手册 为什么说18罗汉增强&#xff0c;却只有16个 再分类 基本类型原子类 AtomicInteger AtomicBoolea…

wpa_supplicant工具移植到嵌入式设备

1、wpa_supplicant源码下载 (1)源码下载地址&#xff1a;http://w1.fi/releases/&#xff1b; (2)本文是以wpa_supplicant-2.6.tar.gz版本进行移植&#xff1b; 2、编译openssl 2.1、确定适配的openssl版本 Optional libraries for EAP-TLS, EAP-PEAP, and EAP-TTLS: - OpenS…

【LeetCode】1827. 最少操作使数组递增

题目描述 给你一个整数数组 nums &#xff08;下标从 0 开始&#xff09;。每一次操作中&#xff0c;你可以选择数组中一个元素&#xff0c;并将它增加 1 。 比方说&#xff0c;如果 nums [1,2,3] &#xff0c;你可以选择增加 nums[1] 得到 nums [1,3,3] 。 请你返回使 nums …

ESXi8.0中NVME硬盘不识别解决方法1,设置直通

目录 1.前言 2.直通设置 3.槽点 1.前言 ESXi8.0删除了很多老版本的硬件的驱动程序&#xff0c;导致NVME1.3及更低协议的固态硬盘均无法被ESXi直接识别正如我手头准备了尚好的服务器专用PM983A却无法识别。本着不折腾先熟悉ESXi8.0的思路另外找了一块盘装了ESXi的系统。本以为…

云原生之使用Docker部署webssh工具sshwifty

云原生之使用Docker部署webssh工具sshwifty一、sshwifty介绍1.sshwifty简介2.shwifty 特点二、检查本地docker环境1.检查docker版本2.检查docker状态三、下载sshwifty镜像四、服务器生成凭证文件五、创建sshwifty容器1.创建部署目录2.创建sshwifty容器3.查看sshwifty容器状态六…

uniapp 之 小程序线上版本一直处于加载状态

前言 最开始小程序都是体验版的&#xff0c;后来应老大需求&#xff0c;把体验版提交审核为正式版本&#xff08;线上版本&#xff09;&#xff0c; 原本以为版本审核得花费几天时间&#xff0c;没想到它这审核速度挺快的&#xff0c;不到3小时就审核通过了&#xff0c;审核…

[go]汇编语言

文章目录计算机结构常量与变量全局变量常量数组字符串函数参数与返回值goroutineGo汇编程序无法独立使用&#xff0c;必须以Go包的方式组织&#xff0c;同时包中至少要有一个Go语言文件用于指明当前包名等基本包信息。如果Go汇编代码中定义的变量和函数要被其它Go语言代码引用&…

Spark的架构与基本运行流程

Spark的架构与基本运行流程一、Spark中的核心概念二、Spark中的核心架构设计一、Spark中的核心概念 &#xff08;1&#xff09;RDD&#xff0c;Spark中最核心的概念就是RDD&#xff08;Resillient Distributed Dataset&#xff0c;弹性分布式数据集&#xff09;。换而言之&…

MySQL---事务及锁机制

MySQL之事务以及锁机制 文章目录MySQL之事务以及锁机制事务事务的操作1、开启事务&#xff1a;start Transaction2、提交事务&#xff1a;commit Transaction3、回滚事务&#xff1a;Rollback Transactionset命令事务的特性---ACID事务的隔离级别1.READ UNCOMMITTED 读未提交2.…

毒鸡汤 | PHPStudy搭建web项目

文章目录前言展示准备工作环境创建网站新建数据库PHP7现成版自己折腾版前言 折腾了很久&#xff0c;终于自己改成功了。问题不多&#xff0c;主要原因是自己没怎么开发过&#xff0c;不熟悉数据库连接原理&#xff0c;现在回头看真的改的很简单。问题主要是现在用的PHP7和旧版的…

I-03数据结构与算法(python版)

最近学习数据结构&#xff0c;对于从未接触过数据结构的我来说&#xff0c;老师不仅讲解理论&#xff0c;还有代码的逐层分析&#xff0c;非常不错&#xff0c;受益匪浅&#xff01;&#xff01;&#xff01;&#xff08;以下是学习记录&#xff09; 数据结构与算法&#xff0…

DEiT:通过注意力训练数据高效的图像transformer 蒸馏

摘要 最近&#xff0c;纯基于注意力的神经网络被证明可以解决图像理解任务&#xff0c;如图像分类。这些高性能的是使用大型基础设施预先训练数以亿计的图像&#xff0c;从而限制了它们的采用。 本文仅通过在Imagenet上训练&#xff0c;产生有竞争力的无卷积transformer。我们…

react原理-transition概念

在react18之中&#xff0c;引入了transition的概念。而且有一个新的api和两个新的hooks startTransitionuseTransitionuseDeferredValue 场景应用&#xff1a; 比如通过输入框输入内容更新列表内容&#xff0c;对于用户来说&#xff0c;输入框输入之后立马反馈的优先级是高过…

VS ChatGPT 中文版插件安装

1.打开Visual Studio Code 2.搜索chatGpt中文版 3.安装完后&#xff0c;重启一下软件 有国模式和国外模式&#xff0c;更多的教程请看插件作者的视频教程

分布式事物

Seata实践 XA模式 AT模式 TCC模式 性能 Saga模式 高可用------集群的形式 Seata实践解决方案 解决方式 Seata 引入服务协调者模式 实践步骤&#xff1a; 分布式事物的入口方法&#xff0c;会调用其他的微服务&#xff0c;每次调用的服务都是一个分支事物调用了多少个分支事…

SpringSecurity 认证实现

在之前一篇 博客 已经说明了 SpringSecurity 认证与授权的原理。这篇用来具体实现一下。 1、新建SecurityConfig 并创建认证管理器 Bean public AuthenticationManager authenticationManager() {... }2、新建认证提供者 Configuration public class SystemUserPasswordAuth…

Oracle项目管理之PrimaveraUnifier组织-业主/合作伙伴公司

目录 一、业主公司 二、合作伙伴公司 三、成员公司 Oracle Primavera Unifier 是企业项目协同管理系统&#xff0c;在国际化项目管理中&#xff0c;在进行常规的业务管理之外&#xff0c;对合同公司/EPC或分包供应商也有一定的管理要求&#xff0c;在Unifier中为了更好的实现…

sja1000 CAN驱动学习、调试记录(基于PeliCan Mode)

一、基础知识 网上讲sja1000 CAN总线控制器的资料很多&#xff0c;这里放一个引路贴&#xff1a;(151条消息) CAN总线控制器SJA1000_FATE的博客-CSDN博客_sja1000 BasicCAN Mode&#xff1a;仅支持11位的ID。 PeliCan Mode&#xff1a;在扩展模式下&#xff0c;允许使用 11 位 …