您的位置:程序门 -> linux/unix社区 -> 内核及驱动程序研究区



[求助]为显示256级灰度图,需把16bpp的framebuffer改为24位,请高手指点一二


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


[求助]为显示256级灰度图,需把16bpp的framebuffer改为24位,请高手指点一二
发表于:2007-09-27 14:36:35 楼主
大家知道,16位的制式为r   5   g   6   b   5,最多能显示2的5次方(即32级灰度),现在16位,640*480的,framebuffer已经可以在我自己的tft屏上正常运行,但是为了达到256级灰度必须改为24位的framebuffer,  

arm是s3c2440,tft屏是lg.philips   lcd   ,为了运行24位的framebuffer,我做了如下修改  
1。我把16位驱动中的16位相关都改为24位的了,例如:  
if   (   var-> bits_per_pixel   ==   24   )   {//change   add  
var-> red.offset   =   16;   var-> red.length   =   8;  
var-> green.offset   =   8;   var-> green.length   =   8;  
var-> blue.offset   =   0;   var-> blue.length   =   8;  
var-> transp.offset   =   var-> transp.length   =   0;  
}else   if   (   var-> bits_per_pixel   ==   16   )   {  
var-> red.offset   =   11;   var-> red.length   =   5;  
var-> green.offset   =   5;   var-> green.length   =   6;  
var-> blue.offset   =   0;   var-> blue.length   =   5;  
var-> transp.offset   =   var-> transp.length   =   0;  
}  
2。因为16位的framebuffer可以运行,我修改控制寄存器1,如下:

我修改了地址寄存器2,3,如下  
.reg   =   {  
/*111111000   这里把寄存器改为13*/  
.lcdcon1   =   (1 < <8) ¦(1 < <7) ¦(3 < <5) ¦(13 < <1),  

/*   16bpp   24bpp*/  
new_regs.lcdsaddr2   =   lcdaddr_basel(  
((unsigned   long)videophysicaltemp   +   (var-> xres   *   3   *   (var-> yres/*-1*/)))  
> >   1);//change   2   to   3  

new_regs.lcdsaddr3   =   lcdaddr_offset(0)   ¦   (lcdaddr_page(var-> xres*3/2)   /*> >   1*/);  
编译后运行,在屏幕上出现了(横4竖4)共16个小图象,都是24位的(用示波器检测过了),  

这是怎么回事呢?是寄存器没有设置正确,还是在修改驱动时出现了问题呢?  
本人新手,请大家指教,谢谢!!
发表于:2007-09-27 19:35:081楼 得分:0
发表于:2007-09-29 10:35:372楼 得分:0
在屏幕上出现了(横4竖4)共16个小图象,都是24位的(用示波器检测过了)???
没看懂你在说什么地方出了问题??你是说本应该出现一个图象?
发表于:2007-09-29 13:53:023楼 得分:0
什么芯片?一般fbcon.c之类都要进行修改的。
发表于:2007-10-08 18:45:374楼 得分:0
芯片s3c2440,我在开发商给的原代码里没找到fbcon.c
发表于:2007-10-09 09:52:495楼 得分:0
我用的就是s3c2440芯片,在drivers/video目录中就有fbcon.c
发表于:2007-10-25 15:52:336楼 得分:0
这个东西fbcon.c,是搞控制台的把。。。


快速检索

最新资讯
热门点击