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. xml json protobuf

    本文为原创,转载请注明:http://www.cnblogs.com/gistao/ Background xml,json,protobuf都是格式化手段,喜欢哪个,会用哪个,该用哪个,用哪个? 随 ...

  2. [BZOJ 3209]花神的数论题

    一道简单的数位 dp 题 但是脑子里只有 __builtin_popcountll 了呢(自重) 看完题解后很快就理解了,而且有一种这么简单的题居然没想到做法真是不应该唉~的感觉 用 f[i] 表示 ...

  3. SpringMVC学习系列(7) 之 格式化显示

    在系列(6)中我们介绍了如何验证提交的数据的正确性,当数据验证通过后就会被我们保存起来.保存的数据会用于以后的展示,这才是保存的价值.那么在展示的时候如何按照要求显示?(比如:小数保留一定的位数,日期 ...

  4. iframe 加载完成事件

    <body onload="load()"> <iframe id="iframe" frameborder="0" sc ...

  5. mysql查看bin日志命令

    mysqlbinlog --no-defaults   --base64-output=decode-rows -v  --start-datetime='2016-01-14 16:30:00' - ...

  6. List集合中的对象根据属性排序

    集合类List存放的数据,默认是按照放入时的顺序存放的,比如依次放入A.B.C,则取得时候,则也是A.B.C的顺序,实际场景中,有时我们需要根据自定义的规则对List中的元素进行排序,该如何实现呢?看 ...

  7. Java中的异常-Throwable-Error-Exception-RuntimeExcetpion-throw-throws-try catch

    今天在做一个将String转换为Integer的功能时,发现Integer.parseInte()会抛出异常NumberFormatException. 函数Integer.parseInt(Stri ...

  8. 怎么取消 Windows Server 2012 r2 RDP 限制每个用户只能进行一个会话(转)

    在 Windows Server 2008 / 2008 R2 上,如果希望多个远程用户使用同一个账号同时访问服务器的 Remote Desktop(RDP),只需通过管理工具-远程桌面下的“远程桌面 ...

  9. oracle中的case when then else end 用法

    Case when 的用法,简单Case函数 简单CASE表达式,使用表达式确定返回值. 语法: CASE search_expression WHEN expression1 THEN result ...

  10. PreparedStatement解决sql注入问题

    总结 PreparedStatement解决sql注入问题 :sql中使用?做占位符 2.得到PreparedStatement对象 PreparedStatement pst=conn.prepar ...