You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为SPI设备分配默认属性组后sysfs文件未生成,是否需额外配置?

SPI设备sysfs属性组赋值不生效的问题

我尝试通过以下方式将自定义属性组分配给SPI设备的默认属性组:

static DEVICE_ATTR_RO(status);
static struct attribute *my_dev_attrs[] = {
    &dev_attr_status.attr,
    NULL
};
ATTRIBUTE_GROUPS(my_dev);

static int probe(struct spi_device *spi) {
    ...
    spi->dev.groups = my_dev_groups;
    ...
}

但/sys/bus/spi/drivers/my_dev/spi2.0路径下并未出现对应文件。

然而,当我通过sysfs_create_group创建属性组时:

int ret;
ret = sysfs_create_group(&spi->dev.kobj, &my_dev_group);
if (ret < 0)
    return ret;

/sys/bus/spi/drivers/my_dev/spi2.0路径下的文件可正常查看和访问。请问第一种方式是否需要额外的配置步骤?


解答

核心原因
SPI设备的sysfs节点是在驱动与设备匹配成功后、probe函数执行前就已经由内核创建完成的。此时在probe里修改spi->dev.groups指针,内核不会重新扫描属性组并生成对应的sysfs文件,所以看不到预期的属性。

第一种方式的正确用法
如果要通过dev.groups的方式绑定属性组,不能在probe里动态修改,而是要在SPI驱动的struct spi_driver结构体中提前指定groups成员。这样内核在创建sysfs节点时,会自动读取这个属性组并生成对应的文件。

修改后的代码示例:

static DEVICE_ATTR_RO(status);
static struct attribute *my_dev_attrs[] = {
    &dev_attr_status.attr,
    NULL
};
ATTRIBUTE_GROUPS(my_dev);

static int probe(struct spi_device *spi) {
    // 这里不需要再修改spi->dev.groups
    ...
}

static struct spi_driver my_dev_driver = {
    .driver = {
        .name = "my_dev",
        .owner = THIS_MODULE,
        .groups = my_dev_groups, // 在此处指定属性组
    },
    .probe = probe,
    // 按需添加remove等其他回调
};
module_spi_driver(my_dev_driver);

补充说明

  • 如果需要根据probe阶段的硬件状态动态生成属性组(比如不同硬件版本有不同属性),那只能使用sysfs_create_group的方式,同时要记得在驱动的remove回调中调用sysfs_remove_group清理对应的sysfs节点,避免资源泄漏。
  • 直接赋值dev.groups仅适用于属性组固定、在驱动初始化阶段就能确定的场景。

内容的提问来源于stack exchange,提问作者Schottky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 15:45:09