系列 | 内容 |
---|---|
深入理解linux内核 | Linux帧缓冲设备驱动 |
环境:
平台 | 内核版本 | 安卓版本 |
---|---|---|
RK3399 | Linux4.4 | Android7.1 |
1、Linux framebuffer 介绍
framebuffer
是用户界面支持系统和显示系统硬件部分的桥梁
2、Framebuffer 关键数据结构
2.1、fb_info
fb_info
是 framebuffer
中基础结构体。
文件位置:include\linx\fb.h
重要成员 | 内容 |
---|---|
.node |
在 framebuffer 架构中,有一个 struct fb_info *registered_fb[32] ;表示它最多支持 |
32 个 framebuffer 设备,node 表示是数组中的第几个成员,数组ID 从0 开始。 |
|
.screen_bas |
屏幕起始虚拟地址,在注册前通过 DMA 方式分配得到 |
.screen_size |
屏幕buf大小,表示xres yres bpp 的大小,并且是系统所支持所有显示模式中, |
.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_PIXELS 、FB_TYPE_PACKED_PIXELS 、FB_TYPE_INTERLEAVED_PLANES 、FB_TYPE_TEXT 、FB_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()
函数分析