嵌入式裸机开发学习: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;
}
至此已经设置完毕,调试成功,屏幕显示正确,至于颜色对不上的问题以后需要时再去研究。
- 嵌入式裸机开发学习:2440驱动LCD的24bpp模式相关设置
- LCD裸机驱动
- S5PV210----裸机LCD驱动
- [DSP开发]嵌入式系统中LCD驱动的实现原理
- 嵌入式Linux裸机开发(十五)——LCD
- 嵌入式裸机开发学习:2440中断体系学习
- ARM9 mini2451裸机学习——LCD驱动学习 2
- 六、2440裸机开发 lcd操作
- Arm嵌入式开发之LCD驱动
- S3C2440裸机学习 - LCD驱动原理及代码分析[一]
- S3C2440裸机学习- LCD驱动原理及代码分析[二]
- Real6410/S3C6410裸机LCD驱动
- mini2440裸机编程--------LCD驱动
- 【OK6410裸机程序】LCD驱动
- 嵌入式学习-uboot-lesson14-LCD相关
- 2440 裸机 之lcd驱动 编写出现问题及感悟
- 嵌入式学习-驱动开发前奏-lesson1-内核模块相关知识
- 【转】嵌入式Linux之我行——LCD背光驱动在2440上的实例开发
- Git分支管理策略
- 正则表达式\w并不完全等于[A-Za-z0-9]
- VBS基础篇 - 数据类型
- IBM Webseal Portal 解决iframe跨域问题方法
- 大话重构连载11:小步快跑是这样玩的
- 嵌入式裸机开发学习:2440驱动LCD的24bpp模式相关设置
- vi 命令大全
- 反向投影的意义
- 简单的函数热点分析类
- BSS段、数据段、代码段、堆与栈
- Apache HTTP Server 与 Tomcat 的三种连接方式介绍
- C++通过OCCI操作Oracle数据库详解
- 《Linux程序设计》学习笔记11——进程和信号
- 芯片组扫盲