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

Linux 5.10.X字符驱动使用宏定义设备属性组编译失败求助

背景

我需要为特定硬件包开发一个字符驱动,该驱动需在同一类下包含两个设备。目前暂未关注完整的file_operations结构体,主要遇到sysfs和属性定义相关问题。我在VMware环境开发,驱动必须兼容Linux v5.10.X版本。

已完成工作

目前已在函数外完成驱动初始化,代码如下:

static struct class * dev_class; 
static struct device * some_dev_1;
static struct device * some_dev_2; 
static struct cdev some_cdev_1;
static struct cdev some_cdev_2;
static dev_t dev_num_1 = MKDEV(MAJOR_NUMBER_1, 0); /* Major is 235 */
static dev_t dev_num_2 = MKDEV(MAJOR_NUMBER_2, 0); /* Major is 240 */

我拥有两个对应sysfs的设备及用于用户交互的cdev。在device_bringup函数中,尝试用自定义show/store方法填充attribute_group ** groups结构体。参考相关教程,写出以下代码:

int device_bringup(char * device_1_name, char * device_2_name){
    int return_value = SUCCESS;

    some_dev_1 = device_create(dev_class, NULL, dev_num_1, NULL, device_1_name); /* Create/Registers it on sysfs */
    some_dev_2 = device_create(dev_class, NULL, dev_num_2, NULL, device_2_name);

    if(some_dev_1 == NULL){
        printk(KERN_ALERT KBUILD_MODNAME " Cannot create the Device #1 !\n");
        return_value = init_error_manager(1);
    }

    printk(KERN_ALERT KBUILD_MODNAME " Device #1 was created !\n");

    if(some_dev_2 == NULL){
        printk(KERN_ALERT KBUILD_MODNAME " Cannot create the Device #2 !\n");
        return_value = init_error_manager(2);
    }
    printk(KERN_ALERT KBUILD_MODNAME " Device #2 was created !\n");


    DEVICE_ATTR(first, 0664, sysfs_show, sysfs_store); /* Name should be dev_attr_first */
    DEVICE_ATTR(second, 0664, sysfs_show, sysfs_store); /* Name should be dev_attr_second */

    struct attribute * some_dev_1_attrs[] = {
        &dev_attr_first.attr, 
        &dev_attr_second.attr, 
        NULL
    };

    struct attribute * some_dev_2_attrs[] = { 
        &dev_attr_first.attr, 
        &dev_attr_second.attr, 
        NULL
    };

    ATTRIBUTE_GROUPS(some_dev_1); /* Create the some_dev_1_groups */
    ATTRIBUTE_GROUPS(some_dev_2); /* Create the some_dev_2_groups */
    
    some_dev_1->groups = some_dev_1_groups;
    some_dev_2->groups = some_dev_2_groups;

    return return_value;
}
问题

按教程操作后内核编译失败,出现以下错误:

error: initializer element is not constant ATTRIBUTE_GROUPS(some_dev_1);

error: initializer element is not constant ATTRIBUTE_GROUPS(some_dev_2);

查阅资料后发现问题似乎源于some_dev_1和some_dev_2设备指针未初始化,但参考StackOverflow帖子尝试以下几种初始化方式后问题仍未解决:

static struct device * some_dev_1 = kmalloc(sizeof(some_dev_1));

然后是:

static struct device * some_dev_1 = &(struct device){.name = "test"};

甚至是:

static struct device * some_dev_1 = NULL;

我确信问题不难解决,但目前陷入困境,希望得到帮助。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 02:54:26