您好,欢迎访问三七文档
实验七LCD显示实验一、实验目的:1、掌握Exynos4412处理器与LCD显示的电路原理。2、掌握linux下基于Exynos4412处理器使用framebuffer进行LCD显示的原理及使用方法。二、实验设备:友善之臂4412开发板、学生自带笔记本、USB转串口线、电源、网线。三、实验地点及时间地点:A2-303a时间:教学周第11周四、实验内容:1、熟悉FrameBuffer相关fb_var_screeninfo,fb_fix_screeninfo,fb_ops和fb_info几个重要的数据结构。2、通过dd命令操作FrameBuffer清空framebuffer显示,通过dd命令将Framebuffer里的数据保存成一个文件,并进行数据恢复显示。3、编写代码完成读取文件系统中的BMP文件,通过写FrameBuffer方式显示到LCD屏上。五、实验原理:1、LCD接口原理图LCD控制器由REGBANK、LCDCDMA、VIDPRCS、TIMEGEN和LPC3600组成。REGBANK有17个可编程寄存器和256×16的调色板存储器,用来设定LCD控制器。LCDCDMA是一个专用DMA,自动从帧存储器传输视频数据到LCD控制器,用这个特殊的DMA,视频数据可不经过CPU干涉就显示在屏幕上。VIDPRCS接受从LCDCDMA来的视频数据并在将其改变到合适数据格式后经VD[23:0]将之送到LCD驱动器,如4/8单扫描或4双扫描显示模式。TIMEGEN由可编程逻辑组成,以支持不同LCD驱动器的接口时序和速率的不同要求。TIMEGEN产生VFRAME、VLINE、VCLK、VM信号等。Tiny4412SDK带有三个LCD接口,其中一个是45pin(LCD1),可连接电容触摸屏。LCD1引脚说明LCD1引脚说明1VDD_5V2VDD_5V3VD04VD15VD26VD37VD48VD59VD610VD711GND12VD813VD914VD1015VD1116VD1217VD1318VD1419VD1520GND21VD1622VD1723VD1824VD1925VD2026VD2127VD2228VD2329GND30PWM1/GPD0_131XEINT10/GPH1_232nRSTOUT33VDEN34VSYNC35HSYNC36VCLK37I2CSCL238XEINT14/GPH1_639I2CSDA240XEINT15/GPH1_741GND注意:Exynos4412总共有3路I2C,此处使用的是I2C2说明:各个引脚和CPU的连接关系,请以原理图为准,此处定义标称仅供参考2、熟悉FrameBuffer几个重要的数据结构在深入学习framebuffer前首先要熟悉它用到的一些重要的数据结构。理解数据成员的含义和作用。下面列出的目录均以linux内核代码根目录作为当前目录。(1)打开drivers/video/fbmem.c通过查阅本文件源代码,理解如何将framebuffer实现成一个字符设备。它跟普通字符设备有哪些不同。(2)打开include/linux/fb.h依次查看结构体:fb_var_screeninfo,fb_fix_screeninfo,fb_ops和fb_info。参照课堂所讲内容,了解每个结构体的作用,知道结构体中重要的数据成员的含义。需要注意的是,fb_ops和fb_info这两个结构体只在内核态可见。而fb_var_screeninfo和fb_fix_screeninfo在用户空间和内核空间都可见。(3)打开drivers/video/s3c-fb.c查看源代码中是怎样给fb_var_screeninfo,fb_fix_screeninfo,fb_ops和fb_info这些结构体赋值的。怎么给FRAMEBUFFER分配内存的?3、通过dd命令操作FrameBuffer(1)将开发板上电,启动Linux使LCD进入正常图形界面。(2)部分清空framebuffer显示。通过串口终端敲入命令:ddif=/dev/zeroof=/dev/fb0bs=480count=160查看LCD显示效果,分析试验原因。(3通过dd命令将Framebuffer里的数据保存成一个文件。ddif=/dev/fb0of=./tmp_fb_databs=480count=3204、显示BMP核心代码intshow_bmp(){FILE*fp;intrc;intline_x,line_y;longintlocation=0,BytesPerLine=0;chartmp[1024*10];fp=fopen(./niu.bmp,rb);if(fp==NULL){return(-1);}rc=fread(&FileHead,sizeof(BITMAPFILEHEADER),1,fp);if(rc!=1){printf(readheadererror!\n);fclose(fp);return(-2);}//检测是否是bmp图像if(memcmp(FileHead.cfType,BM,2)!=0){printf(it'snotaBMPfile\n);fclose(fp);return(-3);}rc=fread((char*)&InfoHead,sizeof(BITMAPINFOHEADER),1,fp);if(rc!=1){printf(readinfoheadererror!\n);fclose(fp);return(-4);}//跳转的数据区fseek(fp,FileHead.cfoffBits,SEEK_SET);//每行字节数BytesPerLine=(InfoHead.ciWidth*InfoHead.ciBitCount+31)/32*4;line_x=line_y=0;//向framebuffer中写BMP图片while(!feof(fp)){PIXELpix;unsignedshortinttmp;rc=fread((char*)&pix,1,sizeof(PIXEL),fp);if(rc!=sizeof(PIXEL))break;location=line_x*bits_per_pixel/8+(InfoHead.ciHeight-line_y-1)*xres*bits_per_pixel/8;//显示每一个像素*(fbp+location+0)=(pix.blue3|(pix.green2)5);*(fbp+location+1)=(pix.green5|(pix.red3)3);//*(fbp+location+2)=pix.red;//*(fbp+location+3)=pix.reserved;line_x++;if(line_x==InfoHead.ciWidth){line_x=0;line_y++;if(line_y==InfoHead.ciHeight)break;}}fclose(fp);return(0);}六、实验步骤编写程序代码,下载到开发板运行。七、实验结果将实验代码及过程中结果写到实验报告上面《详见实验报告模板》。
本文标题:实验七-LCD显示
链接地址:https://www.777doc.com/doc-7253723 .html