昨天做的一个极简单的framebuffer的例子,用来学习怎样操作fb设备。

  这段代码是在picogl的vesafb backend部分的基础上简出来的,所以变量名还保留着。

流程如下:

1 打开framebuffer设备;

2 通过ioctl取得fixed screen information;

3 通过ioctl取得variable screen information;

4 通过mmap映射设备内存到进程空间;

5 写framebuffer;

6 终止。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <fcntl.h>
  5. #include <linux/fb.h>
  6. #include <sys/mman.h>
  7. struct fb_fix_screeninfo FixedInfo;
  8. struct fb_var_screeninfo OrigVarInfo;
  9. static int FrameBufferFD = -1;
  10. void *FrameBuffer = (void *) -1;
  11. void openFBDEV(void) {
  12.     /* open the framebuffer device */
  13.     FrameBufferFD = open("/dev/fb0", O_RDWR);
  14.     if (FrameBufferFD < 0) {
  15.         fprintf(stderr, "Error opening /dev/fb0/n");
  16.         exit(1);
  17.     }
  18.     /* Get the fixed screen info */
  19.     if (ioctl(FrameBufferFD, FBIOGET_FSCREENINFO, &FixedInfo)) {
  20.         fprintf(stderr, "error: ioctl(FBIOGET_FSCREENINFO) failed/n");
  21.         exit(1);
  22.     }
  23.     /* get the variable screen info */
  24.     if (ioctl(FrameBufferFD, FBIOGET_VSCREENINFO, &OrigVarInfo)) {
  25.         fprintf(stderr, "error: ioctl(FBIOGET_VSCREENINFO) failed/n");
  26.         exit(1);
  27.     }
  28.        
  29.     if (FixedInfo.visual != FB_VISUAL_TRUECOLOR && FixedInfo.visual != FB_VISUAL_DIRECTCOLOR) {
  30.         fprintf(stderr, "non-TRUE/DIRECT-COLOR visuals (0x%x) not supported by this demo./n", FixedInfo.visual);
  31.         exit(1);
  32.     }
  33.     /*
  34.      * fbdev says the frame buffer is at offset zero, and the mmio region
  35.      * is immediately after.
  36.      */
  37.     /* mmap the framebuffer into our address space */
  38.     FrameBuffer = (void *) mmap(0, /* start */
  39.         FixedInfo.smem_len, /* bytes */
  40.         PROT_READ | PROT_WRITE, /* prot */
  41.         MAP_SHARED, /* flags */
  42.         FrameBufferFD, /* fd */
  43.         0 /* offset */);
  44.     if (FrameBuffer == (void *) - 1) {
  45.         fprintf(stderr, "error: unable to mmap framebuffer/n");
  46.         exit(1);
  47.     }
  48. }
  49. void closeFBDEV(void) {
  50.     munmap(FrameBuffer, FixedInfo.smem_len);
  51.     close(FrameBufferFD);
  52. }
  53. int main() {
  54.     openFBDEV();
  55.     fprintf(stderr, "openFBDEV finish/n");
  56.     memset(FrameBuffer, 128, FixedInfo.smem_len);
  57.     sleep(5);
  58.     closeFBDEV();
  59.     fprintf(stderr, "closeFBDEV finish/n");
  60.     return 0;
  61. }

 

 

 

 

Logo

更多推荐