帧缓冲库

帧缓冲驱动程序严重依赖于四个数据结构。这些结构在 include/linux/fb.h 中声明。它们是 fb_info、fb_var_screeninfo、fb_fix_screeninfo 和 fb_monospecs。最后三个可以与用户空间进行相互访问。

fb_info 定义特定视频卡的当前状态。在 fb_info 内部,存在一个 fb_ops 结构,它是使 fbdev 和 fbcon 工作所需的函数的集合。fb_info 仅对内核可见。

fb_var_screeninfo 用于描述用户定义的视频卡功能。使用 fb_var_screeninfo,可以定义深度和分辨率等内容。

下一个结构是 fb_fix_screeninfo。这定义了在设置模式时创建且不能以其他方式更改的卡的属性。一个很好的例子是帧缓冲内存的起始位置。这会“锁定”帧缓冲内存的地址,使其不能被更改或移动。

最后一个结构是 fb_monospecs。在旧的 API 中,fb_monospecs 几乎没有重要性。这允许诸如在固定频率监视器上设置 800x600 的模式等被禁止的操作。使用新的 API,fb_monospecs 可以防止此类事情,如果使用正确,可以防止监视器被“烧坏”。在内核 2.5.x 之前,fb_monospecs 不会很有用。

帧缓冲内存

int register_framebuffer(struct fb_info *fb_info)

注册一个帧缓冲设备

参数

struct fb_info *fb_info

帧缓冲信息结构

注册一个帧缓冲设备 fb_info

错误时返回负的 errno,成功时返回零。

void unregister_framebuffer(struct fb_info *fb_info)

释放一个帧缓冲设备

参数

struct fb_info *fb_info

帧缓冲信息结构

注销一个帧缓冲设备 fb_info

错误时返回负的 errno,成功时返回零。

此函数还会通知帧缓冲控制台释放该驱动程序。

这意味着在驱动程序的 module_exit() 函数中调用。如果在 module_exit() 之外调用,请确保驱动程序实现 fb_open() 和 fb_release() 以检查是否有进程正在使用该设备。

int devm_register_framebuffer(struct device *dev, struct fb_info *fb_info)

资源托管的帧缓冲设备注册

参数

struct device *dev

帧缓冲所属的设备

struct fb_info *fb_info

帧缓冲信息结构

将帧缓冲设备 fb_info 注册到设备 dev

错误时返回负的 errno,成功时返回零。

void fb_set_suspend(struct fb_info *info, int state)

底层驱动程序发出暂停信号

参数

struct fb_info *info

受影响的帧缓冲

int state

0 = 恢复,!=0 = 暂停

这旨在供底层驱动程序用于向核心和客户端发出暂停/恢复信号。必须在持有控制台信号量的情况下调用它

帧缓冲颜色映射

void fb_dealloc_cmap(struct fb_cmap *cmap)

释放颜色映射

参数

struct fb_cmap *cmap

帧缓冲颜色映射结构

释放先前使用 fb_alloc_cmap() 分配的颜色映射。

int fb_copy_cmap(const struct fb_cmap *from, struct fb_cmap *to)

复制颜色映射

参数

const struct fb_cmap *from

帧缓冲颜色映射结构

struct fb_cmap *to

帧缓冲颜色映射结构

将颜色映射的内容从 from 复制到 to

int fb_set_cmap(struct fb_cmap *cmap, struct fb_info *info)

设置颜色映射

参数

struct fb_cmap *cmap

帧缓冲颜色映射结构

struct fb_info *info

帧缓冲信息结构

为设备info的屏幕设置颜色映射cmap

错误时返回负的errno,成功时返回零。

const struct fb_cmap *fb_default_cmap(int len)

获取默认颜色映射

参数

int len

特定深度的调色板大小

获取特定屏幕深度的默认颜色映射。len是特定屏幕深度的调色板大小。

返回指向帧缓冲区颜色映射结构的指针。

void fb_invert_cmaps(void)

反转所有默认颜色映射

参数

void

无参数

描述

反转所有默认颜色映射。

帧缓冲区视频模式数据库

int fb_try_mode(struct fb_var_screeninfo *var, struct fb_info *info, const struct fb_videomode *mode, unsigned int bpp)

测试视频模式

参数

struct fb_var_screeninfo *var

帧缓冲区用户定义的显示部分

struct fb_info *info

帧缓冲信息结构

const struct fb_videomode *mode

帧缓冲区视频模式结构

unsigned int bpp

每个像素的颜色深度(以位为单位)

尝试一种视频模式,以测试其对设备info的有效性。

成功时返回1。

void fb_delete_videomode(const struct fb_videomode *mode, struct list_head *head)

从模式列表中移除视频模式条目

参数

const struct fb_videomode *mode

要移除的视频模式

struct list_head *head

模式列表的list_head结构

注意

将移除所有匹配的模式条目

int fb_find_mode(struct fb_var_screeninfo *var, struct fb_info *info, const char *mode_option, const struct fb_videomode *db, unsigned int dbsize, const struct fb_videomode *default_mode, unsigned int default_bpp)

查找有效的视频模式

参数

struct fb_var_screeninfo *var

帧缓冲区用户定义的显示部分

struct fb_info *info

帧缓冲信息结构

const char *mode_option

要查找的字符串视频模式

const struct fb_videomode *db

视频模式数据库

unsigned int dbsize

db的大小

const struct fb_videomode *default_mode

回退到的默认视频模式

unsigned int default_bpp

默认颜色深度(以位为单位)

描述

查找合适的视频模式,首先尝试mode_option中指定的模式,如果失败则回退到default_mode。如果default_mode也失败,则会尝试视频模式数据库中的所有模式。

mode_option的有效模式说明符

<xres>x<yres>[M][R][-<bpp>][@<refresh>][i][p][m]

或者

<name>[-<bpp>][@<refresh>]

其中<xres>、<yres>、<bpp>和<refresh>是十进制数字,<name>是字符串。

如果在yres之后(以及如果存在,在刷新率/bpp之前)存在'M',该函数将使用VESA(tm)协调视频定时(CVT)计算时序。 如果'M'之后存在'R',将使用减少的消隐计算(对于平板显示器)。 如果存在'i'或'p',则计算隔行或逐行模式。 如果存在'm',则添加等于xres的1.8%(向下舍入到8像素)和yres的1.8%的边距。字符'i'、'p'和'm'必须在'M'和'R'之后。例子

1024x768MR-8@60m - Reduced blank with margins at 60Hz.

失败返回零,如果使用指定的mode_option返回1,如果使用指定的mode_option但忽略刷新率返回2,如果使用默认模式返回3,如果回退到任何有效模式返回4。

注意

传入的结构体var不会被清除!这允许你为例如灰度和accel_flags字段提供值。

void fb_var_to_videomode(struct fb_videomode *mode, const struct fb_var_screeninfo *var)

将fb_var_screeninfo转换为fb_videomode

参数

struct fb_videomode *mode

指向fb_videomode结构的指针

const struct fb_var_screeninfo *var

指向fb_var_screeninfo结构的指针

void fb_videomode_to_var(struct fb_var_screeninfo *var, const struct fb_videomode *mode)

将fb_videomode转换为fb_var_screeninfo

参数

struct fb_var_screeninfo *var

指向fb_var_screeninfo结构的指针

const struct fb_videomode *mode

指向fb_videomode结构的指针

int fb_mode_is_equal(const struct fb_videomode *mode1, const struct fb_videomode *mode2)

比较两个视频模式

参数

const struct fb_videomode *mode1

第一个视频模式

const struct fb_videomode *mode2

第二个视频模式

返回

如果相等,则为1,否则为0

const struct fb_videomode *fb_find_best_mode(const struct fb_var_screeninfo *var, struct list_head *head)

查找最佳匹配的视频模式

参数

const struct fb_var_screeninfo *var

指向fb_var_screeninfo结构的指针

struct list_head *head

指向模式列表的list_head结构的指针

返回

struct fb_videomode,如果未找到则为NULL

描述

重要提示:此函数假设info->modelist中的所有模式列表条目都有效。

注意

查找具有等于或大于var->xres和var->yres的尺寸的最佳匹配视频模式。 如果找到多个视频模式,则将返回具有最高刷新率的视频模式

const struct fb_videomode *fb_find_nearest_mode(const struct fb_videomode *mode, struct list_head *head)

查找最接近的视频模式

参数

const struct fb_videomode *mode

指向fb_videomode结构的指针

struct list_head *head

指向模式列表的指针

描述

查找最匹配的视频模式,尺寸可以更大或更小。如果找到多个视频模式,将返回刷新率最接近的视频模式。

const struct fb_videomode *fb_match_mode(const struct fb_var_screeninfo *var, struct list_head *head)

查找一个与 var 中时间设置完全匹配的视频模式

参数

const struct fb_var_screeninfo *var

指向fb_var_screeninfo结构的指针

struct list_head *head

指向模式列表的list_head结构的指针

返回

struct fb_videomode,如果未找到则为NULL

int fb_add_videomode(const struct fb_videomode *mode, struct list_head *head)

将视频模式条目添加到模式列表

参数

const struct fb_videomode *mode

要添加的视频模式

struct list_head *head

模式列表的list_head结构

注意

只会添加不匹配的模式条目

void fb_destroy_modelist(struct list_head *head)

销毁模式列表

参数

struct list_head *head

模式列表的list_head结构

void fb_videomode_to_modelist(const struct fb_videomode *modedb, int num, struct list_head *head)

将模式数组转换为模式列表

参数

const struct fb_videomode *modedb

fb_videomode 结构体的数组

int num

数组中的条目数

struct list_head *head

模式列表的list_head结构

帧缓冲 Macintosh 视频模式数据库

int mac_vmode_to_var(int vmode, int cmode, struct fb_var_screeninfo *var)

将 vmode/cmode 对转换为 var 结构

参数

int vmode

MacOS 视频模式

int cmode

MacOS 颜色模式

struct fb_var_screeninfo *var

帧缓冲区视频模式结构

将 MacOS vmode/cmode 对转换为帧缓冲视频模式结构。

错误时返回负的 errno,成功时返回零。

int mac_map_monitor_sense(int sense)

将显示器感知转换为 vmode

参数

int sense

Macintosh 显示器感知编号

将 Macintosh 显示器感知编号转换为 MacOS vmode 编号。

返回 MacOS vmode 视频模式编号。

int mac_find_mode(struct fb_var_screeninfo *var, struct fb_info *info, const char *mode_option, unsigned int default_bpp)

查找视频模式

参数

struct fb_var_screeninfo *var

帧缓冲区用户定义的显示部分

struct fb_info *info

帧缓冲信息结构

const char *mode_option

视频模式名称(请参见 mac_modedb[])

unsigned int default_bpp

默认颜色深度(以位为单位)

查找合适的视频模式。尝试设置由 mode_option 指定的模式。如果所需模式的名称以 ‘mac’ 开头,则将使用 Mac 视频模式数据库,否则将回退到标准视频模式数据库。

注意

标记为 __init 的函数只能在以下期间使用

系统启动。

返回来自 fb_find_mode 的错误代码(请参见 fb_find_mode 函数)。

帧缓冲字体

有关更多信息,请参阅文件 lib/fonts/fonts.c。