FrameBuffer设备

帧缓冲设备的应用开发通常是对/dev/fbX这个帧缓冲设备文件进行I/O操作,在注册帧缓存设备时,会在内核中开辟一个缓冲区,可以把它看成指向显存的指针,通过修改这个缓冲区的内存,内核会同步更改显存,进而改变帧缓冲设备实际显示的内容

个人感觉这一章介绍的对于Framebuffer设备的应用开发API过于底层,实际开发应该不会用如此底层的API来开发,而是用Qt或者LVGL那样的框架进行开发,所以==这章学习的意义不是很大==

1.基本步骤

对帧缓冲设备的应用开发主要包括以下几步:

  • 1.打开/dev/fbX这个设备文件
  • 2.通过ioctl()系统调用获得帧缓冲设备的一些重要信息:如屏幕的分辨率大小、像素格式,根据屏幕参数计算显示缓冲区的大小
  • 3.通过存储映射 I/O 方式将屏幕的显示缓冲区映射到用户空间(mmap),之后就能像操作数组一样操作显存
  • 4.映射成功后就可以直接读写屏幕的显示缓冲区,进行绘图或图片显示等操作了
  • 5.完成显示后,调用 munmap()取消映射、并调用 close()关闭设备文件

2.使用ioctl获取屏幕信息

众所周知,在使用ioctrl()系统调用的时候,需要输入一些指令,以此来进行不同的IO操作,而Framebuffer子系统也向我们提供了一些指令,来让我们获取Framebuffer设备不同的信息。对 于 Framebuffer 设 备 来 说 , 常 用 的 request 包 括FBIOGET_VSCREENINFOFBIOPUT_VSCREENINFOFBIOGET_FSCREENINFO

  • FBIOGET_VSCREENINFO:表示获取 FrameBuffer 设备的可变参数信息

  • FBIOPUT_VSCREENINFO:表示设置 FrameBuffer 设备的可变参数信息

  • FBIOGET_FSCREENINFO:表示获取 FrameBuffer 设备的固定参数信息

3.内存映射

常见的内存映射函数有2个,他们的使用场合有所区别:

1.ioremap():这个内存映射函数主要用在驱动层,可以将寄存器的物理地址转换为内核进程空间的虚拟地址

2.mmap():这个内存映射函数主要用在应用层,可以将内核中的虚拟地址转为当前进程的虚拟地址