新增硬件资源对象失败

问题描述

在进行《适配一款硬件》(见 适配一款硬件 | 文档中心 | openUBMC )实验时,执行ipmitool.exe -H ip -I lanplus -p 623 -U TestUser -P OpenUBMC@123 -C 17 sdr可以看到传感器Demo Temperature信息,但执行busctl --user tree bmc.kepler.my_app命令,输出没有MyCSRModel_DemoSensor_01信息。

环境信息

  • 操作系统:Ubuntu 24.04

  • 软件版本:OpenUBMC2512

  • 硬件配置:intel i7/64G

重现步骤

  1. 进行《适配一款硬件》(见 适配一款硬件 | 文档中心 | openUBMC )实验,包括增加MDS、CSR配置、编译my_app、vpd代码,在mainifest.yml中集成my_app、vpd软件包,构建qemu固件包。

  2. 运行qemu固件包仿真,在宿主机上ssh登录qemu openubmc,执行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

实际结果

└─/bmc
├─/bmc/demo
│ └─/bmc/demo/MyMDSModel
│ └─/bmc/demo/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
└─/bmc/kepler/my_app/MicroComponent/Debug

尝试过的解决方案

编译my_app组件时尝试了bingo build --stage=rc和bingo build --stage=stable,并在manifest.yml中使用对应编译出的stable/rc包,结果都一样

配置文件:

vpd的root.sr文件如下:

root@ubuntu:/home/ubuntu/workspace3/vpd# cat vendor/Huawei/Server/Kunpeng/openUBMC/root.sr

{
    "FormatVersion": "1.00",
    "DataVersion": "1.00",
    "Unit": {
        "Type": "Root",
        "Name": "RootBoard"
    },
    "ManagementTopology": {
        "Anchor": {
            "Buses": [
                "I2c_1",
                "I2c_2",
                "I2c_3",
                "I2c_4",
                "I2c_5",
                "I2c_6",
                "I2c_7",
                "I2c_8",
                "I2c_11",
                "Jtag_1",
                "JtagOverLocalBus_1",
                "Hisport_0",
                "Hisport_1",
                "Hisport_2",
                "Hisport_3",
                "Hisport_4",
                "Hisport_5",
                "Hisport_6",
                "Hisport_7",
                "Hisport_8",
                "Hisport_9",
                "Hisport_10",
                "Hisport_11",
                "Hisport_12",
                "Hisport_13",
                "Hisport_14",
                "Hisport_15",
                "Hisport_16",
                "Hisport_17",
                "Hisport_18",
                "Hisport_19",
                "Hisport_20",
                "Hisport_21",
                "Gpio_31",
                "Gpio_56",
                "Gpio_74"
            ]
        },
        "I2c_2": {
            "Connectors": [
                "Connector_EXU_1"
            ]
        },
        "I2c_8": {
            "Chips": [
                "Lm75_DemoSensor"
            ]
        },
        "Gpio_31": {
           "Chips": [
                "Chip_Gpio_31"
            ]
        },
        "Gpio_56": {
           "Chips": [
                "Chip_Gpio_56"
            ]
        },
        "Gpio_74": {
            "Chips": [
                "Chip_Gpio_74"
            ]
        }
    },
    "Objects": {
        "I2c_1": {
            "Id": 1
        },
        "I2c_2": {
            "Id": 2
        },
        "I2c_3": {
            "Id": 3
        },
        "I2c_4": {
            "Id": 4
        },
        "I2c_5": {
            "Id": 5
        },
        "I2c_6": {
            "Id": 6
        },
        "I2c_7": {
            "Id": 7
        },
        "I2c_8": {
            "Id": 8
        },
        "I2c_11": {
            "Id": 11
        },
        "Jtag_1": {
            "Id": 0,
            "ValidateTime": 300,
            "TargetResetGpio": 56
        },
        "JtagOverLocalBus_1": {
            "Id": 0,
            "ValidateTime": 300,
            "TargetResetGpio": 56,
            "LocalBusOffset": 32,
            "TckBit": 3,
            "TmsBit": 2,
            "TdoBit": 0,
            "TdiBit": 1
        },
        "Hisport_0": {
            "Id": 0
        },
        "Hisport_1": {
            "Id": 1
        },
        "Hisport_2": {
            "Id": 2
        },
        "Hisport_3": {
            "Id": 3
        },
        "Hisport_4": {
            "Id": 4
        },
        "Hisport_5": {
            "Id": 5
        },
        "Hisport_6": {
            "Id": 6
        },
        "Hisport_7": {
            "Id": 7
        },
        "Hisport_8": {
            "Id": 8
        },
        "Hisport_9": {
            "Id": 9
        },
        "Hisport_10": {
            "Id": 10
        },
        "Hisport_11": {
            "Id": 11
        },
        "Hisport_12": {
            "Id": 12
        },
        "Hisport_13": {
            "Id": 13
        },
        "Hisport_14": {
            "Id": 14
        },
        "Hisport_15": {
            "Id": 15
        },
        "Hisport_16": {
            "Id": 16
        },
        "Hisport_17": {
            "Id": 17
        },
        "Hisport_18": {
            "Id": 18
        },
        "Hisport_19": {
            "Id": 19
        },
        "Hisport_20": {
            "Id": 20
        },
        "Hisport_21": {
            "Id": 21
        },
        "Connector_EXU_1": {
            "Bom": "14100513",
            "Slot": 1,
            "Position": 1,
            "Presence": 1,
            "Id": "",
            "AuxId": "",
            "Buses": [
                "I2c_1",
                "I2c_2",
                "I2c_3",
                "I2c_4",
                "I2c_5",
                "I2c_6",
                "I2c_7",
                "I2c_8",
                "I2c_11",
                "Jtag_1",
                "JtagOverLocalBus_1",
                "Hisport_0",
                "Hisport_1",
                "Hisport_2",
                "Hisport_3",
                "Hisport_4",
                "Hisport_5",
                "Hisport_6",
                "Hisport_7",
                "Hisport_8",
                "Hisport_9",
                "Hisport_10",
                "Hisport_11",
                "Hisport_12",
                "Hisport_13",
                "Hisport_14",
                "Hisport_15",
                "Hisport_16",
                "Hisport_17",
                "Hisport_18",
                "Hisport_19",
                "Hisport_20",
                "Hisport_21"
            ],
            "SystemId": 1,
            "ManagerId": "1",
            "ChassisId": "1",
            "SilkText": "J6023",
            "IdentifyMode": 3,
            "Type": "ExpandBoard"
        },
        "Connector_Sensor": {
            "Bom": "14100513",
            "Slot": 20,
            "Position": 2,
            "Presence": 1,
            "Id": "Sensor",
            "AuxId": "0",
            "Buses": [
            ],
            "SystemId": 1,
            "ManagerId": "1",
            "ChassisId": "1",
            "IdentifyMode": 2
        },
        "Scanner_Gpio31": {
			"Chip": "#/Chip_Gpio_31",
            "Period": 3000,
			"Value": 1
		},
        "Chip_Gpio_31": {
        },
        "Gpio_31": {
            "Id": 31,
            "Direction": 0
        },
        "Accessor_Gpio56": {
			"Chip": "#/Chip_Gpio_56"
		},
        "Chip_Gpio_56": {

        },
        "Gpio_56": {
            "Id": 56,
            "Direction": 1
        },
        "CpldReset_1": {
            "Bcu": "#/Accessor_Gpio56.Value"
        },
        "Gpio_74": {
            "Id": 74,
            "Direction": 0
        },
        "Scanner_Gpio74": {
            "Chip": "#/Chip_Gpio_74",
            "Period": 1000,
            "Value": 0
        },
        "Chip_Gpio_74": {
        },
        "DFT_1": {
            "Mode": "<=/Scanner_Gpio74.Value"
        },
        "Uart_0": {
            "Id": 0,
            "Description": "UART0默认不连接",
            "UartConnection": 255,
            "PortConnection": 255,
            "BaudRate": 115200,
            "DataBit": 8,
            "ParityBit": 78,
            "StopBit": 1,
            "SerialSwitch": "<=/Scanner_Gpio31.Value",
            "@Default": {
                "SerialSwitch": 1
            }
        },
        "Uart_1": {
            "Id": 1,
            "Description": "UART1连接PORT1",
            "UartConnection": 255,
            "PortConnection": 1,
            "BaudRate": 115200,
            "DataBit": 8,
            "ParityBit": 78,
            "StopBit": 1,
            "SerialSwitch": "<=/Scanner_Gpio31.Value",
            "@Default": {
                "SerialSwitch": 1
            }
        },
        "Uart_2": {
            "Id": 2,
            "Description": "UART2连接PORT2",
            "UartConnection": 255,
            "PortConnection": 2,
            "BaudRate": 115200,
            "DataBit": 8,
            "ParityBit": 78,
            "StopBit": 1,
            "SerialSwitch": "<=/Scanner_Gpio31.Value",
            "@Default": {
                "SerialSwitch": 1
            }
        },
        "Uart_3": {
            "Id": 3,
            "Description": "UART3连接PORT3",
            "UartConnection": 255,
            "PortConnection": 3,
            "BaudRate": 115200,
            "DataBit": 8,
            "ParityBit": 78,
            "StopBit": 1,
            "SerialSwitch": "<=/Scanner_Gpio31.Value",
            "@Default": {
                "SerialSwitch": 1
            }
        },
        "Uart_4": {
            "Id": 4,
            "Description": "UART4默认不连接",
            "UartConnection": 255,
            "PortConnection": 255,
            "BaudRate": 115200,
            "DataBit": 8,
            "ParityBit": 78,
            "StopBit": 1,
            "SerialSwitch": "<=/Scanner_Gpio31.Value",
            "@Default": {
                "SerialSwitch": 1
            }
        },
        "Lm75_DemoSensor": {
            "OffsetWidth": 1,
            "AddrWidth": 1,
            "Address": 144
        },
        "Scanner_GetTemperature": {
            "Chip": "#/Lm75_DemoSensor",
            "Size": 1,
            "Offset": 0,
            "Mask": 255,
            "Period": 1000
        },
        "ThresholdSensor_DemoSensor": {
            "AssertMask": 29312,
            "DeassertMask": 29312,
            "ReadingMask": 6168,
            "Linearization": 0,
            "M": 100,
            "RBExp": 224,
            "UpperCritical": 48,
            "UpperNoncritical": 46,
            "PositiveHysteresis": 2,
            "NegativeHysteresis": 2,
            "OwnerId": 32,
            "OwnerLun": 0,
            "EntityId": "<=/Entity_DemoSensor.Id",
            "EntityInstance": "<=/Entity_DemoSensor.Instance",
            "Initialization": 127,
            "Capabilities": 104,
            "SensorType": 1,
            "ReadingType": 1,
            "SensorName": "Demo Temperature Sensor",
            "Unit": 128,
            "BaseUnit": 1,
            "ModifierUnit": 0,
            "Analog": 1,
            "MaximumReading": 127,
            "MinimumReading": 128,
            "Reading": "<=/Scanner_GetTemperature.Value"
        },
        "Entity_DemoSensor":{
            "Id": 99,
            "Name": "Demo Temperature Sensor",
            "PowerState": 1,
            "Presence": 1,
            "Instance": 96
        },
        "MyCSRModel_DemoSensor": {
            "TemperatureCelsius": "<=/Scanner_GetTemperature.Value"
        }
    }
}

my_app的model.json 文件如下:

root@ubuntu:/home/ubuntu/workspace3/my_app# cat mds/model.json

{
    "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"
                        ]
                    }
                }
            }
        }
    }
}

my_app/src/lualib/my_app_app.lua

-- Copyright (c) Huawei Technologies Co., Ltd. 2026. All rights reserved.
--
-- this file licensed under the Mulan PSL v2.
-- You can use this software according to the terms and conditions of the Mulan PSL v2.
-- You may obtain a copy of Mulan PSL v2 at: http://license.coscl.org.cn/MulanPSL2
--
-- THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
-- IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
-- PURPOSE.
-- See the Mulan PSL v2 for more details.
--
-- Author: auto generate
-- Create: 2026-2-2
-- Description: DO NOT EDIT; Code generated by "${project_name}_app.lua.mako"

local class = require 'mc.class' -- lua开发框架提供的增强类型系统
local c_service = require 'my_app.service' -- 自动生成代码生成的组件基类

local class = require 'mc.class' -- lua开发框架提供的增强类型系统
local c_service = require 'my_app.service' -- 自动生成代码生成的组件基类
-- 新增ipmi相关文件
local ipmi_struct = require 'my_app.ipmi.ipmi'
local ipmi_msg = require 'my_app.ipmi.ipmi_message'
local ipmi = require 'ipmi'
local object_manage = require 'mc.mdb.object_manage'

local mc_admin = require 'mc.mc_admin'
local client = require 'app.client'

local app = class(c_service) -- 创建一个组件类型

function app:ctor() -- 组件的构造函数
end

function app:check_dependencies()
    logging:notice("check dependencies start")
    local admin = mc_admin.new()
    admin:parse_dependency(APP_WORKING_DIRECTORY .. '/mds/service.json')
    admin:check_dependency(self.bus)
end

function app:init() -- 组件的初始化函数
    app.super.init(self) -- 先调用基类的初始化函数
    -- 依赖检查
    self:check_dependencies()
    self.my_mds_model = self:CreateMyMDSModel(1, function(object) -- 创建一个mds对象实例,名字为1
        object.ObjectName = "MyMDSModel_1"  -- 在回调函数中进行对象的属性赋值
        object.WelcomeMessage = "Hello OpenUBMC!"
        object.SecretNumber = 330
    end)
    self:register_ipmi()
    self:register_mds_callback()
end

function app:register_ipmi()
    self:register_ipmi_cmd(ipmi_struct.GetSecretNumber, function(req, ctx, ...)
        return ipmi_msg.GetSecretNumberRsp.new(ipmi.types.Cc.Success, self.my_mds_model.SecretNumber)
    end)
    self:register_ipmi_cmd(ipmi_struct.SetSecretNumber, function(req, ctx, ...)
        if req.Data > 630 then
            return ipmi_msg.SetSecretNumberRsp.new(ipmi.types.Cc.InvalidFieldRequest)
        end
        self.my_mds_model.SecretNumber = req.Data
        return ipmi_msg.SetSecretNumberRsp.new(ipmi.types.Cc.Success)
    end)
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

return app

一个建议:学习markdown文件怎么写,这代码完全没法看。

多谢,是个好建议。

你执行bingo gen了吗

执行了

可以参考下这两个wiki看看

@qinzida “sdr可以看到传感器Demo Temperature信息” 跟MyCSRModel对象能不能查询到没有直接关系,在环境上查询一下你新建的app的conan版本号(cat /etc/package_info),检查是否与你本地最新代码里的版本号是一致的

收到,节后我试下。

收到,节后我再看下。

有结果或者还有问题烦请尽快回复

用cat /etc/package_info命令查看my_app组件版本是正确的。

按照楼上huangzhiyu的wiki参考,目前有什么结果吗

没有结果。我是在qemu虚拟机中进行测试的,是否虚拟机中无法新增硬件资源?

  1. qemu支持新增硬件资源,需要可以看一下qemu的教学培训,Qemu资料汇总~ - CICD SIG - openUBMC 论坛

  1. openUBMC的qemu出包命令是bingo build -sc qemu哈
  • 参考《实现Eeprom器件的读写功能》,在my_app组件进行添加eeprom设备读写功能,在qemu虚拟机中用busctl --user tree bmc.kepler.my_app命令查看接口对象,没有MyEepromModel对象。

  • 按照Qemu资料汇总的《新增组件》增加组件,组件没跑起来,qemu虚拟机终端一直在打印

2023-08-15 09:21:02.438713 maca ERROR: init.lua(194): [Hello_openUBMC]StartupCheck failed, error: initialization is not complete while checking the startup status, status: Starting, check count: 42”

/var/log/app.log 报错:

1970-01-01 00:00:44.837320 Hello_openUBMC ERROR: object.lua(455): regist vtable failed, path:/bmc/kepler/HelloOpenUBMC/, interface: bmc.kepler.Object.Properties, err: org.freedesktop.DBus.Error.InvalidArgs: Object path was not valid: '/bmc/kepler/HelloOpenUBMC/'
1970-01-01 00:00:44.841543 Hello_openUBMC ERROR: class.lua(130): failed to start Hello_openUBMC in init stage, err: .../libmc/lualib/mc/class_mgnt/api/object/mdb_mgmt/init.lua:152: attempt to index field 'shm_obj' (a boolean value)
1970-01-01 00:00:44.845359 Hello_openUBMC ERROR: main.lua(32): Hello_openUBMC start failed, err: ./opt/bmc/libmc/lualib/mc/class.lua:132: .../libmc/lualib/mc/class_mgnt/api/object/mdb_mgmt/init.lua:152: attempt to index field 'shm_obj' (a boolean value)

我这边私戳你看看新增组件的代码哈

在self:register_mds_callback()前面增加skynet.sleep(500),暂时解决了,可能是qemu性能问题导致。

~ ~ # busctl --user tree bmc.kepler.my_app
└─/bmc
  ├─/bmc/demo
  │ ├─/bmc/demo/MyCSRModel
  │ │ └─/bmc/demo/MyCSRModel/MyCSRModel_DemoSensor_01
  │ └─/bmc/demo/MyMDSModel
  │   └─/bmc/demo/MyMDSModel/1
  └─/bmc/kepler
    ├─/bmc/kepler/IpmiCmds
    │ ├─/bmc/kepler/IpmiCmds/00
    │ │ └─/bmc/kepler/IpmiCmds/00/00
    │ │   ├─/bmc/kepler/IpmiCmds/00/00/EepromReadCmd
    │ │   └─/bmc/kepler/IpmiCmds/00/00/EepromWriteCmd
    │ └─/bmc/kepler/IpmiCmds/30
    │   └─/bmc/kepler/IpmiCmds/30/90
    │     ├─/bmc/kepler/IpmiCmds/30/90/GetSecretNumber
    │     └─/bmc/kepler/IpmiCmds/30/90/SetSecretNumber
    ├─/bmc/kepler/MyEepromModel
    │ └─/bmc/kepler/MyEepromModel/MyEepromModel_1_01
    └─/bmc/kepler/my_app
      └─/bmc/kepler/my_app/MicroComponent
        └─/bmc/kepler/my_app/MicroComponent/Debug