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

