【学习笔记】图解LCD硬件原理 && 调色板与Framebuffer原理 && 根据S3C2440数据手册设置对应寄存器

本文深入探讨S3C2440的LCD控制器,包括LCD硬件原理、时序图、调色板与Framebuffer的概念。详细介绍了如何根据芯片手册设置LCD控制器的相关寄存器,以及如何处理不同BPP下的颜色转换。同时,文章涵盖了从FrameBuffer到LCD显示的数据流程,并展示了如何进行点、线、圆的绘制以及字符显示的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

001LCD硬件原理

LCD操作原理

在这里插入图片描述

  • LCD屏幕上的点称为像素
  • 屏幕后面有电子枪【红绿蓝】:一边移动,一边发出颜色
  • 每来一个clk移动一个像素
  • R、G、B三线确定颜色
  • 接收到HSYNC(水平同步信号)脉冲,电子枪从最右边跳到最左边。(跳到下一行)
  • 接收到VSYNC[垂直同步信号]最下边跳到最上边。(跳到原点)
LCD时序图

在这里插入图片描述

LCD硬件原理图

在这里插入图片描述

006 LCD设置

打开LCD4.3芯片手册,根据芯片手册设置

在这里插入图片描述
在这里插入图片描述

2440_LCD时序图

在这里插入图片描述

LCD display config

在这里插入图片描述

可以通过调整四边黑框调整屏幕边框

BPP(bit per pixel)

BPP:在FrameBuffer中每个像素占据多少位

  • 硬件上LCD的BPP是确定的
    但是可以对LCD进行封装
  • 16条线,每个像素占16位数据,16BPP
    在这里插入图片描述

002 S3C2440_LCD控制器

功能:
  • 1.从内存中(FrameBuffer取出某个像素的数据

FrameBuffer的地址告诉LCD控制器,BPP,分辨率

  • 2.配合其他信号把数据发送给LCD:

时序告诉LCD控制器,设置引脚的极性

BLOCK DIAGRAM
16BPP

在这里插入图片描述

调色板[ palette]
  • 本质:内存
  • 16BPP中,本来用16bit表示1像素,也可用利用调色板,用8位表示;8BPP:伪彩色16/24BPP:真彩色

那么当使用像素深度为8pp时候,像素深度和我们的带宽不一致,我们的颜色要用16位表示,如果直接用上肯定不可能,那我们就可以选择用调色板,调色板中存放了256种16bpp的颜色,这时候我们color存放的就不是真实的颜色值了,而是存放的是调色板中256种颜色的索引,成线性关系一一对应,这样我们大大减轻了系统的负担。用16bpp还是8bpp这得取决实际情况,16bpp肯定比8pp清晰,但同时带来的负荷也更加重。

  • 过程:FrameBuffer中8bit —> LCD控制器 —> 调色板中取16bit【用8bit作为索引,取出真正的颜色】 —> LCD

003LCD编程_框架与准备

  • 目标:
  • 讲解后续程序的框架
  • 准备一个支持NAND、NOR启动的程序
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pMYeoa9H-1580909221579)(en-resource://database/1932:1)]

在这里插入图片描述


在这里插入图片描述

定义结构体
  • 定义引脚极性结构体
typedef struct pins_polarity{
   
	int vclk;	/* normal:在下降沿获取 */
	int rgb;	/* normal:高电平表示1 */
	int hsync;  /* normal:高脉冲 */
	int vsync;  /* normal:高脉冲 */

}pins_polarity,*p_pins_polarity;
  • 定义时序结构体
typedef struct time_sequence{
   
	/* 垂直方向 */
	int tvp;/* vysnc脉冲宽度 */
	int tvb;/* 上边黑框,Vertical Back porch */
	int tvf;/* 下边黑框,Vertical Front porch */

	/* 水平方向 */
	int thp;/* hysnc脉冲宽度 */
	int thb;/* 左边黑框,Horizontal Back porch */
	int thf;/* 右边黑框,Horizontal Front porch */
}time_sequence,*p_time_sequence;
  • 定义lcd参数结构体
typedef struct lcd_params{
   
	/* 引脚极性 */
	pins_polarity pins_pol;
	
	/* 时序 */
	pins_sequence time_seq;
	
	/* 分辨率,bpp */
	int xres;
	int yres;
	int bpp;
	
	/* framebuffer的地址 */
	unsigned int fb_base;

}lcd_params,*p_lcd_params;

004LCD_编程_抽象出重要结构体

结构体传参

在这里插入图片描述

005LCD_LCD控制器

  • S3C2440_controller.c:根据S3C2440数据手册,设置LCD控制器相关寄存器
引脚初始化
void jz2440_lcd_pin_init(void)
{
   
	/* 初始化引脚 : 背光引脚*/
	GPBCON &= ~0x3;
	GPBCON |= 0x01;
	
	/* 初始化引脚 : LCD专用引脚*/
	GPCCON = 0xaaaaaaaa;
	GPDCON = 0xaaaaaaaa;

	/* PWREN */
	GPGCON |= (3<<8);
}
LCDCON1

在这里插入图片描述

    /* [17 : 8] :clkval,VCLK = HCLK / [(CLKVAL+1) x 2]
	 *					9    = 100M/ [(CLKVAL+1) x 2] ,clkval = 4.5 = 5
	 * 					clkval = 100/vclk/2-1
	 * [6 : 5]0b11,TFT lcd
	 * [4:1]: bpp mode
	 * [0]  : LCD video output and the logic enable/disable.
	 */
	int clkval = (double)HCLK/plcdparams ->time_seq.vclk/2-1+0.5;
	int bppmode = plcdparams->bpp == 8 ? 0xb :\
				   plcdparams->bpp == 16 ? 0xc:\
				   0xd;  /* 0xd:24bpp */
	LCDCON1 = (clkval << 8) | (3<<5) | (bppmode<<1);
LCDCON2
    /* [ 31:24 ] :VBPD    = tvb - 1
	 * [ 23:14 ] :lineval = line - 1
	 * [ 13:6  ] :vfpd    = tvf 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值