我想通过framebuffer来控制LCD的显示,板子是TQ2440,屏幕是4.3寸板子自带屏,烧的是原厂2.6.30镜像和文件系统,删除了/bin中的qt程序,目前遇到的问题是,可以正常初始化LCD,可以控制像素点变黑,但是在做划线函数时遇到了问题,例如我想的到从屏幕顶端到屏幕底端一条垂直的直线,我的想法是通过控制直线上每一个像素点的颜色来实现划线,但是画出来的线却被分为若干个部分,水平直线也如此……
初始化函数:
int init_LCD()
{
/*打开设备文件*/
fbfd = open("/dev/fb0", O_RDWR);
if(fbfd<=0)
{
printf("open dev error");
}
/*屏幕相关参数*/
if(ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo))printf("get finfo error");
if(ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo))printf(
"get vinfo error");
printf("xres v is %d \n",vinfo.xres_virtual);
printf("yres v is %d \n",vinfo.yres_virtual);
printf("xres is %d \n",vinfo.xres);
printf("yres is %d \n",vinfo.yres);
printf("offset X,Y %d,%d\n",vinfo.xoffset,vinfo.yoffset);
printf("pixel is %d",vinfo.bits_per_pixel);
vinfo.xoffset=0;
vinfo.yoffset=0;
/*屏幕缓冲区大小*/
screensize = vinfo.xres*vinfo.yres*vinfo.bits_per_pixel/8;
printf("2\n");
/*映射屏幕缓冲区到用户地址空间*/
printf("3\n");
fbp=(char*)mmap(0,screensize,PROT_READ|PROT_WRITE,MAP_SHARED,fbfd,0);
printf("fbp is %d\n",(int)fbp);
if((int)fbp==-1){printf("mmap error\n");}
}
填充像素点函数:
void fill_pixel(int x,int y,unsigned short color)
{
unsigned short offset;
offset=((y*vinfo.xres*2)+(x*2));
*(unsigned short*)(fbp+offset)=color;
offset=0;
}
划线函数:
void fill_line(int x1,int y1,int x2,int y2,int color)
{
int xlen,ylen,y_tmp,i;
xlen=x2-x1;ylen=y2-y1;
if(x1==x2)
{
for(i=0;i<abs(ylen);i++)
{
fill_pixel(x1,y1+i,color);
}
}
if(y1==y2)
{
for(i=0;i<abs(xlen);i++)
{
fill_pixel(x1+i,y1,color);
}
}
if(x1!=x2&&y1!=y2)
{
for(i=0;i<xlen;i++)
{
y_tmp=(ylen/xlen)*i+y1-(ylen/xlen);//y=kx+b
fill_pixel(x1+i,y_tmp,color);
}
}
}
已经熬了两个通宵了……仍然没有什么进展…望版主及各位大侠指教…… |