Chinaunix首页 | 论坛 | 博客
  • 博客访问: 663630
  • 博文数量: 160
  • 博客积分: 2384
  • 博客等级: 大尉
  • 技术积分: 1366
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-01 11:35
文章分类
文章存档

2015年(45)

2014年(36)

2012年(28)

2011年(37)

2010年(2)

2009年(10)

2008年(2)

分类: LINUX

2011-04-11 17:48:15

p { margin-bottom: 0.21cm; }

一些关键的概念

  • 像素:pixel,点阵,就是屏幕上的一个点。

  • Bpp: 每个像素所占的bit数。bit数越大,一个像素能表现颜色数越多。8bpp,能表现256种颜色。16Bpp能表现65536种颜色。

  • 分辨率:一个屏幕x方向和y方向所能排列的像素数。比如240*320240代表x方向的像素个数,320代表y方向的像素个数,整个屏幕所能占有的像素个数为240*320=76800

  • Frame buffer:帧缓冲区,显示一帧所占的内存存储空间,可以认为是显存。帧缓冲区的内容和屏幕上的点空间一般是行对应的。每行存储着这行的每个像素的颜色信息,像素的信息大小由bpp决定。

  • framebuffer设备:是Linux内核当中的一种驱动程序接口。这种接口将显示设备抽象为帧缓冲区。可以将它看成是显示内存的一个映像,将其映射到进程空间之后,就可以直接进行读写操作,而写操作可以立即反映在屏幕上。(基于PCwmware虚拟机,提供了VGA的仿真;基于s3c2410上:skyeye虚拟机,提供了LCD仿真;基于pxa上:skyeye虚拟机,提供了LCD仿真)。

  • Console:控制台,指可以显示内核信息,并且允许用户登录的设备。

  • terminal:终端,指有显示器或者LCD作为输出,键盘作为输入的设备。

  • Virtual terminal:虚拟终端,简称VT。指在一个标准终端可以虚拟多个终端设备。在PC上,各个虚拟终端可以用ALT+功能键切换。

  • ConsoleVT的关系。

Framebuffer driver驱动程序编写

(1)重要数据结构

include/linux/fb.h中定义:

  • struct fb_fix_screeninfo:描述framebuffer设备在使用过程中,固定不变的一些属性。用户和内核空间可见。

  • struct fb_var_screeninfo:描述framebuffer设备在之用过程中,需要改变或设定的一些属性。用户和内核空间可见。

  • struct fb_opsframebuffer设备的一些操作函数。只在内核空间可见。

  • struct fb_info:描述一个framebuffer设备。上面三个嵌入在这个结构中。只在内核空间可见。

struct fb_fix_screeninfo介绍:

id:字符串表示的字符标识。

smem_startframebuffer使用的内存起始地址,表示的是物理地址。

smem_lineframebuffer所占用的内存的大小,字节为单位。

typeFramebuffer的类型。多用FB_TYPE_PACKED_PIXELS_

visual:表示可见颜色。48bppFB_VISUAL_PSEUDOCOLORFB_VISUAL_STATIC_PSEUDOCOLOR162432使用FB_VISUAL_TRUCOLOR

line_length:一行所占内存的长度,以字节为单位。

accel:是否使用硬件加速,一般为FB_ACCEL_NONE,表示没有使用。

struct fb_var_screeninfo介绍:

xresyresxy方向的可见分辨率。表示可以看见的屏幕大小。

xres_virtualyres_virtualxy方向的虚拟分辨率。表示可以显示的屏幕大小。

xoffsetyoffsetxy方向的可见分辨率和虚拟分辨率的偏移。

bits_perl_pixelbpp,每个点阵或者象素所占bit数。

struct fb_ops介绍:

fb_get_fix:获取struct fb_fix_screeninfo结构

fb_get_var:获取struct fb_var_screeninfo结构

fb_set_var:设置struct fb_var_screeninfo

struct fb_info结构介绍:

char modename[40]framebuffer设备名称。在/proc/fb可查看。

Struct fb_var_screeninfo var

srtuct fb_fix_screeninfo fix

struct fb_ops *fbops

char *screen_base:虚拟地址

char fontname[40]:使用的字体名字。

(2)编写驱动程序

  1. xxxfb_setup:解析命令行参数

    video_setup(driver/video/fmem.c)中调用。解析类似video=xxx:opt1,opt2的命令行参数。

  2. xxxfb_init:驱动程序初始化函数

    xxxfb_init_fbinfo:初始化xxxfb_info结构。

    xxxfb_map_video_memory:分配系统内存给显示设备。

    xxxfb_hw_init:初始化显示硬件

    xxxfb_set_var:设定参数,根据xxxfb_init_fbinfo初始化的参数设备fb_var_screeninfo

    register_framebuffer:注册fb_info结构,成为framebuffer设备

  3. 实现xxxfb_ops结构和它的函数。

Framebuffer应用程序编程

  • 打开framebuffer设备

    int fd = open(“/dev/fb0”, O_RDWR);

  • 关闭framebuffer设备

    close(fd)

  • 读取framebuffer信息

    struct fb_fix_screeninfo fb_fix;

    struct fb_var_screeninfo fb_var;

    if(ioctl(fd, FBIOGET_FSCREENINFO, &fb_fix) == -1 || ioctl(fd, FBIOGET_VSCEERNINFO, &fb_var) == -1)

    {

    printf(“Error reading screen info:\n”);

    }

  • 设置framebuffer设备信息

    ioctl(fd, FBIOPUT_VSCREENINFO, &fb_var);

  • 读写设备文件

    lseek定位要写的点

    write写相应的值到此点

    read读相应的点

  • 映射显示区域到应用程序空间

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

    addr,映射起始地址。0表示由系统指定地址。

    Length, 映射空间长度。为framebuffer所占显示内存空间大小。

    prot:内存保护标志,表示读写和执行权限。PROT_READPROT_WRITE,表示可读可写。

    Flags, 标志位。使用MAP_SHARED表示写内存就同时写入文件中。

    Fd, 要映射的文件句柄。

    offset:要映射的文件的起始偏移。


阅读(1448) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~