framebuffer的使用主要包括4个部分:

(1):首先需要打开设备文件 /dev/fb0。

(2):获取设备的信息。包括可变信息和不可变信息,分别使用两个结构体来进行封装,这两个结构体在 <linux/fb.h> 头文件中定义,所以需要先包含这个头文件。

(3):如果有需要可以对可变的参数进行修改。

(4):做mmap映射。我们需要将驱动中给LCD分配的显存空间映射到我们的应用层来,这样才能在应用层对显存进行操作。

(5):填充framebuffer。也就是上面说的操作显存。

数据结构: (include\linux\fb.h)

struct  fb_fix_screeninfo:(不可变信息)

 struct fb_fix_screeninfo {
char id[]; // 标识字符串
unsigned long smem_start; // FB显存的起始地址(物理地址) __u32 smem_len; // FB显存的长度
__u32 type; /* see FB_TYPE_* */
__u32 type_aux;
__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; // 一行的长度(以字节为单位)
unsigned long mmio_start; /* Start of Memory Mapped I/O */
/* (physical address) */
__u32 mmio_len; /* Length of Memory Mapped I/O */
__u32 accel; /* Indicate to driver which */
/* specific chip/card we have */
__u16 reserved[]; /* Reserved for future compatibility */
};

struct  fb_var_screeninfo:(可变信息)

 struct fb_var_screeninfo {
__u32 xres; // LCD的水平像素大小
__u32 yres; // LCD的垂直像素大小
__u32 xres_virtual; // LCD的虚拟水平像素大小
__u32 yres_virtual; // LCD的虚拟垂直像素大小
__u32 xoffset; // 水平像素偏移量
__u32 yoffset; // 垂直像素偏移量 __u32 bits_per_pixel; // 像素深度bpp
__u32 grayscale; /* != 0 Graylevels instead of colors */ struct fb_bitfield red; /* bitfield in fb mem if true color, */
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; // LCD的物理高度 mm
__u32 width; // LCD的物理宽度 mm __u32 accel_flags; /* (OBSOLETE) see fb_info.flags */ __u32 pixclock; // 像素时钟 /* 下面是六个时序参数 */
__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 rotate; /* angle we rotate counter clockwise */
__u32 reserved[]; /* Reserved for future compatibility */
};

相关宏定义: (include\linux\fb.h)

#define FBIOGET_VSCREENINFO 0x4600      // 传给ioctl函数,用来获取可变参数信息,返回的是一个fb_var_screeninfo结构体
#define FBIOPUT_VSCREENINFO 0x4601      // 传给ioctl函数,用来设置可变参数,需要传入一个fb_var_screeninfo结构体,
#define FBIOGET_FSCREENINFO 0x4602      // 传给ioctl函数,用来获取不可变信息,返回的是一个fb_fix_screeninfo结构体

/*************************************************************************************************************/

测试代码:

平台:s5pv210

内核版本:2.6.35.7

/*************************************************************************************************************/

 #include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/ioctl.h>
#include <sys/mman.h> #define FILE "/dev/fb0" // 设备文件 /*计算机颜色16进制表示符*/
#define WHITE 0xFFFFFF //白色
#define RED 0xFF0000 //红色
#define GREEN 0x00FF00 //绿色
#define BLUE 0x0000FF //蓝色
#define YELLOW 0xFFFF00 //黄色
#define BLACK 0x000000 //黑色
#define AQNA 0xAFDFE4 //水色
#define NAVE 0x23238E //海军蓝
#define ORANGE 0xFF7F00 //橙色
#define PURPLE 0x871F78 //紫色
#define Qioke 0x6B4226 //巧克力色 struct fb_fix_screeninfo finfo = {}; // 不可变信息结构体
struct fb_var_screeninfo vinfo = {}; // 可变信息结构体
static volatile unsigned int *pMap = NULL; // 用来指向mmap映射得到的虚拟地址 static inline void lcd_draw_pixel(unsigned int x, unsigned int y, unsigned int color);
static void lcd_draw_background(unsigned int color);
void lcd_draw_lline(const unsigned int x, const unsigned int y, const unsigned int length, // 注意这个函数参数太多了,不应该这样设计,我们应该把这些参数放在一个结构体中,把结构体变量的指针传进来即可,这样效率高
const unsigned int width, const unsigned int color); static void lcd_draw_image(const unsigned char *pData); // pData是一个图片的数据数组: 这里是 1024*600 像素24位真彩色格式的图片,,数组的元素个数: 1024*600*3 我们需要将连续的3个1个字节长度的数据合成一个24位数据 int main(void)
{
int fd = ; /* 打开文件得到文件描述符 */
fd = open(FILE, O_RDWR);
if ( > fd) {
perror("open error");
return -;
}
printf("%s 打开成功\n", FILE); /* 操作文件 */
if (ioctl(fd, FBIOGET_VSCREENINFO, &vinfo)) {
perror("ioctl error");
close(fd);
return -;
} if (ioctl(fd, FBIOGET_FSCREENINFO, &finfo)) {
perror("ioctl error");
close(fd);
return -;
} // 打印信息
printf("不可变信息smem_start = 0x%x\n", finfo.smem_start);
printf("不可变信息smem_len = %ld\n", finfo.smem_len);
printf("可变信息xres = %d, yres = %d\n", vinfo.xres, vinfo.yres);
printf("可变信息xres_virtual = %d, yres_virtual = %d\n", vinfo.xres_virtual, vinfo.yres_virtual);
printf("可变信息xoffset = %d, yoffset = %d\n", vinfo.xoffset, vinfo.yoffset); /* 进行mmap映射 */
pMap = mmap(NULL, finfo.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, );
if (NULL == pMap) {
perror("mmap error");
return -;
} /* 背景填充 */
lcd_draw_background(WHITE); /* 关闭文件 */
close(fd); return ;
} /*填充像素点*/
static inline void lcd_draw_pixel(unsigned int x, unsigned int y, unsigned int color)
{
*(unsigned int *)((unsigned int)pMap + (vinfo.xres*x + y)*) = color;
} /*填充LCD背景*/
static void lcd_draw_background(unsigned int color)
{
unsigned int i = ;
unsigned int j = ; for (i = ; i <= vinfo.yres; ++i)
{
for (j = ; j <= vinfo.xres; ++j)
lcd_draw_pixel(i, j, color);
}
} // 画线函数
void lcd_draw_lline(const unsigned int x, const unsigned int y, const unsigned int length,
const unsigned int width, const unsigned int color)
{
volatile unsigned int i = ;
volatile unsigned int j = ; for (i = x; i < width+x; i++)
{
for (j = y; j < length+y; j++)
{
lcd_draw_pixel(i, j, color);
}
}
} // 24位真彩色图片显示函数
static void lcd_draw_image(const unsigned char *pData)
{
unsigned int i = ;
unsigned int j = ;
unsigned int color = ;
unsigned int p = ; for (i = ; i < vinfo.yres; i++)
{
for (j = ; j < vinfo.xres; j++)
{
color = (pData[p+] << ) | (pData[p+] << ) | (pData[p+] << );
lcd_draw_pixel(i, j, color);
p = p+;
}
}
}

framebuffer应用编程实践的更多相关文章

  1. 高性能javascript学习笔记系列(5) -快速响应的用户界面和编程实践

    参考高性能javascript 理解浏览器UI线程  用于执行javascript和更新用户界面的进程通常被称为浏览器UI线程  UI线程的工作机制可以理解为一个简单的队列系统,队列中的任务按顺序执行 ...

  2. 高性能JavaScript 编程实践

    前言 最近在翻<高性能JavaScript>这本书(2010年版 丁琛译),感觉可能是因为浏览器引擎的改进或是其他原因,书中有些原本能提高性能的代码在最新的浏览器中已经失效.但是有些章节的 ...

  3. Method Swizzling和AOP(面向切面编程)实践

    Method Swizzling和AOP(面向切面编程)实践 参考: http://www.cocoachina.com/ios/20150120/10959.html 上一篇介绍了 Objectiv ...

  4. 编程实践中C语言的一些常见细节

    对于C语言,不同的编译器采用了不同的实现,并且在不同平台上表现也不同.脱离具体环境探讨C的细节行为是没有意义的,以下是我所使用的环境,大部分内容都经过测试,且所有测试结果基于这个环境获得,为简化起见, ...

  5. 第二章 C语言编程实践

    上章回顾 宏定义特点和注意细节 条件编译特点和主要用处 文件包含的路径查询规则 C语言扩展宏定义的用法 第二章 第二章 C语言编程实践 C语言编程实践 预习检查 异或的运算符是什么 宏定义最主要的特点 ...

  6. 试读《JavaScript语言精髓与编程实践》

    有幸看到iteye的活动,有幸读到<JavaScript语言精髓与编程实践_第2版>的试读版本,希望更有幸能完整的读到此书. 说来读这本书的冲动,来得很诡异,写一篇读后感,赢一本书,其实奖 ...

  7. Python GUI编程实践

    看完了<python编程实践>对Python的基本语法有了一定的了解,加上认识到python在图形用户界面和数据库支持方面快捷,遂决定动手实践一番. 因为是刚接触Python,对于基本的数 ...

  8. [Java 并发] Java并发编程实践 思维导图 - 第一章 简单介绍

    阅读<Java并发编程实践>一书后整理的思维导图.

  9. 《编写可维护的JavaScript》之编程实践

    最近读完<编写可维护的JavaScript>,让我受益匪浅,它指明了编码过程中,需要注意的方方面面,在团队协作中特别有用,可维护性是一个非常大的话题,这本书是一个不错的起点. 本书虽短,却 ...

随机推荐

  1. 讨论贴:Sqlserver varbinary 是二进制数据,却是十六进制的表现形式

    首先创建一个数据表 CREATE TABLE [dbo].[log_info]( [id] [,) NOT NULL, [info] [varchar]() NULL, [info1] [varbin ...

  2. LA 3027 合作网络 并查集

    题目链接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show ...

  3. JavaScript 图片的上传前预览(兼容所有浏览器)

    功能描述 通过 JavaScript 实现图片的本地预览(无需上传至服务器),兼容所有浏览器(IE6&IE6+.Chrome.Firefox). 实现要点   ● 对于 Chrome.Fire ...

  4. Nginx 下配置SSL证书的方法

    1.Nginx 配置 ssl 模块 默认 Nginx 是没有 ssl 模块的,而我的 VPS 默认装的是 Nginx 0.7.63 ,顺带把 Nginx 升级到 0.7.64 并且 配置 ssl 模块 ...

  5. Python decode与encode

      字符串在Python内部的表示是unicode编码(8-bit string),因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicod ...

  6. Vue知识点

    1. Vue生命周期图示: 2.插值: 文本:{{ message }}: 纯html:v-html="xxx"; 属性:v-bind:id="xxx"; 使用 ...

  7. shiro 标签

    在使用Shiro标签库前,首先需要在JSP引入shiro标签: <%@ taglib prefix="shiro" uri="http://shiro.apache ...

  8. PHP编译过程中常见错误信息的解决方法

    在CentOS编译PHP5的时候有时会遇到以下的一些错误信息,基本上都可以通过yum安装相应的库来解决.以下是具体的一些解决办法: checking for BZip2 support… yes ch ...

  9. ubuntu14升级到15后遇到的问题

    ubuntu14的unity坏了,于是就找了个镜像升级到15.但是升级完android开发环境出了点问题.. 1:Picked up JAVA_TOOL_OPTIONS: -javaagent:/us ...

  10. DevExpress中GridView上的右键菜单

    1. 先拖一个PopupMenu和BarManage控件,设置PopupMenu的Manager属性为BarManager. 2. 先选中GridView,不是GridControl,在属性窗口中,选 ...