0

原始代码是

#define MAX_FRAMES 10000
#define MS_BETWEEN_FRAMES CONFIG_FB_MSM_LOGO_ANIMATE_FPS

int load_565rle_image(char *filename, bool bf_supported);
struct delayed_work rle_animate_work;

static void load_565rle_animate(struct work_struct *work)
{
    int i, ret = 0, bf_supported = 0;
    char filename [20];
    struct fb_info *info = registered_fb[0];
    set_fs(KERNEL_DS);
    printk(KERN_INFO "Starting kernel boot animation\n");
    for (i = 1; i < MAX_FRAMES; i++) {
        sprintf(filename, "/res/bootlogo/%d.rle", i);
        ret = load_565rle_image(filename, bf_supported);
        sys_unlink(filename);
        if (ret == -ENOENT)
            break;
        info->fbops->fb_open(info, 0);
        info->fbops->fb_pan_display(&info->var, info);
        msleep(MS_BETWEEN_FRAMES);
    }
}

static int __init logo_animate_init(void)
{
    INIT_DELAYED_WORK(&rle_animate_work, load_565rle_animate);
    schedule_delayed_work(&rle_animate_work, 5 * HZ);
    return 0;
}

static void __exit logo_animate_exit(void)
{
    return;
}

这使内核徽标动画化,通过连续加载一系列 *.rle 图像,即 1.rle>2.rle>3.rle>4.rle>5.rle 等等。

它最初的编写方式是在到达图像文件名末尾时停止加载这些图像,即如果最后一个文件名是 5.rle,它会停止并停在那里。基本上我现在要做的是循环,当它到达最后一个文件(5.rle)时,它将再次从头开始加载(1.rle)。

所以我添加了 CONFIG_FB_MSM_LOGO_ANIMATE_LOOP

static void load_565rle_animate(struct work_struct *work)
{
    int i, ret = 0, bf_supported = 0;
    char filename [20];
    struct fb_info *info = registered_fb[0];
    set_fs(KERNEL_DS);
    printk(KERN_INFO "Starting kernel boot animation\n");
    for (i = 1; i < MAX_FRAMES; i++) {
        sprintf(filename, "/res/bootlogo/%d.rle", i);
        ret = load_565rle_image(filename, bf_supported);
        sys_unlink(filename);
        if (ret == -ENOENT)
#ifdef CONFIG_FB_MSM_LOGO_ANIMATE_LOOP
            return ret;
#else
            break;
#endif
        info->fbops->fb_open(info, 0);
        info->fbops->fb_pan_display(&info->var, info);
        msleep(MS_BETWEEN_FRAMES);
    }
}

但是当启用 CONFIG_FB_MSM_LOGO_ANIMATE_LOOP 时,它会在函数返回 void [默认启用] 时给出“警告:返回”的编译错误,这会停止编译过程。有什么想法吗?

4

1 回答 1

0
#ifdef CONFIG_FB_MSM_LOGO_ANIMATE_LOOP
            return ret;
 #else
        break;
 #endif

这是由预处理器预处理的,并导致在int ret定义 CONFIG_FB_MSM_LOGO_ANIMATE_LOOP 时从您的函数返回。所以

'return' 有一个值,在函数返回 void

似乎是相当合理的暗示。

解决方案:更改函数返回类型然后或将其更改为:

#ifdef `CONFIG_FB_MSM_LOGO_ANIMATE_LOOP`
            return;
 #else
        break;
 #endif
于 2013-09-26T01:25:00.017 回答