openubmc 新增硬件资源对象

新增硬件资源对象 ​

CSR中的对象定义来源于MDS模型,通过实例化MDS类定义,我们便可以很方便的在对应的设备配置中,将所需要的硬件管理数据配置齐全,然后在组件中对资源对象进行业务逻辑编写。

MDS对象定义 ​

首先我们需要在my_app组件的MDS模型中定义资源类。
打开在《新增一个组件》中创建的my_app组件的mds/model.json, 添加下面的模型定义

"MyCSRModel": {
        "path": "/bmc/demo/MyCSRModel/${id}",
        "interfaces": {
            "bmc.demo.OpenUBMC.Reading": {
                "properties": {
                    "TemperatureCelsius": {
                        "usage": [
                            "CSR"
                        ]
                    }
                }
            }
        }
    }

完整代码

{
    "MyMDSModel": {
        "path": "/bmc/demo/MyMDSModel/${id}",
        "interfaces": {
            "bmc.demo.OpenUBMC.Community": {
                "properties": {
                    "WelcomeMessage": {}
                }
            }
        },
        "properties": {
            "SecretNumber": {
                "baseType": "U32"
            }
        }
    },
    "MyCSRModel": {
        "path": "/bmc/demo/MyCSRModel/${id}",
        "interfaces": {
            "bmc.demo.OpenUBMC.Reading": {
                "properties": {
                    "TemperatureCelsius": {
                        "usage": [
                            "CSR"
                        ]
                    }
                }
            }
        }
    }
}

与普通的组件MDS对象定义不同,这里新增了"usage": ["CSR"]的声明。这个表示在某个CSR中,存在一个叫做MyCSRModel的对象,包含TemperatureCelsius的属性。

CSR对象添加

关于硬件自发现的具体设计,请参考《硬件自发现》

在上述的usage的定义中,可以看到TemperatureCelsius来源于CSR,因此需要在上述的CSR中定义一个MyCSRModel,通过硬件自发现将CSR对象分发给my_app。

命名规则是 <前缀_后缀> 前缀必须与mds里一样,后缀可以随便命名

在vpd/vendor/Huawei/Server/Kunpeng/openUBMC/root.sr的Objects里添加下面代码

"MyCSRModel_DemoSensor": {
        "TemperatureCelsius": "<=/Scanner_GetTemperature.Value"
    }

Scanner_GetTemperature对象是在《openubmc 新增一个 IPMI Sensor》中添加的

自动生成代码 ​

由于新增了模型定义,我们需要通过自动代码生成辅助代码。在my_app中执行如下命令:

cd /home/workspace/my_app
bingo gen

代码编写 ​

由于MyCSRModel的实例已经在root.sr中“创建”,因此我们需要等待对象的分发,而非主动去创建。可以通过如下的方法在代码中获取对象的分发。

打开my_app_app.lua,在app:init()中添加对象添加回调函数。

local object_manage = require 'mc.mdb.object_manage'
function app:init() -- 组件的初始化函数
    app.super.init(self) -- 先调用基类的初始化函数
    self.my_mds_model = self:CreateMyMDSModel(1, function(object) -- 创建一个mds对象实例
        object.ObjectName = "MyMDSModel_1"  -- 在回调函数中进行对象的属性赋值
        object.WelcomeMessage = "Hello OpenUBMC!"
        object.SecretNumber = 330
    end)
    self:register_ipmi()
    self:register_mds_callback() -- 新增mds方法回调
end

function app:register_mds_callback()
    object_manage.on_add_object(self.bus, function(class_name, object, position)
        if class_name == 'MyCSRModel' then
            self.my_csr_model = object
        end
    end)
    object_manage.on_add_object_complete(self.bus, function(position)
    end)
    object_manage.on_delete_object(self.bus, function(class_name, object, position)
        if self.my_csr_model == object then
            self.my_csr_model = nil
        end
    end)
    object_manage.on_delete_object_complete(self.bus, function(position)
    end)
end

组件构建 ​

由于修改了my_app仓库,因此我们需要进行构建。

为了和之前版本进行区分,我们需要手动将mds目录下的service.json中的version字段进行更新,通常会在原有版本号的最后一位上加一。随后再执行组件构建命令。

bingo build --stage=rc

因为vpd仓库也被修改了,所以也需要重新构建。修改版本号,然后执行构建命令。

bingo build --stage=rc

整包构建 ​

在manifest中找到之前my_app声明位置,将版本改至对应的构建版本,然后再进行整包构建。

bingo build

整包测试 ​

检查产物

.sr 打进整包后落在 /opt/bmc/sr/root.sr(package() 按扩展名拷到 opt/bmc/sr)。
执行以下命令可以检查是否被包含到整包中

grep -o 'MyCSRModel_DemoSensor' home/workspace/manifest/temp/build_openUBMC_debug_dev/buildimg/rtos_with_driver/rootfs/opt/bmc/sr/root.sr
MyCSRModel_DemoSensor

整包升级

整包升级后,可以查看资源协作接口对象,

source /etc/profile
busctl --user tree bmc.kepler.my_app
└─/bmc
  |─/bmc/demo
  |  |─/bmc/demo/MyCSRModel
  |  | └─/bmc/demo/MyCSRModel/MyCSRModel_DemoSensor_01
  |  └─/bmc/kepler/MyMDSModel
  |    └─/bmc/kepler/MyMDSModel/1
  └─/bmc/kepler
  | └─/bmc/kepler/IpmiCmds
  |   └─/bmc/kepler/IpmiCmds/30
  |     └─/bmc/kepler/IpmiCmds/30/90
  |       |─/bmc/kepler/IpmiCmds/30/90/GetSecretNumber
  |       └─/bmc/kepler/IpmiCmds/30/90/SetSecretNumber
  └─/bmc/kepler/my_app
    └─/bmc/kepler/my_app/MicroComponent

通过busctl --user tree我们发现多了一个对象,这个便是CSR中配置的对象。我们可以通过busctl --user introspect命令对对象进行查看

busctl --user introspect bmc.kepler.my_app /bmc/demo/MyCSRModel/MyCSRModel_DemoSensor_01
NAME                                    TYPE      SIGNATURE   RESULT/VALUE               FLAGS
bmc.kepler.OpenUBMC.Reading             interface -           -                          -
.TemperatureCelsius                     property  n           28                         emits-change writable
bmc.kepler.Object.Properties            interface -           -                          -
.GetAllWithContext                      method    a{ss}s      a{sv}                      -
.GetOptions                             method    a{ss}ss     a{ss}                      -
.GetPropertiesByNames                   method    a{ss}sas    a{sv}a{sv}                 -
.GetPropertiesByOptions                 method    a{ss}sa{ss} as                         -
.GetWithContext                         method    a{ss}ss     v                          -
.SetWithContext                         method    a{ss}ssv    -                          -
.ClassName                              property  s           "MyCSRModel"               emits-change
.ObjectIdentifier                       property  (ysss)      0 "1" "" "01"              emits-change
.ObjectName                             property  s           "MyCSRModel_DemoSensor_01" emits-change
org.freedesktop.DBus.Introspectable     interface -           -                          -
.Introspect                             method    -           s                          -
org.freedesktop.DBus.ObjectManager      interface -           -                          -
.GetManagedObjects                      method    -           a{oa{sa{sv}}}              -
org.freedesktop.DBus.Peer               interface -           -                          -
.GetMachineId                           method    -           s                          -
.Ping                                   method    -           -                          -
org.freedesktop.DBus.Properties         interface -           -                          -
.Get                                    method    ss          v                          -
.GetAll                                 method    s           a{sv}                      -
.Set                                    method    ssv         -                          -
.PropertiesChanged                      signal    sa{sv}as    -                          -

MDS 对象与 CSR 对象区别

MDS 对象是管理面对象

在组件的 mds/model.json 里定义,代码生成后挂到 D-Bus 资源树(例如 /bmc/demo/MyMDSModel/1)。北向 Redfish/IPMI/Web 读的是它。生命周期由应用管:CreateMyMDSModel 创建,Lua 里给 WelcomeMessage、SecretNumber 赋值。

CSR 对象是硬件面对象

写在 VPD 的 .sr 里(openUBMC/root.sr),例如 Lm75_DemoSensor、Scanner_GetTemperature、ThresholdSensor_DemoSensor、Entity_DemoSensor。描述芯片、总线、扫描周期、门限。由 hwdiscovery 解析、hwproxy 按 Scanner 去读寄存器。它本身不是北向资源。中间用 "usage": ["CSR"] 粘起来:MDS 属性声明后,框架按同名属性把 CSR 对象的值灌进 MDS,应用不用再写。sensor 组件就是这样:MDS 类 ThresholdSensor 的 SensorName、Reading、UpperCritical 全是 "usage": ["CSR"],对应 .sr 里 ThresholdSensor_*。

一句话总结

MDS 是给北向看的软件对象;CSR 是给南向扫硬件的描述。带 usage: CSR 的 MDS 只是把硬件读值接到管理树上,并没有变成另一种对象。

posted @ 2026-09-17 16:16  一枚码农  阅读(21)  评论(0)    收藏  举报