• Linux Framebuffer驱动框架、接口实现和使用


    Linux 驱动-Frame Buffer代码分析

    Framebuffer

    在这里插入图片描述
      对于驱动开发人员来说,其实只需要针对具体的硬件平台SOC和具体的LCD(通过焊接连接到该SOC引脚上的LCD)来进行第一部分的寄存器编程(红色部分)。而第二、三、四部分内容(绿色部分)已经被抽象并实现在linux driver源码中了,LCD驱动开发人员只需要理解framebuffer内部的框架和接口使用即可。
    其源代码位于fbmem.c文件
    在这里插入图片描述

    fbmem.c部分代码分析

    初始化

    首先是看驱动的入口函数module_init()

    static int __init
    fbmem_init(void)
    {
    	int ret;
    
    	if (!proc_create_seq("fb", 0, NULL, &proc_fb_seq_ops))
    		return -ENOMEM;
    
    	ret = register_chrdev(FB_MAJOR, "fb", &fb_fops);
    	if (ret) {
    		printk("unable to get major %d for fb devs\n", FB_MAJOR);
    		goto err_chrdev;
    	}
    
    	fb_class = class_create(THIS_MODULE, "graphics");
    	if (IS_ERR(fb_class)) {
    		ret = PTR_ERR(fb_class);
    		pr_warn("Unable to create fb class; errno = %d\n", ret);
    		fb_class = NULL;
    		goto err_class;
    	}
    
    	fb_console_init();
    
    	return 0;
    
    err_class:
    	unregister_chrdev(FB_MAJOR, "fb");
    err_chrdev:
    	remove_proc_entry("fb", NULL);
    	return ret;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 在/proc文件下创建fb目录
      利用proc_create_seq()函数创建
      在这里插入图片描述

    在使用cat命令查看该文件时显示的为
    在这里插入图片描述
    在这里插入图片描述

    • 注册字符设备
      使用注册字符设备的套路,调用register_chrdev()函数
      在这里插入图片描述
      这里的read与write都是对像素点进行操作
    • 创建类
      调用class_create()函数,在这并没有设备绑定在创建的类下,(在有具体的设备驱动注册时,会调用register_framebuffe()函数来创建帧缓冲设备,使之与fbmem关联,并绑定在该类下)
    • 帧缓冲区控制台初始化
      然后调用fb_console_init()函数
    void __init fb_console_init(void)
    {
    	int i;
    
    	console_lock();
    	fb_register_client(&fbcon_event_notifier);
    	fbcon_device = device_create(fb_class, NULL, MKDEV(0, 0), NULL,
    				     "fbcon");
    
    	if (IS_ERR(fbcon_device)) {
    		printk(KERN_WARNING "Unable to create device "
    		       "for fbcon; errno = %ld\n",
    		       PTR_ERR(fbcon_device));
    		fbcon_device = NULL;
    	} else
    		fbcon_init_device();
    
    	for (i = 0; i < MAX_NR_CONSOLES; i++)
    		con2fb_map[i] = -1;
    
    	fbcon_start();
    	console_unlock();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    对于fbcon:参考以下文章
    fbcon的注册和bind:https://blog.csdn.net/tiantao2012/article/details/71514346
    fbcon总结

  • 相关阅读:
    MySQL知识点总结(五)——锁
    什么是邮件签名证书?
    android 布局 横屏 android横屏适配
    你居然还去服务器上捞日志,搭个日志收集系统难道不香吗?
    音视频转换器 Permute 3 for mac中文
    流媒体分析之srt协议ffmpeg 实现
    Linux OpenGrok搭建
    【HDU No. 5057】序列操作 Argestes and Sequence
    【图像处理与机器视觉】图像处理概述与像素
    【FPGA教程案例70】硬件开发板调试10——vivado程序固化详细操作步骤
  • 原文地址:https://blog.csdn.net/weixin_42963900/article/details/134205719