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)        ;
    }
}
View Code

一. 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*进行运算

posted @ 2019-01-03 09:53  三七鸽  阅读(406)  评论(0)    收藏  举报