显示设备文件接口
?
例: ?將/dev/fb0文件映射到內(nèi)存空間(mmap), 顯示相應(yīng)內(nèi)容
? ?先通過ioctl()取得framebuffer對應(yīng)的設(shè)備文件/dev/fb0相關(guān)的信息, 包括顯示區(qū)域的長度/寬度/每像素占用的位長等, 并以此計算映射到內(nèi)存空間時的對應(yīng)內(nèi)存空間大小.
? ?向/dev/f0b映射到的內(nèi)存空間寫入數(shù)據(jù), 即可在屏幕上顯示相應(yīng)內(nèi)容.
myfb.c
#include <stdio.h> #include <fcntl.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <pthread.h> #include <sys/mman.h>#include <linux/fb.h>#define ERROR(flag,msg) \ if(flag) \ { \printf("%d: ",__LINE__); \fflush(stdout); \perror(msg); \exit(errno); \ }int main(int argc, char *argv[]) {int fd;int i;struct fb_var_screeninfo var;fd = open("/dev/fb0", O_RDWR);ERROR(fd == -1, "open()");int ret = ioctl(fd, FBIOGET_VSCREENINFO, &var);ERROR(ret == -1, "ioctl()");printf("bits_per_pixel = %d\n", var.bits_per_pixel);printf("x = %d\n", var.xres);printf("y = %d\n", var.yres);int screensize = var.xres * var.yres * var.bits_per_pixel / 8;char *fbp = mmap(NULL, screensize,PROT_READ | PROT_WRITE,MAP_SHARED, fd, 0);int x,y;for(y = var.yres/3; y < var.yres * 2/3; y++){for(x = var.xres/3; x < var.xres * 2/3; x++){int location = (y * var.xres + x) * var.bits_per_pixel/8;int r = 31 - (y - 200) / 16;int g = (x - 400) / 6;int b = 10;unsigned short t = r << 11 | g << 5 | b;*(unsigned short*)(fbp + location) = t;}}munmap(fbp,screensize);sleep(2);return 0; }編譯鏈接后, 在tty1終端運行, 輸出結(jié)果如下:
?
轉(zhuǎn)載于:https://www.cnblogs.com/zhanglong71/p/5128761.html
總結(jié)
- 上一篇: 翻译 github上How to be
- 下一篇: h5专题应该兼容那些浏览器?