嵌入式裸机开发学习:2440驱动LCD的24bpp模式相关设置

来源:互联网 发布:古建筑设计软件 编辑:程序博客网 时间:2024/05/03 13:31

    韦东山提供的TQ2440源码只提供了8bpp和16bbp的模式的LCD例程,而我目前使用的4.3寸屏可以支持24bbp模式,想尝试一下在例程的基础上修改一下代码,使它能够支持24bpp模式。经过一个晚上的修改,程序可以正确运行,下面写一下所修改的地方:

    首先要从main.c主函数开始入手,在switch语句中增加一项:

case '1':
{
Test_Lcd_Tft_24Bit_480272();
break;
}

然后在lcdlib.c增加这个函数,格式和8bpp、16bpp一样:

void Test_Lcd_Tft_24Bit_480272(void)
{
    Lcd_Port_Init();                     // 设置LCD引脚
    Tft_Lcd_Init(MODE_TFT_24BIT_480272);  // 初始化LCD控制器
    Lcd_PowerEnable(0, 1);               // 设置LCD_PWREN有效,它用于打开LCD的电源
    Lcd_EnvidOnOff(1);                   // 使能LCD控制器输出信号

    ClearScr(0x0);              // 清屏
    printf("[TFT 16M COLOR(24bpp) LCD TEST]\n");

    printf("1. Press any key to draw line\n");
    getc();
    DrawLine(0  , 0  , 479, 0  , 0xff0000);     // 红色
    DrawLine(0  , 0  , 0  , 271, 0x00ff00);     // 绿色
    DrawLine(479, 0  , 479, 271, 0x0000ff);     // 蓝色
    DrawLine(0  , 271, 479, 271, 0xffffff);     // 白色
    DrawLine(0  , 0  , 479, 271, 0xffff00);     // 黄色
    DrawLine(479, 0  , 0  , 271, 0x8000ff);     // 紫色
    DrawLine(240, 0  , 240, 271, 0xe6e8fa);     // 银色
    DrawLine(0  , 136, 479, 136, 0xcd7f32);     // 金色

    printf("2. Press any key to draw circles\n");
    getc();
    Mire();

    printf("3. Press any key to fill the screem with one color\n");
    getc();
    ClearScr(128);  //  输出单色图像,颜色为DEMO256pal[128]

    printf("4. Press any key to fill the screem by temporary palette\n");
    getc(); 
    ClearScrWithTmpPlt(0x0000ff);       //  输出单色图像,颜色为蓝色

    printf("5. Press any key to fill the screem by palette\n");
    getc();
    DisableTmpPlt();            // 关闭临时调色板寄存器
    ChangePalette(0xffff00);    // 改变整个调色板为黄色,输出单色图像
    
    printf("6. Press any key stop the testing\n");
    getc();
    Lcd_EnvidOnOff(0);
}

其中只需修改Tft_Lcd_Init(MODE_TFT_24BIT_480272),这个函数在lcddrv.c,增加一个case分支:

case MODE_TFT_24BIT_480272:
        LCDCON1 = (CLKVAL_TFT_480272<<8) | (LCDTYPE_TFT<<5) | \
                  (BPPMODE_24BPP<<1) | (ENVID_DISABLE<<0);
        LCDCON2 = (VBPD_480272<<24) | (LINEVAL_TFT_480272<<14) | \
                  (VFPD_480272<<6) | (VSPW_480272);
        LCDCON3 = (HBPD_480272<<19) | (HOZVAL_TFT_480272<<8) | (HFPD_480272);
        LCDCON4 = HSPW_480272;
        LCDCON5 = (0<<12) | (HSYNC_INV<<9) | (VSYNC_INV<<8) | \
                  (0<<1) | (0<<0);

        LCDSADDR1 = ((LCDFRAMEBUFFER>>22)<<21) | LOWER21BITS(LCDFRAMEBUFFER>>1);
        LCDSADDR2 = LOWER21BITS((LCDFRAMEBUFFER+ \
                    (LINEVAL_TFT_480272+1)*(HOZVAL_TFT_480272+1)*4)>>1);
        LCDSADDR3 = (0<<11) | (LCD_XSIZE_TFT_480272*2);

        /* 禁止临时调色板寄存器 */
        TPAL = 0;

        fb_base_addr = LCDFRAMEBUFFER;
        bpp = 24;
        xsize = 480;
        ysize = 272;       
        break;

这个函数就是设置2440所需要配置的7个寄存器,和16bbp不同的地方已用红色标出。

最后,在framebuffer.c中的PutPixel函数也需要修改,之前没调成功,让我找了很久才发现是这里的问题,也需要加一个case分支:

case 24:
{
UINT32 *addr = (UINT32 *)fb_base_addr + (y * xsize + x);
*addr = (UINT32) color;
break;
}

至此已经设置完毕,调试成功,屏幕显示正确,至于颜色对不上的问题以后需要时再去研究。

0 0
原创粉丝点击