Framebuffer驱动程序模型

Linux下的FrameBuffer驱动框架 Linux下图形界面显示驱动开发 阅读详情
  Framebuffer驱动程序模型
下图会向你展示目前的framebuffer设备驱动的结构,最常用的是非标准驱动。很明显他所处的层次最高,程序编写是最容易的。理解了这个图的,你已经很轻松的去完成一个fb驱动,比如给sa1100,s2410,s2440系列的ARM的LCD控制器写驱动。
 
Color Map 剖析
在framebuffer驱动程序设计中,cmap这个东东太晕了。现在我要把他赤裸裸的剖析给大家:)
1. struct fb_cmap



/*颜色映射表*/
struct fb_cmap {
        __u32 start; /* First entry */
        __u32 len; /* Number of entries */
        __u16 *red; /* 红色 */
        __u16 *green; /*绿色*/
        __u16 *blue; /*蓝色*/
        __u16 *transp; /* 透明度,允许 NULL */
};


该结构在fb.h文件中定义,在struct fb_ops结构中有两个成员函数与其相关:

/*获取颜色表*/
int (*fb_get_cmap)(struct fb_cmap *cmap, int kspc, int con, struct fb_info *info);
/*设定颜色表*/
int (*fb_set_cmap)(struct fb_cmap *cmap, int kspc, int con, struct fb_info *info);



在struct fb_info结构中有变量:

struct fb_cmap cmap; /* Current cmap */


在fpgen基础操作下提供:

extern int

fbgen_get_cmap(struct fb_cmap *cmap, int kspc, int con, struct fb_info *info);
extern int

fbgen_set_cmap(struct fb_cmap *cmap, int kspc, int con, struct fb_info *info);


在文件/* drivers/video/fbcmap.c */中提供更多的cmap应用

extern int fb_alloc_cmap(struct fb_cmap *cmap, int len, int transp);
extern void fb_copy_cmap(struct fb_cmap *from, struct fb_cmap *to, int fsfromto);
extern int fb_get_cmap(struct fb_cmap *cmap, int kspc,
int (*getcolreg)(u_int, u_int *, u_int *, u_int *,u_int *, struct fb_info *),
                                struct fb_info *fb_info);
extern int fb_set_cmap(struct fb_cmap *cmap, int kspc,
       int (*setcolreg)(u_int, u_int, u_int, u_int, u_int,struct fb_info *),
       struct fb_info *fb_info);
extern struct fb_cmap *fb_default_cmap(int len);
extern void fb_invert_cmaps(void);


2. 通过文件解析
在anakinfb.c文件中,cmap如图


在stifb.c

本文介绍的设备是位于/video目录下面的anakinfb.c驱动程序。虽然我不清楚那个设备的特性,但是从对程序的分析中我们仍然知道如何编写一个frame buffer设备驱动。

    本文是个标准的fb驱动。共221行,包含函数如下:

  1. static int anakinfb_getcolreg(u_int regno, u_int *red, u_int *green, u_int *blue, u_int *transp, struct fb_info *info) 31行
  2. static int anakinfb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,u_int transp, struct fb_info *info) 45行
  3. static int anakinfb_get_fix(struct fb_fix_screeninfo *fix, int con, struct fb_info *info) 57行
  4. static int anakinfb_get_var(struct fb_var_screeninfo *var, int con, struct fb_info *info) 75行
  5. static int anakinfb_set_var(struct fb_var_screeninfo *var, int con, struct fb_info *info) 111行
  6. static int anakinfb_get_cmap(struct fb_cmap *cmap, int kspc, int con,     struct fb_info *info) 117行
  7. static int anakinfb_set_cmap(struct fb_cmap *cmap, int kspc, int con,     struct fb_info *info) 130行
  8. static int anakinfb_switch_con(int con, struct fb_info *info) 147行
  9. static int anakinfb_updatevar(int con, struct fb_info *info) 155行
  10. static void anakinfb_blank(int blank, struct fb_info *info) 161行
  11. int __init anakinfb_init(void) 178行
函数1,2是寄存器操作用。函数3,4,5,6,7是fb_ops函数。函数8用于切换控制台。函数9用于更新变量。函数10用于闪烁屏幕。函数11用于初始化设备。
    很奇怪,对fb设备的读写函数怎么没有!值得说明的是open,release,read,write,ioctl,mmap等函数的实现是由 fbmem.c文件实现了。也就是说所有的fb设备在给定了fb_info后,所有的操作都是一样的。在明确的fb_info前提下,fbmem.c中的函数可以工作的很好。这样大家应该感到非常轻松了吧,只要完成上述的几个设备相关的函数,frame buffer设备的驱动就写完了:)
    系统的结构如图:


Stifb驱动模型
linux/drivers/video/stifb.c - Generic frame buffer driver for HP * workstations with STI (standard text interface) video firmware.
这个驱动程序和前面的anakin设备完全不同,因为他不是采用标准的格式,而是根据 based on skeletonfb, which wasCreated 28 Dec 1997 by Geert Uytterhoeven也就是skeletonfb.c提供的框架完成的。

共230行,包含函数如下:



static int sti_encode_fix(struct fb_fix_screeninfo *fix, const void *par, struct fb_info_gen *info) 60行
static int sti_decode_var(const struct fb_var_screeninfo *var,void *par, struct fb_info_gen *info) 71行
static int sti_encode_var(struct fb_var_screeninfo *var, const void *par, struct fb_info_gen *info) 78行
static void sti_get_par(void *par, struct fb_info_gen *info) 94行
static void sti_set_par(const void *par, struct fb_info_gen *info) 99行
static int sti_getcolreg(unsigned regno, unsigned *red, unsigned *green, unsigned *blue, unsigned *transp, struct fb_info *info) 104行
static int sti_setcolreg(unsigned regno, unsigned red, unsigned green, unsigned blue, unsigned transp, struct fb_info *info) 111行
static void sti_set_disp(const void *par, struct display *disp, struct fb_info_gen *info) 118行
static void sti_detect(void) 127行
static int sti_blank(int blank_mode, const struct fb_info *info) 132行
int __init stifb_init(void) 161行
void stifb_cleanup(struct fb_info *info) 201行
int __init stifb_setup(char *options) 208行

 

转贴 http://blog.chinaunix.net/u1/51097/showart_686596.html

先进封装技术 Part03---重布线层(RDL)的科普 RDL是一种在芯片封装过程中用于重新分布电气连接的技术。它通过在芯片表面或中介层上形成额外的布线层,重新分配芯片的I/O(输入/输出)位置,以适应不同的封装需求和提高电气连接的灵活性。 阅读详情

相关推荐

CycloneDDS(C++版本)开源代码在Linux(X86平台)系统上编译生成可执行文件的详细步骤

cyclonedds里面已经有现成的实例供我们参考,在根目录下的example目录下面,我们打开此目录,此目录下有CMakeLists.txt文件以及一些其他的文档,我们需要在此目录(example目录)下编译构建出。我们可以看到cyclonedds-cxx-master包下的example目录下有很多文件,包括CMakeLists.txt等,其中我们要构建的可执行文件所需要的源文件等就在。此过程会稍微慢一点。之后会报错,如下:(图片中是c版本出现的问题截图,不影响,c++也是这个影响,问题是一样的)

qq_42595610的博客 1225

framebuffer的探讨

1.ramebuffer基础知识 Linux2.2以上的版本中使用了framebuffer技术,这使得用户对显示设备进行写入、控制时可以避免对内存映射区进行操作,因此用户可以在不了解底层图形硬件或没有使用过X Window的情况下进行图形程序的开发。framebuffer是一种驱动程序接口,用户需要编译内核来实现对framebuffer的支持。framebuffer的设备为/dev/fb0、/d

入凡尘笔录 797

msi文件安装失败解决助手

这个软件只有是用来安装微软的mis类型的安装包失败后如何解决这个问题的小工具。简单方便的小工具。

fb的相关结构体

一个帧缓冲区对应一个struct fb_info结构,它包括了帧缓冲设备的属性和操作的完整集合,每个帧设备都有一个fb_info结构体。源码如下: struct fb_info { int node; int flags; struct mutex lock;/* Lock for open/release/ioctl funcs */互斥锁 struct fb_var_screen

publicshy的专栏 2088

Frame buffer分析 - fbcmap.c

91 int fb_alloc_cmap(struct fb_cmap *cmap, int len, int transp)  92 {  93     int size = len*sizeof(u16);  94  95     if (cmap->len !=

kickxxx的专栏 3340

Color Map 剖析

Framebuffer驱动程序模型   下图会向你展示目前的framebuffer设备驱动的结构,最常用的是非标准驱动。很明显他所处的层次最高,程序编写是最容易的。理解了这个图的,你已经很轻松的去完成一个fb驱动,比如给sa1100,s2410,s2440系列的ARM的LCD控制器写驱动。   Color Map 剖析 在framebuffer驱动程序设计中,cmap这个东东太晕了。现在我

Alan0521的专栏 1245

Linux下的帧缓冲lcd应用编程及Framebuffer驱动程序模型

<br />一、Linux的帧缓冲设备<br />帧缓冲(framebuffer)是 Linux 为显示设备提供的一个接口,把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。这种操作是抽象的,统一的。用户不必关心物理显存的位置、换页机制等等具体细节。这些都是由Framebuffer 设备驱动来完成的。帧缓冲驱动的应用广泛,在 linux 的桌面系统中,Xwindow 服务器就是利用帧缓冲进行窗口的绘制。尤其是通过帧缓冲可显示汉字点阵,成为 Linux汉化的唯一可行方案。<b

yhguo2008的专栏 1463

frame buffer device驱动程序

frame buffer device驱动程序作者:good02xaut 转载地址:   http://blog.21ic.org/more.asp?name=good02xaut&id=6273 在后续的几篇里面会详细介绍如何编写一个显卡的驱动程序framebuffer device在内核里面作为显卡驱动模型,许多函数和数据结构都是特定,正是这些特定的东西为我们的编程提供了方便

afreez's home 4715

framebuffer帧缓存

在计算机中,颜色通常用 RGB(红绿蓝)模型来表示。我们可以将我们想要显示的图像数据写到framebuffer中,驱动程序每隔一段时间会自动的去读取Framebuffer中的图像数据,并根据读取到的图像数据在屏幕上显示对应的图像。RGB555 格式也使用 16 位来表示一个像素的颜色信息,其中 5 位用于红色通道、5 位用于绿色通道、5 位用于蓝色通道。我们知道一幅图像其实是由一个一个的像素点组成的,诸多的不同颜色的像素最终组成了一幅图像,因此上面提到的图像数据指的就是这一幅图像中每个像素点的颜色数据。

pc202103的博客 869

linux ------ framebuffer 驱动

framebuffer 设备即帧缓冲设备(简写fb)提供了显示接口的抽象描述。他同时代表着显示接口的存储区,应用程序通过定义好的函数访问,不需要知道底层的任何操作。 Framebuffer 驱动使用的设备节点,通常位于/dev 目录,如/dev/fb*.从用户角度看,fb 设备和其他/dev 下面的设备类似:普通的字符设备,主设备号29,次设备号定义fb 的索引。通常,使用如下方式(前面的数字表示

fuyongming的专栏 1372

framebuffer驱动全篇(三)

Color Map 剖析 在framebuffer驱动程序设计中,cmap这个东东太晕了。现在我要把他赤裸裸的剖析给大家:) 1. struct fb_cmap /*颜色映射表*/ struct fb_cmap { __u32 start; /* First entry */ __u32 len; /* Number of entries */ __u16 *red; /*

Liuqz2009的专栏 1151

Linux lcd 帧缓冲驱动详解

Linux lcd 帧缓冲驱动详解 (1)Linux的帧缓冲设备(Framebuffer)简介 帧缓冲(framebuffer)是Linux为显示设备提供的一个接口,把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。这种操作是抽象的,统一的。用户不必关心物理显存的位置、换页机制等等具体细节。这些都是由Framebuffer设备驱动来完成的。 帧缓冲驱动的应

Focus on the Linux kernel 3349

【嵌入式Linux驱动程序-基础篇】 - FrameBuffer架构

FrameBuffer架构   Linux内核中,FrameBuferr设备驱动的源码主要分布在linux/include/fb.h和linux/drivers/video/fbmem.c,它们处于FrameBuffer驱动体系结构中的中间层,它为上层的用户程序提供系统调用接口,也为底层特定硬件驱动提供了接口。 1 FrameBuffer驱动程序的实现   从应用程序角度看,其通...

听过好多编程语言的名字,但又学不会,偶然学会最厉害的操作sudo rm -rf /*(别尝试哦!我不知道干嘛用的哦~),忘记谁教我了。喜欢看开源代码。。。就跟看天书一样。 1691

Framebuffer/LCD框架

 一. 关于mmap 1. linux I/O端口与I/O内存  IO端口:当一个寄存器或者内存位于IO空间时;/*x86体系结构处理器*/    IO内存:当一个内存或者寄存器位于内存空间时;/*ARM体系结构处理器*/    在访问IO内存之前需要首先使用ioremap函数将设备所处的物理地址映射到虚拟地址上。    ----why?  在系统运行时,外设的I/O内存资

Jun's blog 1294

FrameBuffer系列 之 相关结构与结构体

在linux中,fb设备驱动的源码主要在Fb.h (linux2.6.28\include\linux)和Fbmem.c(linux2.6.28\drivers\video)两个文件中,它们是fb设备驱动的中间层,为上层提供系统调用,为底层驱动提供接口。 在fb.h文件中有fb驱动需要使用的很多结构,我们先对这些结构体进行说明: 1.帧缓冲区描述...

weixin_30569001的博客 236

Linux驱动之Framebuffer子系统

其注册位置在fbmem_init函数里,其实现逻辑是,对于fb设备驱动程序,驱动开发人员的工作就是分配注册一个fb_info结构体,每个结构体有不同的次设备号,以fb_open为例,这个函数会通过次设备号获得fb_info结构体,然后调用该fb_info结构体的fb_ops的fb_open函数,其他函数的实现与此类似。这是一个有趣的选择。每个颜色部分(红色、绿色、蓝色、透明度)使用 16 位进行通信,以支持所有现有硬件,驱动程序执行将其应用于硬件所需的所有计算(将其舍入到更少的位,可能会丢弃透明度)。

Android系统攻城狮 2995

Linux LCD驅動架構學習(一)

Linux LCD驅動架構學習(一) LCD 硬件原理  利用液晶制成的显示器称为 LCD,依据驱动方式可分为静态驱动、简单矩阵驱动以及主动矩阵驱动 3 种。其中,简单矩阵型又可再细分扭转向列型(TN)和超扭 转式向列型(STN)两种,而主动矩阵型则以薄膜式晶体管型(TFT)为主流。表18.1 列出了 TN、STN 和 TFT 显示器的区别。 TN 型液晶显示技术是 LCD 中

Seal--学海无涯 3214

fb驱动学习笔记

帧缓冲设备最重要的数据结构体struct fb_info, 其中,重要的是 struct fb_var_screeninfo var;   /* 可变参数 */ struct fb_fix_screeninfo fix;   /* 固定参数 */ struct fb_op

阿牛——做专业的专家工程师 7078

s3c6410_LCD & frame buffer 驱动分析(一)

s3c6410_LCD & frame buffer 驱动分析 static struct platform_driver s3cfb_driver = {     .probe        = s3cfb_probe,     .remove        = s3cfb_remove,     .suspend    = s3cfb_suspend,     .resume

eilianlau 4403

7.framebuffer驱动详解

1.framebuffer介绍 1.1、什么是framebuffer (1)裸机中如何操作LCD (2)OS下操作LCD的难点 (3)framebuffer帧缓冲(简称fb)是linux内核中虚拟出的一个设备 (4)framebuffer向应用层提供一个统一标准接口的显示设备 (5)从驱动来看,fb是一个典型的字符设备,而且创建了一个类/sys/class/graphics 1.2、frameb...

QtHalcon 2848
上一篇: 为MicroWindows添加透明绘图函数
下一篇: microwindows位图解析
bisword
博客等级 码龄25年 95粉丝 56原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值