LCD测试程序求解惑
本帖最后由 wang12zhedi 于 2012-12-17 09:07 编辑程序如下
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/mman.h>
int main()
{
int fd,x=0,y=0,i=0;
unsigned long screensize;//这里需要定义成long 应为480*272已经非常大了
char *fbp=0;
struct fb_var_screeninfo varinfo;
fd=open("/dev/fb0",O_RDWR);
if(!fd)
{
printf("open /dev/fb0 fail \n");
exit(1);
}
if(ioctl(fd,FBIOGET_VSCREENINFO,&varinfo))
{
printf("ERROR canot get var info");
exit(1);
}
printf("varinfo.xres=%d \n",varinfo.xres);
printf("varinfo.yres=%d \n",varinfo.yres);
printf("varinfo.bits_per_pixel=%d \n",varinfo.bits_per_pixel);
if(varinfo.bits_per_pixel!=16)
{
printf("Error: not supported bits_per_pixel, it only supports 16 bit color\n");
exit(1);
}
screensize=varinfo.yres*varinfo.xres*varinfo.bits_per_pixel/8;
fbp = (char *)mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED,
fd, 0);//返回的fbp是显示缓冲区的开始地址?
if ((int)fbp == -1)
{
printf("Error: failed to map framebuffer device to memory.\n");
exit(1);
}
printf("The framebuffer device was mapped to memory successfully.\n");
for (i = 0; i < 3; i++) {
for (y = i * (varinfo.yres / 3); y < (i + 1) * (varinfo.yres / 3); y++) {
for (x = 0; x < varinfo.xres; x++) {
long location = x * varinfo.bits_per_pixel/8 + y *varinfo.xres * varinfo.bits_per_pixel/8;
int r = 0, g = 0, b = 0;
unsigned short rgb;
if (i == 0)
// 实现位置与显示颜色挂钩,0<=r<=32
r = ((x * 1.0) / varinfo.xres) * 32;//R G B 5 6 5 所以除以 326432
// r=155;
if (i == 1)
g = ((x * 1.0) / varinfo.xres) * 255;
if (i == 2)
b = ((x * 1.0) / varinfo.xres) * 32;
rgb = (r << 11) | (g << 5) | b;
*((unsigned short*)(fbp + location)) = rgb;
}
}
}
munmap(fbp, screensize);
close(fd);
return 0;
}
程序排列很工整有序的,咋一复制粘贴过来就成这样啦 请原谅
我的问题是
// 实现位置与显示颜色挂钩,0<=r<=32
r = ((x * 1.0) / varinfo.xres) * 32;//R G B 5 6 5 所以除以 326432
// r=155
这里为什么是乘以32,难道真是因为rgb=5:6:5吗?
这样r的范围只有0到32吧,但是当我给r赋值为255155之类的也显示深浅不同的红颜色呀
你要看清楚这个程序的功能,这个是把LCD上对应的点的位置和这个点的像素联系起来,他只是这样测试而已,
页:
[1]