framebuffer驱动全篇
framebuffer device在内核里面作为显卡驱动模型,许多函数和数据结构都是特定,正是这些特定的东西为我们的编程提供了方便。
要开发frame bufferdevice驱动,你应该阅读Source\Source\Documentation\fb下面的说明文件,三个重要文件00-INDEX,framebuffer.txt,internals.txt,其他文件都是针对具体显卡芯片的说明了。
framebuffer.txt--- frame buffer 设备介绍
internals.txt----frame buffer设备内部快速浏览
modedb.txt----关于视频模式的资料
aty128fb.txt----关于ATI Rage128显卡的frame buffer设备
clgenfb.txt-----关于Cirrus Logic的显卡
matroxfb.txt----关于Matrox的显卡
pvr2fb.txt----关于PowerVR 2的显卡
tgafb.txt----关于TGA(DECChip 21030)显卡
vesafb.txt----关于VESA显卡
1 = /dev/fb1 Second frame buffer
...
31 = /dev/fb31 32nd frame buffer
/dev/fb1current -> fb1
and so on...
你也可以同时有多个显示设备,例如你的主板上出了内置的显卡还有另一独立的
在csh中:
setenv FRAMEBUFFER /dev/fb1
- 也可以获取能够发生变化的信息,例如位深,颜色格式,时序等。如果你改变这些值,
- 你也可以获取或设定部分颜色表。
Modes "default"
X server 将使用前面讨论的,从环境变量$FRAMEBUFFER获取当前帧缓冲设备.
你也可以设定颜色位深,使用Depth关键字,使用Virtual设定虚拟分辨率。这也是
- 然而你也可以通过设定/etc/XF86Config,改变分辨率。这样有很多灵活性,唯一的
通过fbset或xvidtune切换显示模式。
+----------+---------------------------------------------+----------+-------+
| | ^ | | |
| | |upper_margin | | |
| | ? | | |
+----------###############################################----------+-------+
| # ^ # | |
| # | # | |
| # | # | |
| # | # | |
| left # | # right | hsync |
| margin # | xres # margin | len |
|<-------->#<---------------+--------------------------->#<-------->|<----->|
| # | # | |
| # | # | |
| # | # | |
| # |yres # | |
| # | # | |
| # | # | |
| # | # | |
| # | # | |
| # | # | |
| # | # | |
| # | # | |
| # | # | |
| # ? # | |
+----------###############################################----------+-------+
| | ^ | | |
| | |lower_margin | | |
| | ? | | |
+----------+---------------------------------------------+----------+-------+
| | ^ | | |
| | |vsync_len | | |
| | ? | | |
+----------+---------------------------------------------+----------+-------+
< name > DCF HR SH1 SH2 HFL VR SV1 SV2 VFL
- left_margin: time from sync to picture
- right_margin: time from picture to sync
- upper_margin: time from sync to picture
- lower_margin: time from picture to sync
- hsync_len: length of horizontal sync
- vsync_len: length of vertical sync
xfree: in MHz
fb: in picoseconds (ps)
pixclock = 1000000 / DCF
2) horizontal timings:
left_margin = HFL - SH2
right_margin = SH1 - HR
hsync_len = SH2 - SH1
3) vertical timings:
upper_margin = VFL - SV2
lower_margin = SV1 - VR
vsync_len = SV2 - SV1
- The manual pages for XFree86: XF68_FBDev(1), XF86Config(4/5)
- The mighty kernel sources:
o linux/drivers/video/
o linux/include/linux/fb.h
o linux/include/video/
帧缓冲设备中设备无关的常值数据信息。可以通过Ioctl的FBIOGET_FSCREENINFO获取。
- struct fb_var_screeninfo
帧缓冲设备中设备无关的变量数据信息和特定的显示模式。可以通过iotcl的FBIOGET_VSCREENINFO
- struct fb_cmap
设备无关的颜色表信息。你可以通过ioctl的FBIOGETCMAP 和 FBIOPUTCMAP读取或设定。
常规信息,API以及帧缓冲设备的底层信息(主板地址...).
- struct `par'
唯一指定该设备的显示模式的设备相关信息。
- struct display
帧缓冲设备和控制台驱动之间的接口。
--------------------------------------------------------------------------------
*** 常用的帧缓冲 API ***
Monochrome (FB_VISUAL_MONO01 and FB_VISUAL_MONO10)
---------------------------------------------------------------------
--------------------------------
------------------------------------
------------------
\drivers\video目录 fbmem.c,fbgen.c,fbmon.c,fbcmap.c
skeletonfb.c
vesafb.c,sa1100fb.c,sa1100fb.h
include\linux目录 fb.h
![](http://www.hzlitai.com.cn/liyutaiUploadFiles/200658223952734.jpg)
![](http://www.hzlitai.com.cn/liyutaiUploadFiles/20065822430734.jpg)
![](http://www.hzlitai.com.cn/liyutaiUploadFiles/20065822430621.jpg)
![](http://www.hzlitai.com.cn/liyutaiUploadFiles/20065822431371.jpg)
在stifb.c
函数1,2是寄存器操作用。
![](http://www.hzlitai.com.cn/liyutaiUploadFiles/20065822449734.jpg)
linux/drivers/video/stifb.c- Generic frame buffer driver for HP * workstations with STI (standardtext interface) video firmware.
6. staticint sti_getcolreg(unsigned regno, unsigned *red, unsigned *green,unsigned *blue, unsigned *transp, struct fb_info *info) 104行
![](http://www.hzlitai.com.cn/liyutaiUploadFiles/20065822449621.jpg)
![](http://www.hzlitai.com.cn/liyutaiUploadFiles/200658224410371.jpg)
![](http://www.hzlitai.com.cn/liyutaiUploadFiles/200658224410112.jpg)
该部分内容准备略掉,可以自行参考fbcon-cfb*.c文件。
每个console相当于日记本的一页,不同的console可以切换。Console因为是要显示文本,又和字体联系到一起。Console的管理是十分复杂的,远远超过了framebuffer本身。在RH9中,我们可以自己体验一下console和fb的协调问题。
font_6x11.c,font_8x8.c,font_8x16.c
FrameBuffer 驱动相关结构详解
Framebuffer对应的源文件在linux/drivers/video/目录下。总的抽象设备文件为fbcon.c,在这个目录下还有与各种显卡驱动相关的源文件。 //这个文件要好好看看
(一)、分析Framebuffer设备驱动
需要特别提出的是在INTEL平台上,老式的VESA 1.2卡,如CGA/EGA卡,是不能支持Framebuffer的,因为Framebuffer要求显卡支持线性帧缓冲,即CPU可以访问显缓冲中的每一位,但是VESA 1.2 卡只能允许CPU一次访问64K的地址空间。
FrameBuffer设备驱动基于如下两个文件:
1) linux/include/linux/fb.h
2) linux/drivers/video/fbmem.c
下面分析这两个文件。
1、fb.h
几乎主要的结构都是在这个中文件定义的。这些结构包括:
1)fb_var_screeninfo
这个结构描述了显示卡的特性:
NOTE:::: __u32 是表示 unsigned 不带符号的 32 bits 的数据类型,其余类推。这是 Linux 内核中所用到的数据类型,如果是开发用户空间(user-space)的程序,可以根据具体计算机平台的情况,用 unsigned long 等等来代替
struct fb_var_screeninfo
{
__u32 xres; /* visible resolution */ //可视区域
__u32 yres;
__u32 xres_virtual; /* virtual resolution */ //可视区域
__u32 yres_virtual;
__u32 xoffset; /* offset from virtual to visible resolution */ //可视区域的偏移
__u32 yoffset;
__u32 bits_per_pixel; /* guess what */ //每一象素的bit数
__u32 grayscale; /* != 0 Gray levels instead of colors *///等于零就成黑白
struct fb_bitfield red; /* bitfield in fb mem if true color, */真彩的bit机构
struct fb_bitfield green; /* else only length is significant */
struct fb_bitfield blue;
struct fb_bitfield transp; /* transparency */ 透明
__u32 nonstd; /* != 0 Non standard pixel format */ 不是标准格式
__u32 activate; /* see FB_ACTIVATE_* */
__u32 height; /* height of picture in mm */ 内存中的图像高度
__u32 width; /* width of picture in mm */ 内存中的图像宽度
__u32 accel_flags; /* acceleration flags (hints) */ 加速标志
/* Timing: All values in pixclocks, except pixclock (of course) */
时序-_-这些部分就是显示器的显示方法了,可以找相关的资料看看
__u32 pixclock; /* pixel clock in ps (pico seconds) */
__u32 left_margin; /* time from sync to picture */
__u32 right_margin; /* time from picture to sync */
__u32 upper_margin; /* time from sync to picture */
__u32 lower_margin;
__u32 hsync_len; /* length of horizontal sync */ 水平可视区域
__u32 vsync_len; /* length of vertical sync */ 垂直可视区域
__u32 sync; /* see FB_SYNC_* */
__u32 vmode; /* see FB_VMODE_* */
__u32 reserved[6]; /* Reserved for future compatibility */ 备用-以后开发
};
2) fb_fix_screeninfon
这个结构在显卡被设定模式后创建,它描述显示卡的属性,并且系统运行时不能被修改;比如FrameBuffer内存的起始地址。它依赖于被设定的模式,当一个模式被设定后,内存信息由显示卡硬件给出,内存的位置等信息就不可以修改。
struct fb_fix_screeninfo {
char id[16]; /* identification string eg "TT Builtin" */ID
unsigned long smem_start; /* Start of frame buffer mem */ 内存起始
/* (physical address) */ 物理地址
__u32 smem_len; /* Length of frame buffer mem */ 内存大小
__u32 type; /* see FB_TYPE_* */
__u32 type_aux; /* Interleave for interleaved Planes */插入区域?
__u32 visual; /* see FB_VISUAL_* */
__u16 xpanstep; /* zero if no hardware panning */没有硬件设备就为零
__u16 ypanstep; /* zero if no hardware panning */
__u16 ywrapstep; /* zero if no hardware ywrap */
__u32 line_length; /* length of a line in bytes */ 一行的字节表示
unsigned long mmio_start; /* Start of Memory Mapped I/O */内存映射的I/O起始
/* (physical address) */
__u32 mmio_len; /* Length of Memory Mapped I/O */ I/O的大小
__u32 accel; /* Type of acceleration available */ 可用的加速类型
__u16 reserved[3]; /* Reserved for future compatibility */
};
3) fb_cmap
描述设备无关的颜色映射信息。可以通过FBIOGETCMAP 和 FBIOPUTCMAP 对应的ioctl操作设定或获取颜色映射信息.
struct fb_cmap {
__u32 start; /* First entry */ 第一个入口
__u32 len; /* Number of entries */ 入口的数字
__u16 *red; /* Red values */ 红
__u16 *green;
__u16 *blue;
__u16 *transp; /* transparency, can be NULL */ 透明,可以为零
};
4) fb_info
定义当显卡的当前状态;fb_info结构仅在内核中可见,在这个结构中有一个fb_ops指针, 指向驱动设备工作所需的函数集。
struct fb_info {
char modename[40]; /* default video mode */ 默认的视频卡类型
kdev_t node;
int flags;
int open; /* Has this been open already ? */ 被打开过么?
#define FBINFO_FLAG_MODULE 1 /* Low-level driver is a module */
struct fb_var_screeninfo var; /* Current var */ 现在的视频信息
struct fb_fix_screeninfo fix; /* Current fix */ 修正的信息
struct fb_monspecs monspecs; /* Current Monitor specs */ 现在的显示器模式
struct fb_cmap cmap; /* Current cmap */ 当前优先级
struct fb_ops *fbops;
char *screen_base; /* Virtual address */ 物理基址
struct display *disp; /* initial display variable */初始化
struct vc_data *display_fg; /* Console visible on this display */
char fontname[40]; /* default font name */默认的字体
devfs_handle_t devfs_handle; /* Devfs handle for new name */
devfs_handle_t devfs_lhandle; /* Devfs handle for compat. symlink */兼容
int (*changevar)(int); /* tell console var has changed */ 告诉console变量修改了
int (*switch_con)(int, struct fb_info*);
/* tell fb to switch consoles */ 告诉fb选择consoles
int (*updatevar)(int, struct fb_info*);
/* tell fb to update the vars */ 告诉fb更新变量
void (*blank)(int, struct fb_info*); /* tell fb to (un)blank the screen */告诉fb使用黑白模式(或者不黑)
/* arg = 0: unblank */arg=0的时候黑白模式
/* arg > 0: VESA level (arg-1) */ arg>0时候选择VESA模式
void *pseudo_palette; /* Fake palette of 16 colors and
the cursor's color for non
palette mode */ 修正调色板
/* From here on everything is device dependent */ 现在就可以使用了
void *par;
};
5) struct fb_ops
用户应用可以使用ioctl()系统调用来操作设备,这个结构就是用一支持ioctl()的这些操作的。
struct fb_ops {
/* open/release and usage marking */
struct module *owner;
int (*fb_open)(struct fb_info *info, int user);
int (*fb_release)(struct fb_info *info, int user);
/* get non settable parameters */
int (*fb_get_fix)(struct fb_fix_screeninfo *fix, int con,
struct fb_info *info);
/* get settable parameters */
int (*fb_get_var)(struct fb_var_screeninfo *var, int con,
struct fb_info *info);
/* set settable parameters */
int (*fb_set_var)(struct fb_var_screeninfo *var, int con,
struct fb_info *info);
/* get colormap */
int (*fb_get_cmap)(struct fb_cmap *cmap, int kspc, int con,
struct fb_info *info);
/* set colormap */
int (*fb_set_cmap)(struct fb_cmap *cmap, int kspc, int con,
struct fb_info *info);
/* pan display (optional) */
int (*fb_pan_display)(struct fb_var_screeninfo *var, int con,
struct fb_info *info);
/* perform fb specific ioctl (optional) */
int (*fb_ioctl)(struct inode *inode, struct file *file, unsigned int cmd,
unsigned long arg, int con, struct fb_info *info);
/* perform fb specific mmap */
int (*fb_mmap)(struct fb_info *info, struct file *file, struct vm_area_struct *vma);
/* switch to/from raster image mode */
int (*fb_rasterimg)(struct fb_info *info, int start);
};
6) structure map
struct fb_info_gen | struct fb_info | fb_var_screeninfo
| | fb_fix_screeninfo
| | fb_cmap
| | modename[40]
| | fb_ops ---|--->ops on var
| | ... | fb_open
| | | fb_release
| | | fb_ioctl
| | | fb_mmap
| struct fbgen_hwswitch
\-----|-> detect
| encode_fix
| encode_var
| decode_fix
| decode_var
| get_var
| set_var
| getcolreg
| setcolreg
| pan_display
| blank
| set_disp
[编排有点困难,第一行的第一条竖线和下面的第一列竖线对齐,第一行的第二条竖线和下面的第二列竖线对齐就可以了]
这个结构 fbgen_hwswitch抽象了硬件的操作.虽然它不是必需的,但有时候很有用.
framebuffer驱动全篇相关推荐
- Linux驱动框架之framebuffer驱动框架
1.什么是framebuffer? (1)framebuffer帧缓冲(一屏幕数据)(简称fb)是linux内核中虚拟出的一个设备,framebuffer向应用层提供一个统一标准接口的显示设备.帧缓冲 ...
- 三星framebuffer驱动代码分析
一.驱动总体概述 本次的驱动代码是Samsung公司为s5pv210这款SoC编写的framebuffer驱动,对应于s5pv210中的内部外设Display Controller (FIMD)模块. ...
- framebuffer驱动详解4——framebuffer驱动分析2(probe函数讲解)
以下内容源于朱有鹏<物联网大讲堂>课程的学习,如有侵权,请告知删除. 主要在填充fbdev这个结构体. 二.framebuffer驱动分析2 1.probe函数分析 (1)struct s ...
- framebuffer驱动详解3——framebuffer驱动分析(driver和device的配套查找)
以下内容源于朱有鹏嵌入式课程的学习,如有侵权,请告知删除. 一.framebuffer驱动分析1 1.s3cfb.c (1)实现为平台总线,因为使用SoC内部的LCD控制器,属于内部外设,可以借用平台 ...
- framebuffer驱动详解2——framebuffer驱动框架分析
以下内容源于朱有鹏嵌入式课程的学习,如有侵权,请告知删除. 一.framebuffer驱动框架总览 1.驱动框架部分 (1)drivers/video/fbmem.c(主要的文件) 创建graphic ...
- framebuffer驱动
一.驱动总体概述 本次的驱动代码是Samsung公司为s5pv210这款SoC编写的framebuffer驱动,对应于s5pv210中的内部外设Display Controller (FIMD)模块. ...
- Linux Framebuffer驱动剖析之中的一个—软件需求
嵌入式企鹅圈将以本文作为2015年的终结篇,以回应第一篇<Linux字符设备驱动剖析>.嵌入式企鹅圈一直专注于嵌入式Linux和物联网IOT双方面的原创技术分享,稍后会公布嵌入式企鹅圈的2 ...
- linux:framebuffer驱动之ssd1363驱动和fbtft驱动修改
环境:ubuntu18.04虚拟机和imx6q开发平台 目录 前言 1.添加ssd1363驱动到fbtft 2.亮度调节 前言 手里有一块ssd1363芯片的屏幕,查了很多关于framebuffer驱 ...
- Linux Framebuffer驱动剖析之一—软件需求
本系列文章将分析Linux Framebuffer驱动的作用(需求).框架.接口实现和使用.按笔者一直倡导的Linux学习理念-从软件需求的角度去理解Linux,对于Linux各个子系统,我们首先要理 ...
最新文章
- WinSocket简单编程实验
- tcp/ip 协议栈Linux内核源码分析六 路由子系统分析一路由缓存
- HDU4539+状态压缩DP
- qq数据泄露_真良心,腾讯这个app竟然能查账号泄露
- php7 对象转数组,php7中为对象/关联数组进行解构赋值
- 5 html 根据手机转动而转动_手机安装陀螺仪有什么用 手机安装陀螺仪作用介绍【详解】...
- 工程数学(数值分析)第五讲:数据拟合
- word的使用(三)
- 【基础】集成学习 (Ensemble Learning)
- 可用计算机处理的多种信息载体的统称,广西壮族自治区2019-2020学年语文四年级下册第二单元测试卷B卷(6页)-原创力文档...
- android 百度输入法表情,百度输入法安卓8.6版本发布,AI输入法成为最懂你的“斗图神器”...
- 三角形外接圆圆心计算公式
- 2022软考高项-知识点速记更新版(顺口溜)
- 用c语言实现动态优先权调度,实验四使用动态优先权的进程调度算法的模拟..doc...
- r语言绘制精美pcoa图_「R」数据可视化5:PCA和PCoA图
- 10第六章:【01】常用指令-帮助指令
- 错误: 0x80072efe
- SAP SuccessFactors 功能介绍
- 410随身wifi-linux(debian系统)各个频率版释放内存版驱动全面
- springboot之commons-dbutils的使用
热门文章
- 海康大华网络摄像头高起播低延时RTSP网页无插件流媒体专用播放器EasyPlayer-RTSP之GDI和D3D两种视频渲染方式的区别介绍
- 九宫疑难(八数码)求解过程动态演示
- ssm+jsp计算机毕业设计爱心捐赠平台82yxl(程序+LW+源码+远程部署)
- Windows10使用wsl安装Ubuntu学习嵌入式Linux开发。
- 关于短时傅立叶变换的基线的选取以及可靠频率点的关系
- Pytorch中的梯度回传
- Axure:如何在Axure中使用中继器
- Jenkins + Gradle + pgyer + Android自动发布
- Properties
- 3l如何使用_家装时如何对低水压Say No?不难,教你一招让水源滚滚而来