转自: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到
显存中的相应位置上就可以了


这边就先不多讲了,因为时间太晚,太累。我们画一个这样的图片:

用户空间代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <fcntl.h>
  4. #include <linux/fb.h>
  5. #include <sys/mman.h>
  6. #define _COLOR_RED 0x00ff0000
  7. #define _COLOR_GREEN 0x0000ff00
  8. #define _COLOR_BLUE 0x000000ff
  9. static struct fb_fix_screeninfo fb_fix ={0};
  10. static struct fb_var_screeninfo fb_var ={0};
  11. long screen_size=0;
  12. int *fb32 =NULL;
  13. int main()
  14. {
  15. int fd = -1;
  16. int x,y;
  17. fd =open("/dev/fb0",O_RDWR);
  18. if(fd < 0)
  19. {
  20. printf("open dev fb0 fail.\n");
  21. return -1;
  22. }
  23. //get lcd param
  24. ioctl(fd,FBIOGET_FSCREENINFO,&fb_fix);
  25. ioctl(fd,FBIOGET_VSCREENINFO,&fb_var);
  26. screen_size = fb_var.xres*fb_var.yres*(fb_var.bits_per_pixel/8);
  27. fb32 =mmap(0,screen_size,PROT_READ |PROT_WRITE,MAP_SHARED,fd,0);
  28. if(fb32 == NULL)
  29. {
  30. printf("mmap framebuffer fail.\n");
  31. return -1;
  32. }
  33. if(fb_var.bits_per_pixel == 8)
  34. {
  35. printf("8bpp framebuffer test.\n");
  36. }
  37. else if(fb_var.bits_per_pixel == 16)
  38. {
  39. printf("16bpp framebuffer test.\n");
  40. }
  41. else if(fb_var.bits_per_pixel == 24)
  42. {
  43. printf("24bpp framebuffer test.\n");
  44. }
  45. else if(fb_var.bits_per_pixel == 32)
  46. {
  47. printf("32bpp framebuffer test.\n");
  48. }
  49. for(y=0;y< fb_var.yres/3;y++)
  50. {
  51. for(x=0;x< fb_var.xres;x++)
  52. {
  53. *(fb32 +y*fb_var.xres + x) = _COLOR_RED;
  54. }
  55. }
  56. for(;y< fb_var.yres*2/3;y++)
  57. {
  58. for(x=0;x< fb_var.xres;x++)
  59. {
  60. *(fb32 +y*fb_var.xres + x) = _COLOR_GREEN;
  61. }
  62. }
  63. for(;y< fb_var.yres;y++)
  64. {
  65. for(x=0;x< fb_var.xres;x++)
  66. {
  67. *(fb32 +y*fb_var.xres + x) = _COLOR_BLUE;
  68. }
  69. }
  70. munmap(fb32,screen_size);
  71. close(fd);
  72. return 0;
  73. }

实验效果:

可以看到,和我们预期的一样。其中那边有一个小黑框那是光标,我们不管。

版权声明:学习记录,积少成多

linux驱动开发:用户空间操作LCD显示简单的图片【转】的更多相关文章

  1. Linux 驱动开发

    linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...

  2. Linux驱动开发必看详解神秘内核(完全转载)

    Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html   IT168 技术文档]在开始步入L ...

  3. (57)Linux驱动开发之三Linux字符设备驱动

    1.一般情况下,对每一种设备驱动都会定义一个软件模块,这个工程模块包含.h和.c文件,前者定义该设备驱动的数据结构并声明外部函数,后者进行设备驱动的具体实现. 2.典型的无操作系统下的逻辑开发程序是: ...

  4. Linux驱动开发学习的一些必要步骤

      1. 学会写简单的makefile 2. 编一应用程序,可以用makefile跑起来 3. 学会写驱动的makefile 4. 写一简单char驱动,makefile编译通过,可以insmod, ...

  5. linux驱动开发流程

    嵌入式linux驱动开发流程嵌入式系统中,操作系统是通过各种驱动程序来驾驭硬件设备的.设备驱动程序是操作系统内核和硬件设备之间的接口,它为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个 ...

  6. 嵌入式Linux驱动开发日记

    嵌入式Linux驱动开发日记 主机硬件环境 开发机:虚拟机Ubuntu12.04 内存: 1G 硬盘:80GB 目标板硬件环境 CPU: SP5V210 (开发板:QT210) SDRAM: 512M ...

  7. Linux驱动开发:USB驱动之usb_skel分析

    在学习了这么些天的驱动之后,个人觉得驱动就是个架构的问题,只要把架构弄清楚了 然后往里面添砖加瓦就可以了,所以似乎看起来不是太困难,但也许是是我经验不足吧,这只能算是个人浅见了 这两天在学习USB驱动 ...

  8. 嵌入式linux驱动开发之点亮led(驱动编程思想之初体验)

    这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...

  9. 驱动编程思想之初体验 --------------- 嵌入式linux驱动开发之点亮LED

    这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...

随机推荐

  1. Spring mvc 数据验证框架注解

    @AssertFalse 被注解的元素必须为false@AssertTrue 被注解的元素必须为false@DecimalMax(value) 被注解的元素必须为一个数字,其值必须小于等于指定的最小值 ...

  2. 【EF】Entity Framework Core 命名约定

    本文翻译自<Entity Framework Core: Naming Convention>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 注意:我使用的是 Entity ...

  3. 【Python】内置函数

    一.内置函数表格 详细信息 二.内置函数详情 2.1 abs(x) 返回绝对值 1 2 >>> abs(-5) 5 2.2 all(iterable) 如果这个可迭代的元素都为真,就 ...

  4. ADM pro破解百度云限速 ADM pro设置方法 ES文件管理器

    ADM Pro打开ADM,[设置]–>[下载]–>[找下面的选项]:1.[User-Agent] –>选择[Custom]2.[Custom User-Agent]3.填写:netd ...

  5. c# partial使用

    1.有2个类   class1.cs  ,class2.cs 2.这2个类里面都可以定义成这样 public partial class ClassAll { } 3.结果,里面的方法都是共享的,就像 ...

  6. 【BZOJ2806】Cheat(后缀自动机,二分答案,动态规划,单调队列)

    [BZOJ2806]Cheat(后缀自动机,二分答案,动态规划,单调队列) 题面 BZOJ 洛谷 题解 很有趣的一道题啊 对于在所有的串上面进行匹配? 很明显的后缀自动机 所以先构建出广义后缀自动机 ...

  7. splay tree 学习笔记

    首先感谢litble的精彩讲解,原文博客: litble的小天地 在学完二叉平衡树后,发现这是只是一个不稳定的垃圾玩意,真正实用的应有Treap.AVL.Splay这样的查找树.于是最近刚学了学了点S ...

  8. HDU 4383 To The Moon 解题报告

    HDU 4383 To The Moon 题意翻译 已知一个长为\(n\)的序列\(a\),你需要进行下面的四种操作. C l r d 将区间\([l,r]\)中的数加上\(d\),同时时间加\(1\ ...

  9. Active Directory中获取域管理员权限的攻击方法

    Active Directory中获取域管理员权限的攻击方法         译:by  backlion 0x00 前言 攻击者可以通过多种方式在Active Directory中获得域管理员权限, ...

  10. swagger2的常用注解,传递参数的注意使用方法

    背景介绍: 刚开始的时候,在controller层使用@RequestParam的时候,发现这个参数是必须要输入值的,但是我们有时候必须查询的时候允许参数为空,使用这个注解就不行了. 在集成了swag ...