【Accessor】新增组件设置Accessor值失败

// 此模板仅供参考,如果不适用可以修改

问题描述

自己新增了一个app,然后声明了一个私有对象,对象有个属性关联了Accessor,在代码里面修改Accessor,但是报错

service.json

{
    "name": "xx_general_hardware",
    "type": "application",
    "deployConfig": "xx_hardware.service",
    "version": "1.0.0",
    "author": "xxx",
    "license": "Mulan PSL v2",
    "description": "xxx self-developed board component",
    "codegen_policy":{
        "version": "18"
    },
    "dependencies": {
        "test": [
            {
                "conan": "mdb_interface/[>=1.90.75]"
            },
            {
                "conan": "key_mgmt/[>1.0.0]"
            },
            {
                "conan": "persistence/[>1.0.0]"
            },
            {
                "conan": "hwdiscovery/[>1.0.0, <1.90.0]"
            },
            {
                "conan": "firmware_mgmt/[>=1.0.2]"
            },
            {
                "conan": "hwproxy/[>1.0.0]"
            },
            {
                "conan": "frudata/[>1.0.0]"
            },
            {
                "conan": "fructrl/[>1.0.0]"
            },
            {
                "conan": "ipmi_core/[>=1.50.23]"
            },
            {
                "conan": "maca/[>1.0.0]"
            },
            {
                "conan": "dtframeforlua/[>=0.0.1]"
            }
        ],
        "build": [
            {
                "conan": "libmc4lua/[>=0.0.1]"
            },
            {
                "conan": "mdb_interface/[>=0.0.1]"
            }
        ]
    },
    "required": [
        {
            "path": "*",
            "interface": "bmc.kepler.Accessor"
        },
        {
            "path": "*",
            "interface": "bmc.kepler.Chip.BlockIO",
            "properties": {}
        }
    ]
}

model.json

{
    "Expander": {
        "tableName": "t_expander_info",
        "privilege": ["ReadOnly"],
        "properties": {
            "NodeId": {
                "usage": [
                    "CSR",
                    "PoweroffPer"
                ],
                "baseType": "String",
                "primaryKey": true
            },
            "PowerStatus": {
                "usage": [
                    "CSR"
                ],
                "baseType": "U8"
            },
            "SetReset": {
                "usage": [
                    "CSR"
                ],
                "baseType": "U8"
            },
            "GetReset": {
                "usage": [
                    "CSR"
                ],
                "baseType": "U8"
            },
            "Heartbeat": {
                "usage": [
                    "CSR"
                ],
                "baseType": "U8"
            },
            "SyncBmcTimeEnabled": {
                "usage": [
                    "CSR",
                    "PoweroffPer"
                ],
                "baseType": "Boolean",
                "default": true
            }
        }
    }
}

在代码里面设置Accessor的值:

self.expander_list[1].mds_obj.SetReset = 0

报错:
2026-03-04 17:19:13.877702 xx_general_hardware ERROR: service.lua(95): [set_expander_config] set cpld value failed, data = 0x00, res = ./opt/bmc/libmc/lualib/mc/mdb/init.lua:758: invalid interface:bmc.kepler.Accessor

环境信息

openUBMC 25.12

重现步骤

  1. [第一步]

  2. [第二步]

  3. [第三步]

期望结果

[您希望实现什么]

实际结果

[实际发生了什么,包含错误信息]

尝试过的解决方案

[列出您已经尝试过的解决方案及结果]

答案内容由AI生成,仅供参考:
:white_check_mark: 结论

您当前的问题核心是:

SetReset 属性未通过正确的 CSR 配置与 Accessor 对象建立绑定关系

请立即执行:

  1. :white_check_mark: 添加 Accessor_ExpanderReset 对象;
  2. :white_check_mark:model.json 中为 SetReset 添加 reference 引用;
  3. :white_check_mark: 确认 Smc_ExpanderSMC 等 Chip 已定义;
  4. :white_check_mark: 构建并部署后,重试设置操作。

完成后,错误 invalid interface:bmc.kepler.Accessor 将消失,硬件写入即可正常生效。

如有具体 SMC 地址或 .sr 配置片段,可进一步协助验证配置准确性。

点击此处查看详细分析解答

新增组件设置Accessor值失败问题分析与解决方案

根据您提供的问题描述,您在开发一个新的应用组件 xx_general_hardware 时,尝试通过代码修改一个与 Accessor 对象关联的属性(SetReset),但遇到了如下错误:

invalid interface:bmc.kepler.Accessor

尽管您的 service.json 已声明依赖 hwproxy 并在 required 中引用了 bmc.kepler.Accessor 接口,但仍然失败。以下将从问题定位、原因分析、解决方案和最佳实践四个方面进行详细说明。


:magnifying_glass_tilted_left: 一、问题定位

您的代码逻辑如下:

self.expander_list[1].mds_obj.SetReset = 0

该操作本质上是尝试直接赋值一个映射到 Accessor 的 MDS 对象属性。然而,报错信息 invalid interface:bmc.kepler.Accessor 表明:系统无法识别或正确绑定该属性所关联的 Accessor 接口

这通常不是 Lua 层面的语法错误,而是底层 CSR 模型配置或硬件访问机制未正确对齐所致。


:puzzle_piece: 二、根本原因分析

结合上下文知识库、配置文档及常见开发实践,可能的原因包括:

:cross_mark: 1. 未正确配置 Accessor 对象

您在 model.json 或对应的 CSR 配置文件中,虽定义了 SetReset 属性,但未显式声明对应的 Accessor 对象,导致该属性无法关联到实际的硬件寄存器。

:white_check_mark: 正确方式:必须定义一个 Accessor 类型的对象(如 Accessor_ExpanderReset),并正确配置其 Chip, Offset, Mask, Type 等字段。


:cross_mark: 2. SetReset 属性未通过 #/Accessor_xxx.Value 动态关联

即使存在 Accessor,如果 SetReset 属性没有使用 CSR 的动态关联语法(即 #/Accessor_ExpanderReset.Value),它只是一个普通属性,不具备硬件访问能力

"SetReset": {
  "usage": ["CSR"],
  "baseType": "U8",
  "default": 0,
  "reference": "#/Accessor_ExpanderReset.Value"
}

:warning: 缺少 "reference" 字段 → 导致 bmc.kepler.Accessor 接口未被激活。


:cross_mark: 3. Accessor 配置错误(Type、Mask、Offset 不匹配)

根据知识库中《CSR配置字典之Accessor类》文档,以下参数必须准确:

  • Type: 0(位读写)或 1(块读写)
  • Mask: 位操作时必须有效(如 1 表示最低位)
  • Offset: 必须为十进制(JSON 不支持十六进制)

若配置不当,即使接口存在,也会导致验证失败,invalid interface 错误随之出现。


:cross_mark: 4. Accessor 所依赖的 Chip(如 SMC)未定义或路径错误

AccessorChip 属性应指向有效的硬件代理对象(如 #/Smc_ExpanderSMC)。若该 SMC 未定义或路径拼写错误,则整个链路断裂。


:cross_mark: 5. hwproxy 服务未正常加载或权限不足

虽然 service.json 声明了依赖 hwproxy/[>1.0.0],但如果构建时未正确拉取版本,或运行时 hwproxy 未启动,也无法提供 bmc.kepler.Accessor 接口。


:white_check_mark: 三、解决方案

:white_check_mark: 步骤 1:定义正确的 Accessor 对象

在您的 CSR 配置文件(如 .sr 文件或模型包)中添加如下对象:

{
  "Accessor_ExpanderReset": {
    "class": "Accessor",
    "Chip": "#/Smc_ExpanderSMC",
    "Offset": 469765888,
    "Size": 1,
    "Mask": 1,
    "Type": 0,
    "Value": 0
  }
}

:blue_book: 说明:

  • Offset: 示例值,请替换为实际 SMC 命令字偏移(十进制)
  • Mask: 若只操作一位,设为 1(表示 BIT0)
  • Type: 0 = 位读写;1 = 块读写

:white_check_mark: 步骤 2:在 model.json 中建立动态引用

修改 SetReset 定义,加入 reference 字段以绑定 Accessor

"SetReset": {
  "usage": ["CSR"],
  "baseType": "U8",
  "default": 0,
  "reference": "#/Accessor_ExpanderReset.Value"
}

:white_check_mark: 此举确保对该属性的读写操作会转发至底层 Accessor 接口,触发实际硬件 I/O。


:white_check_mark: 步骤 3:确保关联的 Chip(如 SMC)已正确定义

确认存在如下 SMC 对象(或其他类型 Chip):

{
  "Smc_ExpanderSMC": {
    "class": "Chip",
    "Type": "SMC",
    "Bus": "#/I2C_Bus_Expander",
    "Addr": "0x50"
  }
}

:white_check_mark: 步骤 4:验证 hwproxy 正常工作

检查 hwproxy 是否已部署并运行:

busctl list | grep hwproxy

应输出类似:

bmc.kepler.hwproxy

如果没有,请确认依赖版本正确且服务已激活。


:white_check_mark: 步骤 5:避免直接使用 setprop 修改 Value

:red_exclamation_mark: 即使您成功写入 SetReset = 0,也不要期望硬件自动响应,除非后端有服务监听该变化。

:white_check_mark: 推荐:如需可靠控制,直接调用 Chip.BlockIO.Write 接口更安全。

示例代码:

local blockio = mds.get_object("/path/to/Smc_ExpanderSMC", "bmc.kepler.Chip.BlockIO")
blockio:Write({
  Offset = 469765888,
  Size = 1,
  Data = {0}
})

:memo: 四、最佳实践总结

实践项 推荐做法
:white_check_mark: Accessor 使用场景 用于非周期性读写硬件寄存器(如 CPLD/Sensor 控制)
:white_check_mark: 写操作方式 不要仅靠设 Value,应调用 Write() 方法
:white_check_mark: 属性引用方式 使用 reference: "#/Accessor_xxx.Value" 实现绑定
:white_check_mark: 配置一致性 确保 AccessorChip, Offset, Mask 与硬件文档一致
:white_check_mark: 调试手段 使用 busctl call ... Write 手动测试寄存器可写性
:white_check_mark: 文档参考 详见 CSR配置字典之Accessor类

:receipt: 五、补充:为什么直接赋值会报 invalid interface

根据知识库分析:

Accessor 是一种受控接口,其行为由 hwproxy 服务管理。只有当:

  1. 存在合法的 Accessor 对象;
  2. 属性通过 reference 显式关联;
  3. hwproxy 正常提供 D-Bus 接口;

系统才会将该属性识别为 bmc.kepler.Accessor 类型。否则,视作普通字段,抛出 invalid interface 错误。


:white_check_mark: 结论

您当前的问题核心是:

SetReset 属性未通过正确的 CSR 配置与 Accessor 对象建立绑定关系

请立即执行:

  1. :white_check_mark: 添加 Accessor_ExpanderReset 对象;
  2. :white_check_mark:model.json 中为 SetReset 添加 reference 引用;
  3. :white_check_mark: 确认 Smc_ExpanderSMC 等 Chip 已定义;
  4. :white_check_mark: 构建并部署后,重试设置操作。

完成后,错误 invalid interface:bmc.kepler.Accessor 将消失,硬件写入即可正常生效。

如有具体 SMC 地址或 .sr 配置片段,可进一步协助验证配置准确性。

111

不对,csr是正常配置的

"required": [
    {
        "path": "*",
        "interface": "bmc.kepler.Accessor",
        "properties": {}
    },

在定义这个后是否有执行bingo gen自动生成了代码,或者是否对自动生成的代码结果误删除了

自动生成了

你是通过SetReset设置Accessor的是吧,能看你csr是怎么配置的吗

找到问题了,在app文件中我没有require client文件 :rofl:

local client = require ‘xx_general_hardware.client’