前言
前段时间由于笔记本没有保管好,LCD显示屏压碎了。于是,将笔记本电脑拆开查看LCD型号。在淘宝上下单买了块新的,给老伙计重新装上了。又给笔记本重新装了系统,这个过程甚是艰辛。本来是想装WIN10 X64系统的,制作好U盘启动后程序卡在了win10的启动界面。本来以为可能是内存不够,在网上下单又购买了4G内存条给笔记本换上。装好内存条后,笔记本的运行速度确实有所提升。但是,安装win10 仍然是同样的情况。看来是CPU的性能不够,打算升级CPU。在网上查阅了很多关于升级CPU的帖子,最终结论是主板南桥芯片H55限制了CPU只能选择一代CPU。一代CPU都是双核四线程的,对性能提升应该不是很大。基于此,重新安装回win 7 x64旗舰版。装软件的时候发现,win7 跟 XP一样很多软件都不适用了。而且,还有大量的补丁。最终,选择了给它装上ubuntu 22.04。于是有了本文的硬件基础,本文就是在这台x86_64 ubuntu22.04上做的实验。
一、framebuffer简介
framebuffer是对LCD显示屏的硬件抽象,通过对framebuffer的操作可以直接显示到LCD上。framebuffer是一个字符设备,它向上为用户层提供统一的访问接口,向下屏蔽底层各类硬件显示设备的差异,提高framebuffer设备应用程序的兼容性和可移植性。
framebuffer是一个标准的字符设备,主设备号为29。linux系统最大支持32个framebuffer设备,次设备号一般从0开始,依次为0到31。与其它设备一样,设备节点位于/dev目录下面,一般命名为fbx。例如,/dev/fb0。
二、framebuffer接口
对于framebuffer应用程序开发,不需关心底层的具体实现,只需知道具体访问接口、数据结构以及显示设备的一些必要信息,即可开发应用程序。
1.framebuffer设备描述信息
framebuffer设备信息包括两部分,分别是不可更改和可更改信息。设备信息描述数据结构位于“include/uaip/linux/fb.h”中声明。
不可更改信息描述的是显示设备的固有属性、物理内存地址、物理内存大小等等;对于应用层来说,该部分信息可以用来查询显示设备固有属性信息,对于具体应用过程关联性不大。
struct fb_fix_screeninfo{
char id[16]; /* identification string eg “TT Builtin” /
unsigned long smem_start; / Start of frame buffer mem /
/ (physical address) /
__u32 smem_len; / Length of frame buffer mem /
__u32 type; / see FB_TYPE_* /
__u32 type_aux; / Interleave for interleaved Planes /
__u32 visual; / see FB_VISUAL_* /
__u16 xpanstep; / zero if no hardware panning /
__u16 ypanstep; / zero if no hardware panning /
__u16 ywrapstep; / zero if no hardware ywrap /
__u32 line_length; / length of a line in bytes /
unsigned long mmio_start; / Start of Memory M