S3C2440裸机学习[2] - LCD驱动原理及代码分析[二]

发布者:Blissful5最新更新时间:2021-11-08 来源: eefocus关键字:S3C2440  裸机学习  LCD驱动 手机看文章 扫描二维码
随时随地手机看文章

下面看看2440test里面的lcd.c文件

static void PutPixel(U32 x,U32 y,U16 c)

{

    if(x        LCD_BUFFER[(y)][(x)] = c;

}

很容易发现TFT LCD上显示单个像素的函数实际上很简洁
看来似乎只需要LCD_BUFFER[(y)][(x)] = c这一句话
下面就来分析下,是如何通过这一句话来实现在LCD上显示单个像素的
先分析下LCD_Init()即LCD初始化函数

rLCDCON1 = (LCD_PIXCLOCK << 8) | (3 <<  5) | (12 << 1);

LCDCON1 0x4d000000

#define LCD_WIDTH 240

#define LCD_HEIGHT 320

#define LCD_PIXCLOCK 4

#define LCD_RIGHT_MARGIN 36

#define LCD_LEFT_MARGIN 19

#define LCD_HSYNC_LEN 5

#define LCD_UPPER_MARGIN 1

#define LCD_LOWER_MARGIN 5

#define LCD_VSYNC_LEN 1

CLKVAL[17:8] = 4

TFT: VCLK = HCLK / [(CLKVAL+1) * 2] ( CLKVAL>=0 )

MMODE[7] = 0

PNRMODE[6:5] = 11       TFT LCD panel

BPPMODE[4:1] = 1100     16bpp for TFT

ENVID[0] = 0            Disable


rLCDCON2 = (LCD_UPPER_MARGIN << 24) | ((LCD_HEIGHT - 1) << 14) | (LCD_LOWER_MARGIN << 6) | (LCD_VSYNC_LEN << 0);

LCDCON2 0x4d000004

VBPD = 1
VBPD(vertical back porch):表示在一帧图像开始时,垂直同步信号以后的无效的行数,对应驱动中的upper_margin

LINVAL = 240 – 1
LINVAL:LCD屏的垂直大小

VFPD = 5
VFPD(vertical front porch):表示在一帧图像结束后,垂直同步信号以前的无效的行数,对应驱动中的lower_margin

VSPW = 1
VSPW(vertical sync pulse width):表示垂直同步脉冲的宽度,用行数计算,对应驱动中的vsync_len


rLCDCON3 = (LCD_RIGHT_MARGIN << 19) | ((LCD_WIDTH  - 1) <<  8) | (LCD_LEFT_MARGIN << 0);

LCDCON3 0x4d000008

HBPD = 36

HBPD(horizontal back porch):表示从水平同步信号开始到一行的有效数据开始之间的VCLK的个数,对应驱动中的left_margin

HOZVAL = 320 – 1

HOZVAL:LCD屏的水平大小

HFPD = 19

HFPD(horizontal front porth):表示一行的有效数据结束到下一个水平同步信号开始之间的VCLK的个数,对应驱动中的right_margin

 

rLCDCON4 = (13 <<  8) | (LCD_HSYNC_LEN << 0);

LCDCON4 0x4d00000c

MVAL = 13

HSPW = 5

HSPW(horizontal sync pulse width):表示水平同步信号的宽度,用VCLK计算,对应驱动中的hsync_len

#    define LCD_CON5 ((1<<11) | (1 << 9) | (1 << 8) | (1 << 3) | (1 << 0))
rLCDCON5   =  LCD_CON5;

LCDCON5 0x4d000010

HWSWP = 1           Swap Enable

PWREN = 1           Enable PWREN signal

INVVFRAME = 1       VFRAME/VSYNC pulse polarity Inverted    选择负极性脉冲

INVVLINE = 1        VLINE/HSYNC pulse polarity Inverted     选择负极性脉冲

FRM565 = 1          5:6:5 Format

rLCDINTMSK |= 3;

INT_FrSyn = 1       LCD frame synchronized interrupt Masked

INT_FiCnt = 1       LCD FIFO interrupt Masked

 

rTCONSEL &= (~7);

rTCONSEL &= ~((1<<4) | 1);

MODE_SEL = 0        Sync mode

RES_SEL = 0         320 x 240

LPC_EN = 0          LPC3600 Disable

 

rTPAL = 0x0;

Temporary palette register enable bit Disable

 

volatile static unsigned short LCD_BUFFER[SCR_YSIZE][SCR_XSIZE];

#define LCD_ADDR ((U32)LCD_BUFFER)

#define M5D(n)  ((n)&0x1fffff)

rLCDSADDR1 = ((LCD_ADDR >> 22) << 21) | ((M5D(LCD_ADDR >> 1)) <<  0);

rLCDSADDR2 = M5D((LCD_ADDR + LCD_WIDTH * LCD_HEIGHT * 2) >> 1);

rLCDSADDR3 = LCD_WIDTH;

LCDSADDR1 0x4d000014 帧缓冲起始寄存器1

LCDBANK[29:21] = (U32)LCD_BUFFER >> 22

These bits indicate A[30:22] of the bank location for the video buffer in the system memory. LCDBANK value cannot be changed even when moving the view port. LCD frame buffer should be within aligned 4MB region, which ensures that LCDBANK value will not be changed when moving the view port. So, care should be taken to use the malloc() Function
系统内存地址A[30:22]处的Bank位置为图像缓冲。LCDBANK的值在视图移动的值在视图移动时不能改变,LCD帧缓冲应该在4MB区域对齐,保证LCDBANK的值在移动视图时不会改变。


LCDBASEU[20:0] = ((U32)LCD_BUFFER >> 1)&0x1fffff

For dual-scan LCD : These bits indicate A[21:1] of the start address of the upper address counter, which is for the upper frame memory of dual scan LCD or the frame memory of single scan LCD.
For single-scan LCD : These bits indicate A[21:1] of the start address of the LCD frame buffer.
双扫描:表明高地址计数器的起始地址A[21:1],用于LCD双扫描的上部帧内存或者单扫描的帧内存
单扫描:表明LCD帧缓冲的起始地址A[21:1]

LCDSADDR2 0x4d000018帧缓冲起始寄存器2

LCDBASEL[20:0] = ((LCD_ADDR + LCD_WIDTH * LCD_HEIGHT * 2) >> 1)& 0x1fffff
                = (LCD_ADDR >> 1 + LCD_WIDTH * LCD_HEIGHT)& 0x1fffff

For dual-scan LCD: These bits indicate A[21:1] of the start address of the lower address counter, which is used for the lower frame memory of dual scan LCD.
For single scan LCD: These bits indicate A[21:1] of the end address of the LCD frame buffer.
LCDBASEL = ((the frame end address) >>1) + 1
= LCDBASEU + (PAGEWIDTH+OFFSIZE) x (LINEVAL+1)
双扫描:表明低地址计数器的起始地址A[21:1],用于LCD双扫描的下部帧内存或者单扫描的帧内存
单扫描:表明LCD帧缓冲的结束地址A[21:1]

LCDSADDR3 0x4d00001c帧缓冲起始寄存器3

OFFSIZE = 0

PAGEWIDTH = 320 虚拟屏页宽(半字数量)  定义了帧中的视图域宽度

程序分析至此,大概已经清楚是如何通过LCD_BUFFER[(y)][(x)] = c来实现在LCD上显示单个像素了。


就是在设置好各个LCD寄存器之后,通过将LCD_BUFFER地址与LCDBANK以及LCDBASEU、LCDBASEL对应之后,通过改变LCD_BUFFER里不同单元存储的值(即像素的颜色),即可在LCD相应位置上做出显示。


那么在应用不同LCD的时候,只需对LCDCONx以及LCDSADDRx做出相应的配置,在创建一个数组,做出上述的地址映射即可。


关于VCLK计算,由于配置的是TFT,可用到公式VCLK = HCLK / [(CLKVAL+1) * 2] ( CLKVAL>=0 )
设置的FLK为400MHz,HCLK为100MHz,CLKVAL = 4,因此VLCK = 10MHz


关键字:S3C2440  裸机学习  LCD驱动 引用地址:S3C2440裸机学习[2] - LCD驱动原理及代码分析[二]

上一篇:S3C2440裸机学习[2] - LCD驱动原理及代码分析[一]
下一篇:Mini2440裸机液晶屏TD35驱动

推荐阅读最新更新时间:2024-11-02 13:42

S3C2440中断与异常定义与基本知识
1. S3C2440中断初始化: #define BIT_ALLMSK (0xffffffff) void Isr_Init(void) { pISR_UNDEF=(unsigned)HaltUndef; pISR_SWI =(unsigned)HaltSwi; pISR_PABORT=(unsigned)HaltPabort; pISR_DABORT=(unsigned)HaltDabort; rINTMOD=0x0; // All=IRQ mode Address:0x4A000004 =1 FIQ mode; =0 IRQ mode rINTMSK=BIT_ALLMSK; // All interrupt is ma
[单片机]
S3C2440看门狗定时器原理
  看门狗定时器(Watchdog)   相信大家都看过中国移动前些时间做的一个广告,从城市到山村,到青藏高原,在哪儿都有中国移动的网络,到哪儿都能打电话,由此可以联想到中国移动在全国有无数个信号基站,很多基站建设在环境比较恶劣的地方,我们来思考一个问题?假如,有一天某个基站出了问题不能正常工作了,毫无疑问,移动的工作人员会带各种检测设备去进行修理,如果是出现非硬件故障(如用户电话服务突然巨增,造成繁忙死机或电磁干扰造成CPU运行出错等),导致基站服务器出现异常死机,工作人员只需要进行一个操作,重启一下即可。如果该基站安装在青藏高原上,这样一次上去,成本是很大的。退一步讲,这种情况虽然成本很高,但是还是可以修复的,如果这种情况出现
[单片机]
<font color='red'>S3C2440</font>看门狗定时器原理
《韦东山视频第二期》——LCD驱动
一、LCD驱动程序框架分析 app: open( /dev/fb0 , ...) 主设备号:29, 次设备号:0 ———————————————————————————————————————————————————— kernel:(核心文件/drivers/video/fbmem.c) fb_open int fbidx = iminor(inode); struct fb_info *info; info = registered_fb ; //根据次设备号获得从底层注册的struct fb_info结构
[单片机]
一种测试系统数字稳压电源的设计方案
  0 引 言   直流稳压电源是一种比较常见的电子设备,一直被广泛地应用在电子电路、实验教学、科学研究等诸多领域。近年来,嵌入式技术发展极为迅速,出现了以单片机、嵌入式ARM 为核心的高集成度处理器,并在自动化、通信等领域得到了广泛应用。电源行业也开始采用内部集成资源丰富的嵌入式控制器来实现数字稳压电源的控制系统。数字稳压电源是用脉宽调制波(PWM)来控制MOS管等开关器件的开通和关闭,从而实现电压电流的稳定输出。数字稳压电源还具备自诊断功能,能实现过压过流保护、故障警告等。   相比之前的模拟电源,数字稳压电源大大减少了在模拟电源中常见的误差、老化、温度漂移、非线性不易补偿等诸多问题,提高了电源的灵活性和适应性。将SAMS
[单片机]
一种测试系统数字稳压电源的设计方案
U-Boot移植
1. 安装韦东山的虚拟版的ubuntu 9, 里面交叉编译啥的都弄好了, 直接用, 然后把workstation共享目录打开, 指向uboot的压缩包所在目录. 2. 在虚拟机上, 打开ssh, 通过ssh, 进/mnt/hgfs/ 把uboot压缩包解压了. 3. 编辑Makefile, 在smdk2400下面增加两行, 注意要好tab键 smdk2400_config : unconfig @$(MKCONFIG) $(@:_config=) arm arm920t smdk2400 NULL s3c24x0 tx2440_config : unconfig @$(MKCONFIG) $(@:_conf
[单片机]
ARM9 S3C2440—ADC和触摸屏控制详解
S3C2440芯片内部共有8路A/D转换通道,AIN0-AIN7,转换器只有一个,转换精度为10位,最大转换率为2.5MHz A/D 转换器时钟下的500 KSPS。A/D 转换器支持片上采样-保持功能和掉电模式的操作。在常见的设计中,一般AIN4,AIN5,AIN6,AIN7被用作四线电阻触摸屏的YM、YP、XM、XP通道,剩余的AIN0~AIN3被引出,其中AI0外接一个可调电阻。 ADC的配置流程如下: 1、ADCDLY(P446) rADCDLY=50000; //Normal conversion mode delay about
[单片机]
嵌入式系统中LCD驱动的实现原理
结合三星公司ARM9系列嵌入式处理器S3C2410,讲解如何进行LCD驱动程序模块化编程及如何将驱动程序静态加载进系统内核。 LCD (液晶显示)模块满足了嵌入式系统日益提高的要求,它可以显示汉字、字符和图形,同时还具有低压、低功耗、体积小、重量轻和超薄等很多优点。随着嵌入式系 统的应用越来越广泛,功能也越来越强大,对系统中的人机界面的要求也越来越高,在应用需求的驱使下,许多工作在Linux下的图形界面软件包的开发和移植 工作中都涉及到底层LCD驱动的开发问题。因此在嵌入式系统中开发LCD驱动得以广泛运用。 本文以三星公司ARM9内核芯片S3C2410的LCD接口为基础,介绍了在Linux平台上开发嵌入式LCD驱动程序
[电源管理]
基于S3C2440的ARM9基础程序设计及分析
最近学习了ARM9基础程序的设计,记录下所学心得,希望对初学者提供一些帮助。学习ARM程序要注意方法,先去芯片手册的相应模块部分的结构原理框图,搞清楚所使用的模块的基本原理,然后根据框图搞清楚需要设置哪些对应的寄存器,再根据时序图搞明白相应寄存器应该怎样设置,再接着理清楚你所写程序的大概流程,最后就可以动手写程序了。 如果把流程理清楚了,你的程序基本上已经成功一半了。 我使用的是S3C2440 ARM芯片, 一 LED流水灯程序 流程: 1,设置端口控制寄存器将LED对应端口设为输出模式 (GPxCON)。 2,向端口对应的数据寄存器发送数据(GPxDAT)。 实现: //这段宏定义了使对应LED亮应该送的数据 #
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved