为什么说fb_info->node 是设备的次设备号

本文详细介绍了Linux系统中帧缓冲设备注册的过程。包括struct fb_info结构体各成员的作用,如设备次设备号的自动分配机制及其与registered_fb数组的关系;通过register_framebuffer函数注册framebuffer设备的具体步骤;以及如何在类下创建设备。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >




struct fb_info
{
    int node;  //设备的次设备号

    int flags;
    struct mutex lock;
    struct mutex mm_lock;

    struct fb_var_screeninfo var; //可变参数
    struct fb_fix_screeninfo fix; //固定参数
    ......
};

成员 : 
        int node; 设备的次设备号

        次设备号由系统自动分配,递增的。实际上就是registered_fb[]中第一个空缺项的索引值。
        #define FB_MAX 32
        struct fb_info *registered_fb[FB_MAX]
        所以,最大不会超过31 

        /*
            向核心层注册一个framebuffer设备。
            fb_info 每一个帧缓冲设备都对应一个fb_info
        */
        int register_framebuffer(struct fb_info *fb_info)
        {
            int i; 
            /*
                这个i,就是次设备号,
                下面的代码会将registered_fb[]中第一个空缺项的索引值 赋值给这个i,
                而这个索引值就是设备的次设备号
            */
            ...
            /**
                FB_MAX : 32
                每注册一个framebuffer设备,num_registered_fb就递增一次。
            */
            if (num_registered_fb == FB_MAX)
            {
                return -ENXIO;
            }
            ....

            /**
                递增
            */
            num_registered_fb++;

            /**
                找到registered_fb[]中第一个空缺项
                为把fb_info放进去做准备
                struct fb_info *registered_fb[32];
                /dev/fb0 /dev/fb1 ..... /dev/fb31。
            */
            for (i = 0 ; i < FB_MAX; i++)
            {
                if (!registered_fb[i])
                {
                    break;
                }
            }
            /*
                【将次设备号赋值给node】
            */
            fb_info->node = i;  

            ....
            /**
                在类下创建设备。

                在fbmem_init()中创建的类。
                static int __init fbmem_init(void)
                {
                    ...
                    fb_class = class_create(THIS_MODULE, "graphics");
                    ...
                }
                看这里的 MKDEV(FB_MAJOR, i)
            */
            fb_info->dev = device_create(fb_class, fb_info->device,MKDEV(FB_MAJOR, i), NULL, "fb%d", i);
            if (IS_ERR(fb_info->dev))
            {
                ... 
            }
            .....
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值