【教学培训篇】新增组件

invalid的问题主要是没有require导致,然后也添加一下check_dependencies

然后我看到你的model.json里面对MyEepromModel这个类是的属性是私有的,理论上是不上树,使用busctl –user tree来查询看不到的,我这边把它改成上树的属性

{
    "HelloOpenUBMC": {
        "path": "/bmc/kepler/HelloOpenUBMC",
        "interfaces": {
            "bmc.kepler.OpenUBMC.Community": {
                "properties":{
                    "WelcometoOpenUBMC": {}
                }
            }
        },
        "properties": {
            "Health": {
                "baseType": "U32"
            }
        }
    },
    "MyCSRModel": {
        "path": "/bmc/demo/MyCSRModel/${id}",
        "interfaces": {
            "bmc.demo.OpenUBMC.Reading": {
                "properties":{
                    "TemperatureCelsius": {
                        "usage": [
                            "CSR"
                        ]
                    }
                }
            }
        }
    },
    "MyEepromModel": {
        "path": "/bmc/kepler/MyEepromModel/${id}",
        "interfaces": {
            "bmc.kepler.OpenUBMC.Reading": {
                "properties": {
                    "RefEepromTestChip":
                    {
                        "usage": [
                            "CSR"
                        ],
                        "baseType": "U8[]",
                        "refInterface": "bmc.kepler.Chip.BlockIO"
                    }
                }
            }
        }
    }
}

然后我再app.lua里面添加创建这个实例

-- Copyright (c) Huawei Technologies Co., Ltd. 2025. 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: 2025-9-2
-- Description: DO NOT EDIT; Code generated by "${project_name}_app.lua.mako"

local class = require 'mc.class'
local service = require 'Hello_openUBMC.service'
local logging = require 'mc.logging'
-- 新增ipmi相关文件
local custom_msg = require 'messages.custom'
local ipmi_cmds = require 'Hello_openUBMC.ipmi.ipmi'
local object_manage = require 'mc.mdb.object_manage'
local mc_admin = require 'mc.mc_admin'
local client = require 'Hello_openUBMC.client'

local Hello_openUBMC = class(service)

function Hello_openUBMC:ctor()

end

-- 依赖检查
function Hello_openUBMC: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 Hello_openUBMC:init()
    logging:notice("Hello_openUBMC:init start")
    self.super.init(self)
    -- 依赖检查
    self:check_dependencies()
    self.hello_openUBMC = self:CreateHelloOpenUBMC(function(object)
        object.ObjectName = "HelloOpenUBMC_1"
        object.WelcometoOpenUBMC = "Welcome to openUBMC"
        object.Health = 1
    end)
    self.eeprommodel = self:CreateMyEepromModel(1, function(object)
        object.ObjectName = "MyEepromModel_1"
    end)
    -- ipmi
    self:register_ipmi_cmd(ipmi_cmds.FirstIpmiCmd, self.first_ipmi_cmd)
    logging:notice("MyEepromModel run start")
    logging:notice("Hello_openUBMC: init end")
end

function Hello_openUBMC.first_ipmi_cmd(req, ctx)
    -- 参数校验(按需)
    local data_len = req.DataLen
    local data = req.Data
    if #data ~= data_len then
        logging:error('first ipmi cmd error: invalid req length')
        error(custom_msg.IPMIRequestLengthInvalid())
    end
    -- 业务处理
    -- 构造响应体
    local rsp = ipmi_cmds.FirstIpmiCmd.rsp.new()
    rsp.CompletionCode = 0x00
    rsp.ManufactureId = 0x000000
    logging:operation(ctx, 'Hello_openUBMC', 'first ipmi cmd success, Data:%s.', data)
    return rsp
end

return Hello_openUBMC


上树属性需要在mdb_interface的添加以下内容:

json/path/mdb/bmc/kepler/MyEepromModel/MyEepromModel.json

{
    "MyEepromModel": {
        "path": "/bmc/kepler/MyEepromModel/${id}",
        "interfaces": [
            "bmc.kepler.OpenUBMC.Reading"
        ]
    }
}

json/intf/mdb/bmc/kepler/OpenUBMC/Reading.json

{
    "bmc.kepler.OpenUBMC.Reading": {
        "properties": {
            "RefEepromTestChip":
            {
                "usage": [
                    "CSR"
                ],
                "baseType": "U8[]",
                "refInterface": "bmc.kepler.Chip.BlockIO",
                "description": "eeprom读写方法"
            }
        }
    }
}

回显信息:

Eeprom这个类的信息是显示在hwproxy这个组件的,可以使用busctl --user tree bmc.kepler.hwproxy查看

按照您提供的方式可以初始化成功,但是RefEepromTestChip属性是空的

通过root.sr设置RefEepromTestChip属性关联到Eeprom_DemoEeprom_1时报错,显示

1970-01-01 00:06:37.132868 Hello_openUBMC ERROR: object_manage.lua(205): AddObject MyEepromModel_1_01 failed, life_cycle_id:1, error:kepler.class.ModifyFinalPropertyError: Final Property RefEepromTestChip is not allowed to be modified after initialization.

root.sr如下

root.sr保持不变,尝试将Hello_openUBMC_app.lua Hello_openUBMC:init()中注释掉创建MyEepromModel的部分,同时在Hello_openUBMC:register_mds_callback()中增加MyEepromModel对象的处理,代码如下:

报错还是一样的:初始化后RefEepromTestChip属性不能修改

请再帮忙看下这个问题,多谢

好的 我这边晚点看看哈!涉及知识盲区,正在努力学习,不能及时解答,请见谅!

根据学习发现大部分的RefEepromTestChip都是私有属性,然后我这边进行初步尝试发现的确是只能私有属性,具体原理还有待进一步探索

Hello_openUBMC_app.lua的内容

-- Copyright (c) Huawei Technologies Co., Ltd. 2025. 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: 2025-9-2
-- Description: DO NOT EDIT; Code generated by "${project_name}_app.lua.mako"

local class = require 'mc.class'
local service = require 'Hello_openUBMC.service'
local logging = require 'mc.logging'
-- 新增ipmi相关文件
local custom_msg = require 'messages.custom'
local ipmi_cmds = require 'Hello_openUBMC.ipmi.ipmi'
local object_manage = require 'mc.mdb.object_manage'
local mc_admin = require 'mc.mc_admin'
local client = require 'Hello_openUBMC.client'


local Hello_openUBMC = class(service)

function Hello_openUBMC:ctor()

end

-- 依赖检查
function Hello_openUBMC: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 Hello_openUBMC:init()
    logging:notice("Hello_openUBMC:init start")
    self.super.init(self)
    -- 依赖检查
    self:check_dependencies()
    self.hello_openUBMC = self:CreateHelloOpenUBMC(function(object)
        object.ObjectName = "HelloOpenUBMC_1"
        object.WelcometoOpenUBMC = "Welcome to openUBMC"
        object.Health = 1
    end)
    -- self.eeprommodel = self:CreateMyEepromModel(1, function(object)
    --     object.ObjectName = "MyEepromModel_1"
    -- end)
    -- ipmi
    self:register_ipmi_cmd(ipmi_cmds.FirstIpmiCmd, self.first_ipmi_cmd)
    logging:notice("MyEepromModel run start")
    self:register_mds_callback()
    logging:notice("Hello_openUBMC: init end")
end

function Hello_openUBMC.first_ipmi_cmd(req, ctx)
    -- 参数校验(按需)
    local data_len = req.DataLen
    local data = req.Data
    if #data ~= data_len then
        logging:error('first ipmi cmd error: invalid req length')
        error(custom_msg.IPMIRequestLengthInvalid())
    end
    -- 业务处理
    -- 构造响应体
    local rsp = ipmi_cmds.FirstIpmiCmd.rsp.new()
    rsp.CompletionCode = 0x00
    rsp.ManufactureId = 0x000000
    logging:operation(ctx, 'Hello_openUBMC', 'first ipmi cmd success, Data:%s.', data)
    return rsp
end

function Hello_openUBMC:register_mds_callback()
    object_manage.on_add_object(self.bus, function(class_name, object, position)
        if class_name == 'MyEepromModel' then
            self.eeprommodel = 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.eeprommodel == object then
            self.eeprommodel = nil
        end
    end)
    object_manage.on_delete_object_complete(self.bus, function(position)
    end)
end

return Hello_openUBMC

model.json内容

{
    "HelloOpenUBMC": {
        "path": "/bmc/kepler/HelloOpenUBMC",
        "interfaces": {
            "bmc.kepler.OpenUBMC.Community": {
                "properties":{
                    "WelcometoOpenUBMC": {}
                }
            }
        },
        "properties": {
            "Health": {
                "baseType": "U32"
            }
        }
    },
    "MyCSRModel": {
        "path": "/bmc/demo/MyCSRModel/${id}",
        "interfaces": {
            "bmc.demo.OpenUBMC.Reading": {
                "properties":{
                    "TemperatureCelsius": {
                        "usage": [
                            "CSR"
                        ]
                    }
                }
            }
        }
    },
    "MyEepromModel": {
        "path": "/bmc/kepler/MyEepromModel/${id}",
        "interfaces": {
            "bmc.kepler.OpenUBMC.Reading": {
                "properties": {
                    "Manufacture":
                    {
                        "baseType": "String",
                        "default": "Huawei"
                    }
                }
            }
        },
        "properties": {
            "RefEepromTestChip":
            {
                "usage": [
                    "CSR"
                ],
                "baseType": "U8[]",
                "refInterface": "bmc.kepler.Chip.BlockIO"
            }
        }
    }
}

因为model.json的上树内容发生改变, 需要修改mdb_interface的json/path/mdb/bmc/kepler/MyEepromModel/MyEepromModel.json

{
    "bmc.kepler.OpenUBMC.Reading": {
        "properties": {
            "Manufacture":
            {
                "baseType": "String",
                "description": "厂商名称"
            }
        }
    }
}

然后出包验证

发现您正在使用qemu结合文档中心尝试进行eeprom的读写操作,请问您这边愿意写一个教学培训吗?类似【教学培训篇】新增组件,后续我们将其收纳到qemu的资料汇总中,帮助更多同事~

1 个赞

感谢您的帮助,目前eeprom读写已经调通了,有几个问题想请教一下

  1. check_dependencies 没有找到这个函数的原型,这个函数只是检查依赖是否完善还是会做校正?

  1. 对于像check_dependencies这种库函数或者BlockIO支持的接口函数有文档说明么?有时候是不知道有哪些函数是可以使用的,或者源码提供的功能如何使用,比如从官方指导文档或者论坛能看到一句话Accessor和scanner可用于读写硬件,在调试eeprom的过程中我也尝试了用Accessor,读是没有问题的,但是写没有调通,我理解设置Accessor关联的属性即可以写入到eeprom,不知道是不是这样的,但是设置属性时报错,类似这种问题有种无从下手的感觉,不知道有没有什么指导文档可以参考

image

  1. 关于写一个关于eeprom教学培训的事情,是在论坛“指导文档”这个标签下直接新建,写完发布即可么?
  1. check_dependency这个是检查依赖的资源树对象是否已经上树,直到所有依赖的对象上树才会继续执行后面的组件启动流程。目前该admin:函数原型暂未开发

  2. 像check_dependencies等函数及其接口函数文档说明可以尝试在社区论坛和社区文档中心搜索哈,如果都没有找到,可以直接在社区论坛发表疑问,我们这边相关同事会帮忙解答的,没有任何人会拒绝一个积极好学的人~。然后您这边的疑惑我也会积极向社区反馈的,争取把这种知识壁垒打破。此外,Accessor可以使用读写硬件的,但是Scanner只能读哈,不支持写哈。

  3. 也希望您这边提供一下实现的代码,我这边有空会一起看看为什么设置属性会报错的问题哈,这次和上次的invalid interface很像,可以在相关代码中添加require xxx.Accessor看看哈

  4. eeprom的教学培训直接在指导文档这个标签新建即可,后续我这边将其收纳到qemu资料汇总中哈,感谢您的积极贡献~

Accessor读写eeprom相关代码:

  1. Hello_openUBMC model.json 增加MyCSRModel,其中属性HardwareEepromVal 动态引用Eeprom_DemoEeprom_1
"MyCSRModel": {

    "path": "/bmc/kepler/MyCSRModel/${id}",

    "interfaces": {

        "bmc.kepler.OpenUBMC.Reading": {

            "properties":{

                "TemperatureCelsius": {

                    "usage": \[

                        "CSR"

                    \]

                },

                "HardwareEepromVal": {

                    "usage": \[

                        "CSR"

                    \]

                }

            }

        }

    }

}
  1. Hello_openUBMC service.json

  1. Hello_openUBMC_app.lua

function Hello_openUBMC: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

    if class_name =='MyEepromModel' then

        self.eeprommodel = 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

    if self.eeprommodel == object then

        self.eeprommodel = nil

    end

end)

object_manage.on_delete_object_complete(self.bus, function(position)

end)

end

  1. root.sr

  1. 用mdbctl调试,setprop 失败,想着setprop设置成功后再通过ipmi命令来尝试写入

image

  1. 我不确定是不是设置MyCSRModel_DemoSensor_01的HardwareEepromVal属性就可以直接实现写入eeprom

好的,我这边晚点看看哈

请问这张截图中的sdk.md从哪里可以找到?

docs:openUBMC documentation - GitCode就是社区的docs仓和文档中心是一样的

请问一下,以下的报错如何解决呢?frudata组件报错找不到wzAtlasModel(我自定义的一个对象),尝试过在frudata组件的service.json,required加上bmc.kepler.wzapp.AtlasCard,还是会报错。

        "FruData_NPUCard": {
            "FruId": 1,
            "StorageType": "MCU",
            "FruDev": "#/Chip_Dmini_Elabel",
            "FruName":"#/wzAtlasModel.Name"
        },
        "Fru_NPUCard": {
            "PcbVersion": ".A",
            "FruId": 1,
            "PowerState": 1,
            "FruName":"#/wzAtlasModel.Name",
            "Health": 0,
            "EepStatus": 1,
            "Type": 8,
            "FruDataId": "#/FruData_NPUCard"
        },
2021-03-02 02:10:32.941843 frudata ERROR: object_manage.lua(207): AddObject Fru_NPUCard_0101010102 failed, owner:frudata, path:/bmc/kepler/ObjectGroup/0101010102, position:0101010102, life_cycle_id:1, class_name:Fru, error:./opt/bmc/libmc/lualib/mc/context.lua:185: ./opt/bmc/libmc/lualib/mc/mdb/init.lua:709: invalid interface:bmc.kepler.wzapp.AtlasCard

这个没有require自动对应接口的自动生成代码导致的,例如require “client.lua“,client.lua是自动生成,可以看看是不是这个问题哈

问题已解决 谢谢

1 个赞

我的环境上是conan2.x 遇到了编译问题,想问下社区后续会对conan2编译新建组件时进行适配吗?还是说conan2的环境新建组件时要手动修改下,以这个修改为准呢

这是我的帖子

据我了解,目前bingo new xxx新增组件默认是conan1, conan 2需要咨询对应同事了,我当初搞新建组件是conan1和conan2之际,然后后面切换conan2是手动切换的,这个帖子更新一直包418错误,然后只在评论留言了

1 个赞