LCD应用程序测试
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/mman.h> #include <linux/fb.h> #define FB_DEV "/dev/fb0" #define SCREEN_RED 0xFF0000 #define SCREEN_GREEN 0x00FF00 #define SCREEN_BLUE 0x0000FF void draw_point(unsigned int x,unsigned int y,unsigned int color); void draw_line(unsigned int x0,unsigned int y0,unsigned int x1,unsigned int y1,unsigned int color); static struct fb_var_screeninfo varScreenInfo = {0}; static struct fb_fix_screeninfo fixScreenInfo = {0}; static unsigned int *pfb_buffer = NULL; int main(void) { int ret = -1; int fd = -1; fd = open(FB_DEV, O_RDWR); if(fd < 0) { perror("open"); close(fd); return -1; } ret = ioctl(fd, FBIOGET_FSCREENINFO,&fixScreenInfo); if(ret < 0) { perror("ioctl"); close(fd); return ret; } ret = ioctl(fd, FBIOGET_VSCREENINFO,&varScreenInfo); if(ret < 0) { perror("ioctl"); close(fd); return ret; } printf("smem_len = %d\n",fixScreenInfo.smem_len); printf("xres = %d; yres = %d\n",varScreenInfo.xres,varScreenInfo.yres); printf("xres_virtual = %d; yres_virtual = %d\n",varScreenInfo.xres_virtual,varScreenInfo.yres_virtual); pfb_buffer = mmap(NULL, fixScreenInfo.smem_len, PROT_READ|PROT_WRITE, MAP_SHARED,fd,0); printf("pfb_buffer = %p\n",pfb_buffer); draw_line(0,0,1023,599,SCREEN_RED); close(fd); return 0; } void draw_point(unsigned int x,unsigned int y,unsigned int color) { x %=varScreenInfo.xres_virtual; y %=varScreenInfo.yres_virtual; // printf("x = %d y = %d %p\n",x,y,(pfb_buffer + x + (y*varScreenInfo.xres_virtual))); *(pfb_buffer + x + y*varScreenInfo.xres_virtual) = color; } void draw_line(unsigned int x0,unsigned int y0,unsigned int x1,unsigned int y1,unsigned int color) { unsigned int x=0,y=0; float setp = (y1-y0)/(float)(x1-x0); for(x=x0,y=y0;x<x1;x++) { draw_point(x,y,color); y = y0+setp*(x-x0) ; } }
一. OS下操作LCD
1.1. 在应用中通过framebuffer操作LCD
1.2. framebuffer帧缓冲(简称fb)是linux内核中虚拟出的一个设备
1.3. framebuffer向应用层提供一个统一标准接口的显示设备
1.4. 从驱动来看,fb是一个典型的字符设备,而且创建了一个类/sys/class/graphics
二. 操作步骤
2.1. 设备文件 /dev/fbx。 其中x代表0,1,2。。。
2.2. 获取设备信息 #include <linux/fb.h>
2.3. mmap做映射
2.4. 填充framebuffer
三. 应用层开发注意事项
3.1. 使用mmap函数时,参数int prot一定是PROT_READ|PROT_WRITE,我开发时笔误写成PROT_READ|PROT_READ,结果一直Segmentation fault。
3.2. *(pfb_buffer + x + y*varScreenInfo.xres_virtual) = color;这里地址不用转换为char*进行运算

浙公网安备 33010602011771号