• linux之framebuffer(2)


    1. struct fb_info结构体

    1. struct fb_info {
    2. atomic_t count;
    3. int node; /* 标记所在的数组标号,最大FB_MAX */
    4. int flags;
    5. struct mutex lock; /* Lock for open/release/ioctl funcs */
    6. struct mutex mm_lock; /* Lock for fb_mmap and smem_* fields */
    7. struct fb_var_screeninfo var; /* 可变信息*/
    8. struct fb_fix_screeninfo fix; /*固定信息 */
    9. struct fb_monspecs monspecs; /* Current Monitor specs */
    10. struct work_struct queue; /* 帧缓存事件队列 */
    11. struct fb_pixmap pixmap; /* 图像硬件mapper */
    12. struct fb_pixmap sprite; /* 光标硬件mapper */
    13. struct fb_cmap cmap; /* Current cmap */
    14. struct list_head modelist; /* 模式列表 */
    15. struct fb_videomode *mode; /* 当前模式 */
    16. #ifdef CONFIG_FB_BACKLIGHT
    17. /* assigned backlight device */
    18. /* set before framebuffer registration,
    19. remove after unregister */
    20. struct backlight_device *bl_dev;
    21. /* Backlight level curve */
    22. struct mutex bl_curve_mutex;
    23. u8 bl_curve[FB_BACKLIGHT_LEVELS];
    24. #endif
    25. struct fb_ops *fbops; /* fb设备操作回调 */
    26. struct device *device; /* 父对象 */
    27. struct device *dev; /* 表fb设备 */
    28. int class_flag; /* private sysfs flags */
    29. #ifdef CONFIG_FB_TILEBLITTING
    30. struct fb_tile_ops *tileops; /* Tile Blitting */
    31. #endif
    32. char __iomem *screen_base; /* 虚拟地址 */
    33. unsigned long screen_size; /* ioremap VRAM的数量或0 */
    34. void *pseudo_palette; /* Fake palette of 16 colors */
    35. #define FBINFO_STATE_RUNNING 0
    36. #define FBINFO_STATE_SUSPENDED 1
    37. u32 state; /* Hardware state i.e suspend */
    38. void *fbcon_par; /* fbcon use-only private area */
    39. /* From here on everything is device dependent */
    40. void *par;
    41. /* we need the PCI or similar aperture base/size not
    42. smem_start/size as smem_start may just be an object
    43. allocated inside the aperture so may not actually overlap */
    44. struct apertures_struct {
    45. unsigned int count;
    46. struct aperture {
    47. resource_size_t base;
    48. resource_size_t size;
    49. } ranges[0];
    50. } *apertures;
    51. #ifdef CONFIG_FB_DEFERRED_IO
    52. struct delayed_work deferred_work;
    53. struct fb_deferred_io *fbdefio;
    54. #endif
    55. };

     

    在 drivers/video/fbmem.c中存在一个函数 register_framebuffer(struct fb_info *fb_info);用于向内核注册 fb_info结构体; 在fbmem.c中存在一个全局 struct fb_info指针数组;用于存储注册的fb_info;

    static DEFINE_MUTEX(registration_lock);
    struct fb_info *registered_fb[FB_MAX] __read_mostly;

    2. 调用 register_framebuffer 注册fb_info

    在drivers/video/xxxfb.c中 xxx_probe(struct platform_device *dev) 函数中,当设备与驱动匹配成功时调用,如hitfb.c中

    1. static int __devinit hitfb_probe(struct platform_device *dev)
    2. {
    3. struct fb_info *info;
    4. //分配内存
    5. info = framebuffer_alloc(sizeof(u32) * 16, &dev->dev);
    6. //根据具体填充
    7. info->fbops = &hitfb_ops;
    8. info->var = hitfb_var;
    9. info->fix = hitfb_fix;
    10. info->pseudo_palette = info->par;
    11. info->screen_base = (void *)hitfb_fix.smem_start;
    12. //注册fb_info
    13. ret = register_framebuffer(info);
    14. return 0;
    15. }

    register_framebuffer 又调用 do_register_framebuffer 函数;

     do_register_framebuffer源码如下:

    1. int do_register_framebuffer(struct fb_info *fb_info)
    2. {
    3. int i;
    4. struct fb_event event;
    5. struct fb_videomode mode;
    6. //标记注册fb的数量
    7. if (num_registered_fb == FB_MAX)
    8. return -ENXIO;
    9. num_registered_fb++;
    10. //检查为空的数组,然后将所在位置赋给node;
    11. for (i = 0 ; i < FB_MAX; i++)
    12. if (!registered_fb[i])
    13. break;
    14. fb_info->node = i;
    15. //初始化计数,锁
    16. atomic_set(&fb_info->count,1);
    17. mutex_init(&fb_info->lock);
    18. mutex_init(&fb_info->mm_lock);
    19. //fb_info->dev为当前fb设备,fb_info->device为父对象,fb_class在fbmem_init中已经创建,
    20. //且通过register_chrdev向内核注册了,那么该函数调用后就会在/dev下创建设备节点;
    21. //若有多个注册,那么会根据i值增加,如fb0,fb1等;
    22. fb_info->dev = device_create(fb_class,fb_info->device,MKDEV(FB_MAJOR,i),NULL,"fb%d",i);
    23. //初始化 fb_info->dev
    24. fb_init_device(fb_info);
    25. //填充fb_info->pixmap
    26. if (fb_info->pixmap.addr == NULL) {
    27. //addr:指向的内存 若为空,分配
    28. fb_info->pixmap.addr = kmalloc(FBPIXMAPSIZE, GFP_KERNEL);
    29. if (fb_info->pixmap.addr) {
    30. fb_info->pixmap.size = FBPIXMAPSIZE;//缓冲区大小(byte)
    31. fb_info->pixmap.buf_align = 1;//每个位图的字节对齐
    32. fb_info->pixmap.scan_align = 1;//每个扫描线对齐
    33. fb_info->pixmap.access_align = 32;//每个读或写对齐(bits);
    34. fb_info->pixmap.flags = FB_PIXMAP_DEFAULT;//标志
    35. }
    36. }
    37. fb_info->pixmap.offset = 0;//当前在缓冲区的偏移量
    38. if (!fb_info->pixmap.blit_x) //支持的位块尺寸
    39. fb_info->pixmap.blit_x = ~(u32)0;
    40. if (!fb_info->pixmap.blit_y)
    41. fb_info->pixmap.blit_y = ~(u32)0;
    42. //若模式链表前后其中之一为空,初始化
    43. if (!fb_info->modelist.prev || !fb_info->modelist.next)
    44. INIT_LIST_HEAD(&fb_info->modelist);
    45. //通过fb可变信息内容填充mode,如消隐区,前后上下margin,行/垂直同步长度等;
    46. fb_var_to_videomode(&mode, &fb_info->var);
    47. //若modelist中没有,则将mode通过modelist连接起来
    48. fb_add_videomode(&mode, &fb_info->modelist);
    49. //赋值给全局指针数组
    50. registered_fb[i] = fb_info;
    51. //向客户端通知fb_info注册事件
    52. event.info = fb_info;
    53. fb_notifier_call_chain(FB_EVENT_FB_REGISTERED, &event);
    54. return 0;
    55. }

  • 相关阅读:
    Jmeter脚本参数化和正则匹配
    centos7系统安装kafka
    某堡垒机SQL注入漏洞
    Redis未授权访问漏洞实验
    【单片机毕业设计】【mcuclub-jj-050】基于单片机的门禁的设计
    单元测试与自测
    数商云SCM供应链协同系统:招标功能亮点|构建数字化采购体系降低汽车零部件成本
    Bean实例化的三级缓存
    计算机复习
    【JVM】垃圾回收(GC)详解
  • 原文地址:https://blog.csdn.net/qq_39048131/article/details/127043282