平台s3c2440
/*
* 当8bpp输出时要初始化调色板
*/
void Lcd_Palette8Bit_Init(void)
{
int i;
volatile unsigned int *palette;
LCDCON5 |= (FORMAT8BPP_565<<11); //
palette = (volatile unsigned int *)PALETTE;
for (i = 0; i < 256; i++)
*palette++ = DEMO256pal[i]; //写到调色板对应内存里去
}
void PutPixel(UINT32 x, UINT32 y, UINT32 color)
{
UINT8 red,green,blue;
switch (bpp){
case 16:
{
UINT16 *addr = (UINT16 *)fb_base_addr + (y * xsize + x);
red = (color >> 19) & 0xff;
green = (color >> 10) & 0xff;
blue = (color >> 3) & 0xff;
color = (red << 11) | (green << 5) | blue; // ¸ñê½5:6:5
*addr = (UINT16) color;
break;
}
case 8:
{
UINT8 *addr = (UINT8 *)fb_base_addr + (y * xsize + x);
*addr = (UINT8) color;/*疑问在这,以为color向上面一样直接赋值给addr了呢,一直没看到调色板的信息*/
break;
}
default:
break;
}
}
网上找了一段 :
"8bpp时,2410的LCD控制器带的色板,只要在初始化的时候设置好你想要的颜色,它共有256个16位的存储单元,每个单元代表一种颜色. 应用程序不去控制这个色板.在LCD输出数据到屏幕的时候,是有一个简单的过程并不是直接把你从显存中取到的数据直接输出的,建议你好好看看2410的datasheet.LCD控制器会根据从FIFO中得到的数据,然后去色板上去找相应的值输出.这个过程是硬件来完成的(比如LCD控制器得到显存中的一个像素点的值是100,那么硬件就会自己寻找到256个16位存储单元中的第100个单元,把它里面的16位值按照565的形式输出到LCD的数据线上),跟应用程序没有关系.你只要保证你的应用程序能够按照你的想法往显存里面写数据就好了,只要你的应用程序能够做到把你想显示的颜色在256个色板单元中的位置写到显存里面,然后对应的像素点就能够显示出你要的颜色. "
一句话,8bpp时,硬件把从fifo取出color然后,到调色板去找,然后再去给*addr赋值~
阅读(1615) | 评论(0) | 转发(0) |