问题描述
在进行《适配一款硬件》(见 适配一款硬件 | 文档中心 | 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
重现步骤
-
进行《适配一款硬件》(见 适配一款硬件 | 文档中心 | openUBMC )实验,包括增加MDS、CSR配置、编译my_app、vpd代码,在mainifest.yml中集成my_app、vpd软件包,构建qemu固件包。
-
运行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
