[深入理解linux内核]-Linux帧缓冲设备驱动

系列 内容
深入理解linux内核 Linux帧缓冲设备驱动

环境:

平台 内核版本 安卓版本
RK3399 Linux4.4 Android7.1

1、Linux framebuffer 介绍

framebuffer 是用户界面支持系统和显示系统硬件部分的桥梁
在这里插入图片描述

2、Framebuffer 关键数据结构

在这里插入图片描述

2.1、fb_info

fb_infoframebuffer 中基础结构体。
文件位置:include\linx\fb.h

重要成员 内容
.node framebuffer 架构中,有一个 struct fb_info *registered_fb[32];表示它最多支持
32framebuffer 设备,node 表示是数组中的第几个成员,数组ID0开始。
.screen_bas 屏幕起始虚拟地址,在注册前通过 DMA 方式分配得到
.screen_size 屏幕buf大小,表示xresyresbpp的大小,并且是系统所支持所有显示模式中,
.var: 屏幕可变参数
.fix 屏幕固定参数
.monspecs 监视器相关参数说明
.pixmap 图像硬件映射
.sprite 光标硬件映射
.cmap 颜色表
.modelist 显示模式列表,一个fb驱动支持多个设备,各个设备显示相关的参数不一样,所以需要一个列表来维护
.mode 当前显示模式

在这里插入图片描述
struct fb_var_screeninfo
在这里插入图片描述

重要成员 内容
.xres 一行有多少个点, 如图 xres 表示
.yres 一列有多少个点,如图 yres表示
.bits_per_pixel bpp,每个像素点用多少位表示
.red 红色所占的长度及偏移
.green 绿色所占的长度及偏移
.blue 蓝色所占的长度及偏移
.nonstd 像素点是否是标准格式, 0 表示标准格式,非 0 表示不是标准格式
.pixclock 像素时钟,读取(单位?位/字节/字)所花的时间
.lef_margin 行切换,从同步到绘图之间的延迟
.right_margin 行切换,从绘图到同步之间的延迟
.upper_margin 帧切换,从同步到绘图之间的延迟
.lower_margin 帧切换,从绘图到同步之间的延迟
.hsync_len 水平同步长度
.vsync_len 垂直同步长度

struct fb_fix_screeninfo

重要成员 内容
id[16] 字符串形式的标识符
.smem_start fb 缓存开始位置,物理地址
.smem_len fb 缓存的长度
.type type 可取如下值: FB_TYPE_PACKED_PIXELSFB_TYPE_PACKED_PIXELSFB_TYPE_INTERLEAVED_PLANESFB_TYPE_TEXTFB_TYPE_VGA_PLANES
.type_aux 硬件显示点的方式
.visual 色彩模式,很多种
.xpanstep 硬件平移,无硬件平移值为 0
.ypanstep 硬件平移,无硬件平移值为 0
.ywrapstep
.line_length 一行多少个字节
.mmio_start 内存映射I/O开始位置,物理地址
.mmio_len 内存映射I/O 长度
.accel: 特定的芯片

2.2、fb_ops

功能:实现 Framebuffer 操作。
定义:include\linux\fb.h

3、Framebuffer内部函数分析

  • framebuffer_alloc()函数分析:

调用者:platform_driver->probe,例如 vfb_probe()
定义:drivers\video\fbsysfb.c
原型:include\linux\fb.h
extern struct fb_info *framebuffer_alloc(size_t size, struct device *dev);
参数:

参数名 内容
size 驱动私有数据的大小,可以是 0;
dev 设备结构指针,可以是 NULL

该函数分配 fb_info 结构体和设备私有数据。如果存在设备私有数据,分配空间时,会保证 fb_info 和用户私有数据的起点差距是 4 字节的整数倍——Fb_info+PADDING+设备私有数据。

设备私有数据的指针是 fb_info->par
info->device = dev;
device 结构体定义于include\linux\device.h
kzalloc 是分配空间并把分配的空间都设为零。
GFP_KERNEL 的作用:分配空间的方式是一个在内核空间运行的进程的方式。
当内核可分配的 memory 不足时,内核会使 GFP_KERNEL 的使用者睡眠

  • fb_alloc_cmap() 函数分析
  • register_framebuffer() 函数分析
  • device_create() 函数分析
  • fb_get_options () 函数分析
  • video_setup () 函数分析

4、vfb分析

  • vfb_init() 函数分析
  • vfb_probe() 函数分析
  • vfb_setup() 函数分析
发布了252 篇原创文章 · 获赞 93 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/qq_33487044/article/details/104088470