LCD framebuffer开发心得

2024-04-07 11:48
文章标签 开发 心得 framebuffer lcd

本文主要是介绍LCD framebuffer开发心得,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


本文转自 http://blogold.chinaunix.net/u2/70445/showart_2098725.html

 


帧缓冲设备属于字符设备,采用了 文件层-驱动层 的接口方式。 Linux 为帧缓冲设备定义的驱动层接口为 struct fb_info 结构。在文件层次上, Linux 为其定义了下面的操作函数: struct file_operations

软件运行流程 :
在文件层次上 , 用户调用 struct file_operations 的函数操作 , struct file_operations 中间接调用 struct fb_ops 的函数来操作硬件 . 当向内核注册 FB 设备的时候 , 也注册了 struct fb_ops 的指针 . 当打开 fb 设备时 , 先调用 fb_drivers[] xxxfb_init() 来初始化设备 ;

1
、开发步骤和框架

涉及的文件: fb.h, fbmem.c, xxxfb.c.
fb.h:
定义了一些结构 , 变量和宏 ;

fbmem.c:
主要实现设备入口和初始化 , struct file_operations;
入口点 :
static struct {
const char *name;
int (*init)(void);
int (*setup)(char*);
} fb_drivers[] __initdata = {

#ifdef CONFIG_FB_YOURCARD
{ "driver_name", xxxfb_init, xxxfb_setup },
#endif
文件操作 :
static struct file_operations fb_fops = {
owner: THIS_MODULE,
read: fb_read,
write: fb_write,
ioctl: fb_ioctl,
mmap: fb_mmap,
open: fb_open,
release: fb_release,
#ifdef HAVE_ARCH_FB_UNMAPPED_AREA
get_unmapped_area: get_fb_unmapped_area,
#endif
};
xxxfb.c:
自己添加的设备驱动文件 , struct fb_info;
实现入口点函数 : xxxfb_init; xxxfb_setup;

static struct fb_ops xxxfb_ops = {
owner: THIS_MODULE,
fb_open: xxxfb_open, /* only if you need it to do something */
fb_release: xxxfb_release, /* only if you need it to do something */
fb_get_fix: fbgen_get_fix,
fb_get_var: fbgen_get_var,
fb_set_var: fbgen_set_var,
fb_get_cmap: fbgen_get_cmap,
fb_set_cmap: fbgen_set_cmap,
fb_pan_display: fbgen_pan_display,
fb_ioctl: xxxfb_ioctl, /* optional */
};


2
、什么是 framebuffer 设备

framebuffer
是一种能够提取图形的硬件设备,是用户进入图形界面很好的接口。有了 framebuffer ,用户的应用程序不需要对底层的驱动的深入了解就能够做出很好的图形。

对于用户而言,它和 /dev 下面的其他设备没有什么区别,用户可以把

framebuffer
看成一块内存,既可以向这块内存中写入数据,也可以从这块内存中读取数据。

第一个被注册的 framebuffer minor 等于 0 ,第二个被注册的 framebuffer minor 等于 1 ,以此类推。

3
framebuffer 内部结构

数据结构: framebuffer 设备很大程度上依靠了下面四个数据结构。这三个结构在 fb.h 中声明。
Struct fb_var_screeninfo
Struct fb_fix_screeninfo
Struct fb_info
第一个结构是用来描述图形卡的特性的。通常是被用户设置的。它包括显示屏幕的分辨率、每个像素的比 特数和一些时序变量。其中变量 xres 定义了屏幕一行所占的像素数, yres 定义了屏幕一列所占的 像素数, bits_per_pixel 定义了每个像素用多少个位来表示。
第二个结构定义了图形卡的硬件特性,是不能改变的,用户选定了哪一个图形卡,那么它的硬件特性也就 定下来了。它包含了屏幕缓冲区的物理地址和长度。
第三个结构是 Linux 为帧缓冲设备定义的驱动层接口。它不仅包含了底层函数,而且还有记录设备状态的 数据。每个帧缓冲设备都与一 fb_info 结构相对应。其中成员变量 modename 为设备名称, fontname 为显示字体, fbops 为指向底层操作的函数的指针。定义了当前图形卡 framebuffer 备的独立状态,一个图形卡可能有两个 framebuffer 在这种情况下,就需要两个 fb_info 结构 。这个结构是唯一在内核空间可见的。

4
、设计自己的 framebuffer 设备驱动

用户首先需要添加下面的代码到 fbmem.c

static struct {
const char *name;
int (*init)(void);
int (*setup)(char*);
} fb_drivers[] __initdata = {

#ifdef CONFIG_FB_YOURCARD
{ "driver_name", xxxfb_init, xxxfb_setup },
#endif

其次在 xxfb.c 中根据自己的需要重新分配显存大小。例如:
#define VIDEOMEMSIZE (1*1024*1024) /* 1 MB */
再次根据自己的硬件设备修改相应的 var 信息。主要修改
xxfb_set_var(struct fb_var_screeninfo *var, int con, struct fb_info *info)
函数。

5
、如何添加 framebuffer 设备驱动

make menuconfig 的时候首先进入 Character devices, 选中里面的 Virtualterminal. 如果希望控制台在液晶上输出,则选中 Support for console on virtual terminal ( 选用了 msh minix shell , 再在 rc 中放入了一条 sh < /dev/ttyS0 ,通过串口输入的键值显示输出就能在 LCD 上显示了。)

退到上一层界面我们就可以看到 Console device 的选项,进入后将光标落在 Framebuffer Support 上,按回车键进入,在里面选择自己所需要的 framebuffer 设备即可。自己所添加的设备驱动的类型(如果在 uclinux 下,应该以 * 选中,而不是 M 选中),在编译的时候就会产生相应的 .o 文件。

Advanced low level 中可以配置 bpp packed pixel support, 然后选中 Selectcompiled-in fonts 即可。
等操作系统运行以后就会在 /dev 下面看到 fb 这个设备。它的 major 应该是 29 ,第一个设备的 minor 应该是 0

这篇关于LCD framebuffer开发心得的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/882525

相关文章

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

PyQt5 GUI 开发的基础知识

《PyQt5GUI开发的基础知识》Qt是一个跨平台的C++图形用户界面开发框架,支持GUI和非GUI程序开发,本文介绍了使用PyQt5进行界面开发的基础知识,包括创建简单窗口、常用控件、窗口属性设... 目录简介第一个PyQt程序最常用的三个功能模块控件QPushButton(按钮)控件QLable(纯文本

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

SpringBoot开发中十大常见陷阱深度解析与避坑指南

《SpringBoot开发中十大常见陷阱深度解析与避坑指南》在SpringBoot的开发过程中,即使是经验丰富的开发者也难免会遇到各种棘手的问题,本文将针对SpringBoot开发中十大常见的“坑... 目录引言一、配置总出错?是不是同时用了.properties和.yml?二、换个位置配置就失效?搞清楚加

Python中对FFmpeg封装开发库FFmpy详解

《Python中对FFmpeg封装开发库FFmpy详解》:本文主要介绍Python中对FFmpeg封装开发库FFmpy,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、FFmpy简介与安装1.1 FFmpy概述1.2 安装方法二、FFmpy核心类与方法2.1 FF

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件