linux驱动开发:用户空间操作LCD显示简单的图片【转】
转自:http://blog.csdn.net/changliang7731/article/details/53074616
上一章我们简单介绍了LCD的一些基本原理。当然更深奥的还有,比如gamma,dither,HUE,satuation.OSD等等.
我们知道我们是用framebuffer来实现显示的.
显存:framebuffer.由DDRAM中划去一部分内存供显存使用.
从而操作lcd相当于操作显存.
lcd控制器(s5pv210里面有lcd控制器)会周期的获取framebuffer中的数据。经过处理丢给 显示屏的lcd 驱动器
lcd驱动器分析,解码,将数据显示到lcd上.
lcd驱动开发的工作:
配置lcd 控制器,让lcd 控制器周期性的读取显存中的数据
然后按照一定的时序和格式讲数据发送给lcd驱动器.驱动器会驱动lcd屏进行显示.
1)申请显存
framebuffer:导出lcd物理缓冲区(显存)导入到用户空间(0-3G)
用户空间要显示一幅图片到lcd,在用户空间直接操作显存,将要显示的图片copy到
显存中的相应位置上就可以了
这边就先不多讲了,因为时间太晚,太累。我们画一个这样的图片:
用户空间代码:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/mman.h>
#define _COLOR_RED 0x00ff0000
#define _COLOR_GREEN 0x0000ff00
#define _COLOR_BLUE 0x000000ff
static struct fb_fix_screeninfo fb_fix ={0};
static struct fb_var_screeninfo fb_var ={0};
long screen_size=0;
int *fb32 =NULL;
int main()
{
int fd = -1;
int x,y;
fd =open("/dev/fb0",O_RDWR);
if(fd < 0)
{
printf("open dev fb0 fail.\n");
return -1;
}
//get lcd param
ioctl(fd,FBIOGET_FSCREENINFO,&fb_fix);
ioctl(fd,FBIOGET_VSCREENINFO,&fb_var);
screen_size = fb_var.xres*fb_var.yres*(fb_var.bits_per_pixel/8);
fb32 =mmap(0,screen_size,PROT_READ |PROT_WRITE,MAP_SHARED,fd,0);
if(fb32 == NULL)
{
printf("mmap framebuffer fail.\n");
return -1;
}
if(fb_var.bits_per_pixel == 8)
{
printf("8bpp framebuffer test.\n");
}
else if(fb_var.bits_per_pixel == 16)
{
printf("16bpp framebuffer test.\n");
}
else if(fb_var.bits_per_pixel == 24)
{
printf("24bpp framebuffer test.\n");
}
else if(fb_var.bits_per_pixel == 32)
{
printf("32bpp framebuffer test.\n");
}
for(y=0;y< fb_var.yres/3;y++)
{
for(x=0;x< fb_var.xres;x++)
{
*(fb32 +y*fb_var.xres + x) = _COLOR_RED;
}
}
for(;y< fb_var.yres*2/3;y++)
{
for(x=0;x< fb_var.xres;x++)
{
*(fb32 +y*fb_var.xres + x) = _COLOR_GREEN;
}
}
for(;y< fb_var.yres;y++)
{
for(x=0;x< fb_var.xres;x++)
{
*(fb32 +y*fb_var.xres + x) = _COLOR_BLUE;
}
}
munmap(fb32,screen_size);
close(fd);
return 0;
}
实验效果:
可以看到,和我们预期的一样。其中那边有一个小黑框那是光标,我们不管。
linux驱动开发:用户空间操作LCD显示简单的图片【转】的更多相关文章
- Linux 驱动开发
linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...
- Linux驱动开发必看详解神秘内核(完全转载)
Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html IT168 技术文档]在开始步入L ...
- (57)Linux驱动开发之三Linux字符设备驱动
1.一般情况下,对每一种设备驱动都会定义一个软件模块,这个工程模块包含.h和.c文件,前者定义该设备驱动的数据结构并声明外部函数,后者进行设备驱动的具体实现. 2.典型的无操作系统下的逻辑开发程序是: ...
- Linux驱动开发学习的一些必要步骤
1. 学会写简单的makefile 2. 编一应用程序,可以用makefile跑起来 3. 学会写驱动的makefile 4. 写一简单char驱动,makefile编译通过,可以insmod, ...
- linux驱动开发流程
嵌入式linux驱动开发流程嵌入式系统中,操作系统是通过各种驱动程序来驾驭硬件设备的.设备驱动程序是操作系统内核和硬件设备之间的接口,它为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个 ...
- 嵌入式Linux驱动开发日记
嵌入式Linux驱动开发日记 主机硬件环境 开发机:虚拟机Ubuntu12.04 内存: 1G 硬盘:80GB 目标板硬件环境 CPU: SP5V210 (开发板:QT210) SDRAM: 512M ...
- Linux驱动开发:USB驱动之usb_skel分析
在学习了这么些天的驱动之后,个人觉得驱动就是个架构的问题,只要把架构弄清楚了 然后往里面添砖加瓦就可以了,所以似乎看起来不是太困难,但也许是是我经验不足吧,这只能算是个人浅见了 这两天在学习USB驱动 ...
- 嵌入式linux驱动开发之点亮led(驱动编程思想之初体验)
这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...
- 驱动编程思想之初体验 --------------- 嵌入式linux驱动开发之点亮LED
这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...
随机推荐
- adb命令模拟按键事件KeyCode
例子: //这条命令相当于按了设备的Backkey键 adb shell input keyevent 4 //可以解锁屏幕 adb shell input keyevent 82 //在屏幕上做划 ...
- poj3041 Asteroids(二分图最小顶点覆盖、二分图匹配)
Description Bessie wants to navigate her spaceship through a dangerous asteroid field in the shape o ...
- bzoj3477[Usaco2014 Mar]Sabotage
题意 给出一个长为n的正整数序列(n<=1e5),要求选出一个非空前缀和一个非空后缀(这两段不能够加起来组成整个序列),使得这个前缀和后缀中的所有数字一起求平均数的结果最小 分析 最大/最小化平 ...
- Qt——数据的隐式共享
一.隐式共享类 在Qt中有很多隐式共享类( Implicitly Shared Classes ),什么是隐式共享呢,请参考官方文档的说明. 好吧,翻译一下—— 许多C++类隐式地共享数据,使得资源使 ...
- 超链接提示效果jQuery+CSS+html
我们知道浏览器自带了超链接提示, 只需要在超链接中加入 title 属性就可以了. <a href="#" title="吉大砍人案致1死1伤 受害者死前大喊他手里 ...
- Spring Boot系列教程六:日志输出配置log4j2
一.前言 spring boot支持的日志框架有,logback,Log4j2,Log4j和Java Util Logging,默认使用的是logback日志框架,笔者一直在使用log4j2,并且 ...
- BIOS和CMOS的区别
原文链接:https://www.cnblogs.com/boltkiller/articles/5732424.html 在日常操作和维护计算机的过程中,常常可以听到有关BIOS设置和CMOS设置的 ...
- HDU 4383 To The Moon 解题报告
HDU 4383 To The Moon 题意翻译 已知一个长为\(n\)的序列\(a\),你需要进行下面的四种操作. C l r d 将区间\([l,r]\)中的数加上\(d\),同时时间加\(1\ ...
- 解题:ZJOI 2014 力
题面 事实说明只会FFT板子是没有用的,还要把式子推成能用FFT/转化一下卷积的方式 虽然这个题不算难的多项式卷积 稍微化简一下可以发现实际是$q_i$和$\frac{1}{(i-j)^2}$在卷,然 ...
- SSH 阿里云服务器
1.在服务机上操作 创建要远程登录的用户和密码 sudo adduser username 正在添加用户“username”... 正在添加新组“username”(1001)... 正在添加新 ...