📄 framebuffer.c
字号:
/*#include <unistd.h>#include <fcntl.h>#include <sys/ioctl.h>#include <sys/mman.h>#include <stdio.h>#include <stdlib.h>#include "framebuffer.h"*/#define FB_DEVICE "/dev/fb0"int closeFrameBufferDevice(int fbFd){ int ret; if(fbFd < 0) return -1; ret = close(fbFd); return ret;} // end of closeFrameBufferDeviceint openFrameBufferDevice(void){ int fbFd; fbFd = open(FB_DEVICE, O_RDWR); if(fbFd < 0) { fprintf(stderr, "Line %d :open framebuffer device error !\n", __LINE__); return -1; } return fbFd;}int getFrameBufferInfo(int fbFd, struct fb_var_screeninfo * vsinfo){ int ret; ret = ioctl(fbFd, FBIOGET_VSCREENINFO, vsinfo); if(ret < 0) { fprintf(stderr, "Line %d :read FBIOGET_VSCREENINFO Error !\n", __LINE__); return -1; }#ifdef DEBUG fprintf(stdout, "bits = %u\n", vsinfo->bits_per_pixel); fprintf(stdout, "xres = %u\n", vsinfo->xres); fprintf(stdout, "yres = %u\n", vsinfo->yres);#endif //DEBUG return 0;}int frameBufferOffset(struct fb_var_screeninfo *vsinfo, int x, int y){ // (x, y)offset (x * screen_width + y) * color_bits / 8 return (y * vsinfo->xres + x) * vsinfo->bits_per_pixel / 8;} // end of frameBufferOffset#ifndef MMAPint readPixelToFrameBuffer(int fbFd, int offset, rgb *color){ int ret; ret = lseek(fbFd, offset, SEEK_SET); if(ret == -1) { fprintf(stderr, "Line %d :seek to offset : %d error !\n", __LINE__, offset); return -1; } ret = read(fbFd, color, sizeof(rgb)); if(ret != sizeof(rgb)) { fprintf(stderr, "Line %d :write one pixel to framebuffer error !\n", __LINE__); return -1; } return 0;}int writePixelToFrameBuffer(int fbFd, int offset, rgb *color){ int ret; ret = lseek(fbFd, offset, SEEK_SET); if(ret == -1) { fprintf(stderr, "Line %d :seek to offset : %d error !\n", __LINE__, offset); perror(""); return -1; } ret = write(fbFd, color, sizeof(rgb)); if(ret != sizeof(rgb)) { fprintf(stderr, "Line %d :write one pixel to framebuffer error !\n", __LINE__); return -1; } return 0;}#elseunsigned short *frameBufferMap(int fbFd, struct fb_var_screeninfo *vsinfo){ unsigned short * p; p = (unsigned short *)mmap(NULL, vsinfo->xres * vsinfo->yres * vsinfo->bits_per_pixel / 8, PROT_READ | PROT_WRITE, MAP_SHARED, fbFd, 0); if(! p) fprintf(stderr, "LINE: %d, mmap failed !\n", __LINE__); return p;}int frameBufferUnmap(unsigned short * p, struct fb_var_screeninfo *vsinfo){ int ret; if(! p) { fprintf(stderr, "LINE: %d, NULL, cannot munmap !\n", __LINE__); return -1; } ret = munmap(p, vsinfo->xres * vsinfo->yres * vsinfo->bits_per_pixel / 8); if(ret < 0) fprintf(stderr, "LINE: %d, munmap failed !\n", __LINE__); return ret;}#endif //MMAP#ifdef DEBUGint main(){ int fbFd, ret, i, j; struct fb_var_screeninfo vsinfo;#ifdef MMAP unsigned short *p;#endif //MMAP rgb color;//设置RGB565颜色为红色 color._c565.r = 255 >> 3; color._c565.g = 0; color._c565.b = 0; fbFd = openFrameBufferDevice(); if(fbFd < 0) exit(fbFd); ret = getFrameBufferInfo(fbFd, &vsinfo); if(ret < 0) { closeFrameBufferDevice(fbFd); exit(ret); }#ifdef MMAP p = frameBufferMap(fbFd, &vsinfo); if(! p) exit(-1);#endif //MMAP// for(i = 0; i < vsinfo.xres; i++) for(i = 100; i < 611; i++) { color._c565.r++; color._c565.g++; color._c565.b++; for(j = 100; j < 400; j++) {#ifdef MMAP *(p + (vsinfo.xres * j) + i) = color._c16;#else ret = writePixelToFrameBuffer(fbFd, frameBufferOffset(&vsinfo, i, j), &color); if(ret < 0) { closeFrameBufferDevice(fbFd); exit(ret); }#endif //MMAP } }#ifdef MMAP frameBufferUnmap(p, &vsinfo);#endif // MMAP closeFrameBufferDevice(fbFd); return EXIT_SUCCESS;}#endif //DEBUG
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -