frambuffer 节点注册过程

来源:互联网 发布:ugui源码调试 编辑:程序博客网 时间:2024/06/06 20:43

fambuffer 注册相关过程: 

三星平台:

int s3cfb_register_framebuffer(struct s3cfb_global *fbdev)
{
    struct s3c_platform_fb *pdata = to_fb_plat(fbdev->dev);
    int ret, i, j;

    /* on registering framebuffer, framebuffer of default window is registered at first. */
    for (i = pdata->default_win; i < pdata->nr_wins + pdata->default_win; i++) {
        j = i % pdata->nr_wins;//保证默认窗口为地一个注册
        ret = register_framebuffer(fbdev->fb[j]);//注册到 sys/class/graphics/fb0123....
        if (ret) {
            dev_err(fbdev->dev, "failed to register    \
                framebuffer device\n");
            return -EINVAL;
        }

......
    }
    return 0;
}


drivers/video/fbmem.c

static int do_register_framebuffer(struct fb_info *fb_info)
{
    int i;
    struct fb_event event;
    struct fb_videomode mode;

    if (fb_check_foreignness(fb_info))
        return -ENOSYS;

    do_remove_conflicting_framebuffers(fb_info->apertures, fb_info->fix.id,
                     fb_is_primary_device(fb_info));

    if (num_registered_fb == FB_MAX)
        return -ENXIO;

    num_registered_fb++;
    for (i = 0 ; i < FB_MAX; i++)
        if (!registered_fb[i])
            break;

    fb_info->node = i;
    atomic_set(&fb_info->count, 1);
    mutex_init(&fb_info->lock);
    mutex_init(&fb_info->mm_lock);

    fb_info->dev = device_create(fb_class, fb_info->device,
                     MKDEV(FB_MAJOR, i), NULL, "fb%d", i);   //这里最先注册的fb0

    if (IS_ERR(fb_info->dev)) {
        /* Not fatal */
        printk(KERN_WARNING "Unable to create device for framebuffer %d; errno = %ld\n", i, PTR_ERR(fb_info->dev));
        fb_info->dev = NULL;
    } else
        fb_init_device(fb_info);

......

    registered_fb[i] = fb_info;



static int __init
fbmem_init(void)
{
    proc_create("fb", 0, NULL, &fb_proc_fops);

    if (register_chrdev(FB_MAJOR,"fb",&fb_fops))
        printk("unable to get major %d for fb devs\n", FB_MAJOR);

    fb_class = class_create(THIS_MODULE, "graphics");
    if (IS_ERR(fb_class)) {
        printk(KERN_WARNING "Unable to create fb class; errno = %ld\n", PTR_ERR(fb_class));
        fb_class = NULL;
    }
    return 0;
}




原创粉丝点击