为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
相关产品推荐
相关产品推荐

