|
楼主 |
发表于 2004-8-6 13:13:48
|
显示全部楼层
framebuffer好像没有队列的概念,我阅读了一下有关framebuffer的api没有创建和管理队列的概念。
提供了缓冲队列的概念,并提供了若干函数操作它。
实现画中画肯定要利用fb直接写屏了。下面提供一个写屏的例子:
fbtools.h
- #ifndef _FBTOOLS_H_
- #define _FBTOOLS_H_
- #include <linux/fb.h>
- //a framebuffer device structure;
- typedef struct fbdev{
- int fb;
- unsigned long fb_mem_offset;
- unsigned long fb_mem;
- struct fb_fix_screeninfo fb_fix;
- struct fb_var_screeninfo fb_var;
- char dev[20];
- } FBDEV, *PFBDEV;
- //open & init a frame buffer
- //to use this function,
- //you must set FBDEV.dev="/dev/fb0"
- //or "/dev/fbX"
- //it's your frame buffer.
- int fb_open(PFBDEV pFbdev);
- //close a frame buffer
- int fb_close(PFBDEV pFbdev);
- //get display depth
- int get_display_depth(PFBDEV pFbdev);
- //full screen clear
- void fb_memset(void *addr, int c, size_t len);
- #endif
复制代码
fbtools.c
- #include <stdio.h>
- #include <stdlib.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include <string.h>
- #include <sys/ioctl.h>
- #include <sys/mman.h>
- #include <asm/page.h>
- #include "fbtools.h"
- #define TRUE 1
- #define FALSE 0
- #define MAX(x,y) ((x)>(y)?(x)y))
- #define MIN(x,y) ((x)<(y)?(x)y))
- //open & init a frame buffer
- int fb_open(PFBDEV pFbdev)
- {
- pFbdev->fb = open(pFbdev->dev, O_RDWR);
- if(pFbdev->fb < 0)
- {
- printf("Error opening %s: %m. Check kernel config\n", pFbdev->dev);
- return FALSE;
- }
- if (-1 == ioctl(pFbdev->fb,FBIOGET_VSCREENINFO,&(pFbdev->fb_var)))
- {
- printf("ioctl FBIOGET_VSCREENINFO\n");
- return FALSE;
- }
- if (-1 == ioctl(pFbdev->fb,FBIOGET_FSCREENINFO,&(pFbdev->fb_fix)))
- {
- printf("ioctl FBIOGET_FSCREENINFO\n");
- return FALSE;
- }
-
- //map physics address to virtual address
- pFbdev->fb_mem_offset = (unsigned long)(pFbdev->fb_fix.smem_start) & (~PAGE_MASK);
- pFbdev->fb_mem = (unsigned long int)mmap(NULL, pFbdev->fb_fix.smem_len + pFbdev->fb_mem_offset,
- PROT_READ | PROT_WRITE, MAP_SHARED, pFbdev->fb, 0);
- if (-1L == (long) pFbdev->fb_mem)
- {
- printf("mmap error! mem:%d offset:%d\n", pFbdev->fb_mem, pFbdev->fb_mem_offset);
- return FALSE;
- }
-
- return TRUE;
- }
- //close frame buffer
- int fb_close(PFBDEV pFbdev)
- {
- close(pFbdev->fb);
- pFbdev->fb=-1;
- }
- //get display depth
- int get_display_depth(PFBDEV pFbdev);
- {
- if(pFbdev->fb<=0)
- {
- printf("fb device not open, open it first\n");
- return FALSE;
- }
- return pFbdev->fb_var.bits_per_pixel;
- }
- //full screen clear
- void fb_memset (void *addr, int c, size_t len)
- {
- memset(addr, c, len);
- }
- //use by test
- #define DEBUG
- #ifdef DEBUG
- main()
- {
- FBDEV fbdev;
- memset(&fbdev, 0, sizeof(FBDEV));
- strcpy(fbdev.dev, "/dev/fb0");
- if(fb_open(&fbdev)==FALSE)
- {
- printf("open frame buffer error\n");
- return;
- }
-
- fb_memset(fbdev.fb_mem + fbdev.fb_mem_offset, 0, fbdev.fb_fix.smem_len);
-
- fb_close(&fbdev);
- }
复制代码 |
|