framebuffer驱动详解1——应用层编程实践

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。

一、步骤总结

步骤1:打开设备文件

步骤2:获取设备信息 

步骤3:mmap函数做映射

步骤4:填充framebuffer

 

二、步骤分析

1、打开设备文件

设备文件为/dev/fb0。

2、获取设备信息

应用层通过使用ioctl函数,配合相关的命令码,来获取想要的设备信息。

比如 ret = ioctl(fd, FBIOGET_FSCREENINFO, &finfo);

比如 ret = ioctl(fd, FBIOPUT_VSCREENINFO, &vinfo);

(1)LCD的硬件信息

相关硬件信息定义在x210_kernel\include\linux\fb.h文件中。

(2)struct fb_fix_screeninfo结构体

该结构体用来表示LCD的那些不可修改的属性,比如物理分辨率等等。

struct fb_fix_screeninfo {char id[16];			/* identification string eg "TT Builtin" */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   *//* (physical address) */__u32 mmio_len;			/* Length of Memory Mapped I/O  */__u32 accel;			/* Indicate to driver which	*//*  specific chip/card we have	*/__u16 reserved[3];		/* Reserved for future compatibility */
};

在应用层使用ioctl函数来获取LCD设备那些不可修改的属性信息时,所使用的命令码是FBIOGET_FSCREENINFO。因为这些属性信息是不可修改的,所以不可能存在表示修改这些属性信息的命令码FBIOPUT__FSCREENINFO。

(3)struct fb_var_screeninfo 结构体

该结构体用来表示LCD的那些可以修改的属性,比如屏幕的分辨率等等。

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 */__u32 yoffset;			/* resolution			*/__u32 bits_per_pixel;		/* guess what			*/__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;			/* height of picture in mm    */__u32 width;			/* width of picture in mm     */__u32 accel_flags;		/* (OBSOLETE) see fb_info.flags *//* 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 rotate;			/* angle we rotate counter clockwise */__u32 reserved[5];		/* Reserved for future compatibility */
};

在应用层使用ioctl函数来获取LCD设备那些可以修改的属性信息时,所使用的命令码是FBIOGET_VSCREENINFO。因为这些属性信息可以修改,所以存在表示对这些属性信息进行修改的命令码FBIOPUT__VSCREENINFO。

3、mmap函数做映射

在linux系统中,使用“ man 2 mmap ”得知mmap函数的原型与用法。

函数原型

void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);

参数说明

  • 第一个参数表示映射到哪个物理地址,写NULL表示自动分配;
  • 第二个参数表示被映射的内存的大小;
  • 第三个参数表示权限;
  • 第四个参数表示当前的映射结果能否被多个进程共享;
  • 第五个参数表示文件节点;
  • 第六个参数表示偏移量。
  • 返回值表示映射结果的内存的开始地址

补充说明

需要包含头文件:#include <sys/mman.h>

可以利用该函数把内核中那段作为显示缓冲区的内存,映射到当前进程的用户空间。做完了mmap后,fb在当前进程中就绪,随时可以去读写LCD显示器。

4、填充framebuff的例子

例子1:刷背景

使用四个字节表示一个像素,即(0x)xx xx xx xx后三者表示RGB,前一表示透明度?

使用draw_back()函数来实现,参数为屏幕的长度、宽度、颜色。

void draw_back(unsigned int width, unsigned int height, unsigned int color)
{unsigned int x, y;for (y=0; y<height; y++){for (x=0; x<width; x++){*(pfb + y * WIDTH + x) = color;}}
}

例子2:写字、画线、图片显示等

见博客:s5pv210——LCD的原理和实战_天糊土的博客-CSDN博客

三、代码与测试

(1)代码

#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 FBDEVICE	"/dev/fb0"// 旧开发板
//#define WIDTH		800	
//#define HEIGHT		480
// 新开发板
#define WIDTH		1024	
#define HEIGHT		600#define WHITE		0xffffffff			// test ok
#define BLACK		0x00000000
#define RED			0xffff0000
#define BLUE		0xff0000ff	
#define GREEN		0xff00ff00			// test ok
#define GREENP		0x0000ff00			// 一样,说明前2个ff透明位不起作用// 函数声明
void draw_back(unsigned int width, unsigned int height, unsigned int color);
void draw_line(unsigned int color);// 全局变量
unsigned int *pfb = NULL;int main(void)
{int fd = -1, ret = -1;struct fb_fix_screeninfo finfo = {0};struct fb_var_screeninfo vinfo = {0};// 第1步:打开设备fd = open(FBDEVICE, O_RDWR);if (fd < 0){perror("open");return -1;}printf("open %s success.\n", FBDEVICE);// 第2步:获取设备的硬件信息ret = ioctl(fd, FBIOGET_FSCREENINFO, &finfo);if (ret < 0){perror("ioctl");return -1;}printf("smem_start = 0x%x, smem_len = %u.\n", \finfo.smem_start, finfo.smem_len);ret = ioctl(fd, FBIOGET_VSCREENINFO, &vinfo);if (ret < 0){perror("ioctl");return -1;}printf("xres = %u, yres = %u.\n", vinfo.xres, vinfo.yres);printf("xres_virtual = %u, yres_virtual = %u.\n",\vinfo.xres_virtual, vinfo.yres_virtual);printf("bpp = %u.\n", vinfo.bits_per_pixel);// 修改驱动中屏幕的分辨率vinfo.xres = 1024;vinfo.yres = 600;vinfo.xres_virtual = 1024;vinfo.yres_virtual = 1200;ret = ioctl(fd, FBIOPUT_VSCREENINFO, &vinfo);if (ret < 0){perror("ioctl");return -1;}// 再次读出来检验一下ret = ioctl(fd, FBIOGET_VSCREENINFO, &vinfo);if (ret < 0){perror("ioctl");return -1;}printf("修改过之后的参数:\n");printf("xres = %u, yres = %u.\n", vinfo.xres, vinfo.yres);printf("xres_virtual = %u, yres_virtual = %u.\n", \vinfo.xres_virtual, vinfo.yres_virtual);printf("bpp = %u.\n", vinfo.bits_per_pixel);// 第3步:进行mmapunsigned long len = vinfo.xres_virtual * vinfo.yres_virtual *\vinfo.bits_per_pixel / 8;printf("len = %ld\n", len);pfb = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);if (NULL == pfb){perror("mmap");return -1;}printf("pfb = %p.\n", pfb);//第4步,填充framebuffdraw_back(WIDTH, HEIGHT, WHITE);//背景draw_line(RED);//线条close(fd);return 0;
}void draw_back(unsigned int width, unsigned int height, unsigned int color)
{unsigned int x, y;for (y=0; y<height; y++){for (x=0; x<width; x++){*(pfb + y * WIDTH + x) = color;}}
}void draw_line(unsigned int color)
{unsigned int x, y;for (x=50; x<600; x++){*(pfb + 200 * WIDTH + x) = color;}
}

(2)测试

将上面的代码文件命名为app.c,然后使用命令“ arm-linux-gcc app.c -o app ”进行编译,接着在开发板系统上运行“./app.c”。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461183.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(转)API SOCKET基础(一) TCP建立连接并通信

写这篇日志&#xff0c;并不是要记录令人眼前一亮的算法&#xff0c;只是为了本人健忘的脑袋做一点准备。 要进行网络通信编程&#xff0c;就要用到socket&#xff08;套接字&#xff09;&#xff0c;下面以TCP为例展示如何利用socket通信。 要 进行socket编程&#xff0c;首先…

5shift shell

echo offcopy %systemroot%\system32\taskmgr.exe %systemroot%\system32\sethc.execopy %systemroot%\system32\taskmgr.exe %systemroot%\system32\dllcache\sethc.exepause转载于:https://www.cnblogs.com/upshania/p/3817258.html

java 线程转储_获取Java线程转储的常用方法(推荐)

1. 线程转储简介线程转储(Thread Dump)就是JVM中所有线程状态信息的一次快照。线程转储一般使用文本格式, 可以将其保存到文本文件中, 然后人工查看和分析, 或者使用工具/API自动分析。Java中的线程模型, 直接使用了操作系统的线程调度模型, 只进行简单的封装。线程调用栈, 也称…

framebuffer驱动详解2——fb驱动框架分析(核心层)

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、前言 framebuffer驱动框架包括以下两部分&#xff1a; 1、内核开发者实现的部分&#xff08;核心层&#xff09; rootubuntu:省略部分路径/x210_kernel/drivers/video# ls *.o built-in.o …

Oracle conn 协议适配器错误解决

Oracle conn 协议适配器错误 --解决方法C:\Documents and Settings\administrator>set oracle_sidmyoracleC:\Documents and Settings\administrator>sqlplus /nologSQL*Plus: Release 10.2.0.1.0 - Production on 星期三 12月 26 09:47:16 2012Copyright (c) 1982, 2005…

jquery ajax 文本丢失加号和连接号的问题

因为采用data:字符串这种形式&#xff0c;和&是jquery分隔参数的分隔符&#xff0c;所以会丢失&#xff0c;解决方法就是把text文本中的和&替换掉&#xff0c;用js里面的encodeURIComponent编码&#xff0c;为了省事&#xff0c;直接写出编码替换.. function FixJqText…

python给定一个整数n、判断n是否为素数_输入一个大于3的整数n,判断它是否为素数...

#include //让n被i除(i的值从2到n-1)int main(){int n,i;printf("please enter a integer number,n?");scanf("%d",&n);for(i2;i<n-1;i)if(n%i0) break;if(i",n);else printf("%d is a prime number.",n);return 0;}**************…

kernel移植——修改内核的启动logo

以下内容源于朱有鹏嵌入式课程的学习&#xff0c;如有侵权请告知删除。 参考博客 http://blog.csdn.net/ultraman_hs/article/details/54988168 一、自定义内核启动logo 步骤一&#xff1a;安装工具包 在命令行中输入以下内容 sudo apt-get install netpbm 步骤二&#xff1a;…

编译Ngnix遇到的问题,查看程序依赖的库文件

要点:ldd 可以读取每个可以运行的程序依赖的 so 文件。 编译的时候提示需要Openssl库. 查看本机,已经安装了openssl 查看编译报错文件,查找Openssl所依赖的库 more objs/autoconf.err 查看openssl所依赖的库文件 ldd /usr/bin/openssl ldd –u /usr/bin/openssl objdump -x ob…

[JavaWeb修行之路 Day1] 安装、配置、部署Tomcat

一、相关软件下载 Tomcat下载地址&#xff1a;http://tomcat.apache.org 。选择Tomcat 6或者Tomcat 7。Eclipse下载地址&#xff1a;http://www.eclipse.org/downloads/ 。选择Eclipse IDE for Java EE Developers进行下载。当然&#xff0c;也可以使用MyEclipse&#xff0c;收…

springboot创建parent_理解spring-boot-starter-parent

理解spring-boot-starter-parent通过spring initializr&#xff0c;我们可以快速构建一个springboot应用&#xff0c;如果你选择的是Maven来管理项目&#xff0c;在默认的pom文件中有这么一个section&#xff1a;org.springframework.bootspring-boot-starter-parent2.1.1.RELE…

应用层为何不能设置分辨率

以下内容源于朱有鹏《物联网大讲堂》课程的学习&#xff0c;如有侵权&#xff0c;请告知删除。 5、在应用程序中设置分辨率 &#xff08;1&#xff09;可视分辨率&#xff08;即实际分辨率&#xff09;、虚拟分辨率 &#xff08;2&#xff09;实验及结果 vinfo.xres 1024; …

CI框架--加载静态内容

首先&#xff0c;你需要创建一个可以处理静态内容请求的控制器类。控制器&#xff0c;是一个用来代理完成某项任务的PHP类&#xff0c;它充当基于MVC架构应用程序的“粘合剂”&#xff08;译者注&#xff1a;控制器用来粘合/协调不同模型和视图。随着教程的深入&#xff0c;你会…

java se ee me都是什么意思_Java SE、Java EE、Java ME三者的区别

Java SE、Java EE、Java ME三者的区别1. Java SE(Java Platform&#xff0c;Standard Edition)。Java SE 以前称为J2SE。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的 Java 应用程序。Java SE 包含了支持 Java Web服务开发的类&#xff0c;并为 Java Platfor…

Vagrant 快速入门

1. Vagrant功能: Vagrant uses Oracle’s VirtualBox to build configurable, lightweight, and portable virtual machines dynamically.. 【Vagrant 使用Oracle VM VirtualBox 动态创建和配置轻量级的&#xff0c;可重现的&#xff0c;便携的虚拟机环境。】 2. Vagrant下载: …

framebuffer驱动详解3——fb驱动分析(具体操作层)

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 前言 博文fb驱动框架分析&#xff08;核心层&#xff09;已经对内核驱动维护者编写的fb驱动框架进行讲解。 接下来将对具体的fb驱动文件进行分析。这些驱动文件是驱动工程师要完成的部分。 rootubu…

各种分页存储过程 (转)

在项目中&#xff0c;我们经常遇到或用到分页&#xff0c;那么在大数据量&#xff08;百万级以上&#xff09;下&#xff0c;哪种分页算法效率最优呢&#xff1f;我们不妨用事实说话。 测试环境 硬件&#xff1a;CPU 酷睿双核T5750 内存&#xff1a;2G 软件:Windows server 20…

java连接phpstudy_PHPStudy快速自动搞定所有配置文件

phpStudy 是一个 PHP 调试环境的程序集成包。该程序包集成最新的 ApachePHPMySQLphpMyAdminZendOptimizer, 一次性安装 , 无须配置即可使用 , 是非常方便、好用的 PHP 调试环 境 . 该程序不仅包括 PHP 调试环境 , 还包括了开发工具、开发手册等 . 总之学习 PHP 只需一个包 . 对…

ViewBag 找不到编译动态表达式所需的一种或多种类型,是否缺少引用?

症状&#xff1a; 类似上面的警告提示&#xff0c;运行程序不会有任何错误&#xff0c;但若干地方都提示警告&#xff0c;并且明明dll的引用都是正确的。 解决方案&#xff1a; 删除&#xff1a;C:\Users\{your computer name}\AppData\Local\Temp\Temporary ASP.NET Files 该目…

framebuffer驱动详解4——framebuffer驱动分析2(probe函数讲解)

以下内容源于朱有鹏《物联网大讲堂》课程的学习&#xff0c;如有侵权&#xff0c;请告知删除。 主要在填充fbdev这个结构体。 二、framebuffer驱动分析2 1、probe函数分析 &#xff08;1&#xff09;struct s3c_platform_fb 这个结构体是fb的platform_data结构体&#xff1…