历史上的今天
返回首页

历史上的今天

今天是:2024年12月13日(星期五)

正在发生

2021年12月13日 | tiny4412 裸机程序 八、重定位到DRAM及LCD实验

2021-12-13 来源:eefocus

一、实验原理

上一章已经解释的很清楚了,如何将所要运行的user_bin程序定位到DRAM中,这一章要进行重定位到DRAM后运行LCD程序,实际上一章中BL2中程序可以不用改动,直接重写我们的USER目录下的程序即可,将USER目录下的LED灯闪烁程序用LCD程序替换就行,最后编译出的程序名字也叫user_bin.bin即可,这样也可以用上一章中的fast_fuse.sh进行烧写到SD卡运行。


1、LCD控制器

Exynos4412的LCD控制器可以通过编程支持不同LCD屏的要求,例如行和列像素数,数据总线宽度,接口时序和刷新频率等。LCD控制器的主要作用,是将定位在系统存储器中的显示缓冲区中的LCD图像数据传送到外部LCD驱动器,并产生必要的控制信号,例如RGB_VSYNC,RGB_HSYNC, RGB_VCLK等。

 


图8-1、Exynos4412 LCD控制器框图


如上图8-1所示,在Exynos4412规格书中截图,LCD控制器的构成主要由VSFR,VDMA,VPRCS , VTIME和视频时钟产生器几个模块组成:

(1)、VSFR由121个可编程控制器组,一套gammaLUT寄存器组(包括64个寄存器),一套i80命令寄存器组(包括12个寄存器)和5块256*32调色板存储器组成,主要用于对lcd控制器进行配置。

(2)、VDMA是LCD专用的DMA传输通道,可以自动从系统总线上获取视频数据传送到VPRCS,无需CPU干涉。

(3)、VPRCS收到数据后组成特定的格式(如16bpp或24bpp),然后通过数据接口(RGB_VD, VEN_VD, V656_VD or SYS_VD)传送到外部LCD屏上。

(4)、VTIME模块由可编程逻辑组成,负责不同lcd驱动器的接口时序控制需求。VTIME模块产生 RGB_VSYNC, RGB_HSYNC, RGB_VCLK, RGB_VDEN,VEN_VSYNC等信号。


Exynos4412的LCD主要特性:

(1)、支持4种接口类型:RGB/i80/ITU601(656)/YTU444

(2)、支持单色、4级灰度、16级灰度、256色的调色板显示模式

(3)、支持64K和16M色非调色板显示模式

(4)、支持多种规格和分辨率的LCD

(5)、虚拟屏幕最大可达16MB

(6)、5个256*32位调色板内存

(7)、支持透明叠加


2、接口信号

LCD的FIMD显示控制器全部信号定义如下表8-1所示

表8-1、LCD接口信号表

Signal

I/O

Description

LCD Type

LCD_HSYNC

O

水平同步信号

 

 

RGB I/F

LCD_VSYNC

O

垂直同步信号

LCD_VDEN

O

数据使能

LCD_VCLK

O

视频时钟

LCD_VD[23:0]

O

LCD像素数据输出

SYS_OE

O

输出使能

VSYNC_LDI

O

Indirect i80接口,垂直同步信号

 

 

 

i80 I/F

SYS_CS0

O

Indirect i80接口,片选LCD0

SYS_CS1

O

Indirect i80接口,片选LCD1

SYS_RS

O

Indirect i80接口,寄存器选择信号

SYS_WE

O

Indirect i80接口,写使能信号

SYS_VD[23:0]

IO

Indirect i80接口,视频数据输入输出

SYS_OE

O

Indirect i80接口,输出使能信号

VEN_HSYNC

O

601接口水平同步信号

 

 

 

ITU 601/656 I/F

VEN_VSYNC

O

601接口垂直同步信号

VEN_HREF

O

601接口数据使能

V601_CLK

O

601接口数据时钟

VEN_DATA[7:0]

O

601接口YUV422格式数据输出

V656_DATA[7:0]

O

656接口YUV422格式数据输出

V656_CLK

O

656接口数据时钟

VEN_FIELD

O

601接口域信号

 

其中主要的RGB接口信号:

(1)、LCD_HSYNC:行同步信号,表示一行数据的开始,LCD控制器在整个水平线(整行)数据移入LCD驱动器后,插入一个LCD_HSYNC信号;

(2)、LCD_VSYNC: 帧同步信号,表示一帧数据的开始,LCD控制器在一个完整帧显示完成后立即插入一个LCD_VSYNC信号,开始新一帧的显示;VSYNC信号出现的频率表示一秒钟内能显示多少帧图像,称为“显示器的频率”

(3)、LCD_VCLK:像素时钟信号,表示正在传输一个像素的数据;

(4)、LCD_VDEN:数据使能信号;

(5)、 LCD_VD[23:0]: LCD像素数据输出端口


3、RGB信号的时序

如下图8-2是LCD的RGB接口工作时序图,图中各时钟延时参数的含义如下,这些配置可以在所使用的LCD规格书中查取:


(1)、相关参数说明

VBPD(vertical back porch):表示在一帧图像开始时,垂直同步信号以后的无效的行数。

VFBD(vertical front porch):表示在一帧图像结束后,垂直同步信号以前的无效的行数。VSPW(vertical sync pulse width):表示垂直同步脉冲的宽度,用行数计算。

HBPD(horizontal back porch):表示从水平同步信号开始到一行的有效数据开始之间的VCLK的个数。

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

HSPW(horizontal sync pulse width):表示水平同步信号的宽度,用VCLK计算。


(2)、帧的传输过程

VSYNC信号有效时,表示一帧数据的开始,信号宽度为(VSPW +1)个HSYNC信号周期,即(VSPW +1)个无效行;

VSYNC信号脉冲之后,总共还要经过(VBPD+ 1)个HSYNC信号周期,有效的行数据才出现; 所以,在VSYNC信号有效之后,还要经过(VSPW +1  + VBPD + 1)个无效的行;

随即发出(LINEVAL+ 1)行的有效数据;

最后是(VFPD + 1)个无效的行。


(3)、行中像素数据的传输过程

HSYNC信号有效时,表示一行数据的开始,信号宽度为(HSPW+ 1)个VCLK信号周期,即(HSPW +1)个无效像素;

HSYNC信号脉冲之后,还要经过(HBPD +1)个VCLK信号周期,有效的像素数据才出现;

随后发出(HOZVAL+1)个像素的有效数据;

最后是(HFPD +1)个无效的像素。


(4)、将VSYNC、HSYNC、VCLK等信号的时间参数设置好之后,并将帧内存的地址告诉LCD控制器,它即可自动地发起DMA传输从帧内存中得到图像数据,最终在上述信号的控制下RGB数据出现在数据总线VD[23:0]上。用户只需要把要显示的图像数据写入帧内存中。


其实现实的图像有像素点组成行、行组成场、场组成动画、动画叠加也就是3D的出现,也就是我们所说的“点动成线、线动成面、面动成体”。



图8-2、LCD的RGB工作时序图


4、LCD的硬件接口



图8-3、LCD的部分硬件电路图


5、16M(24BPP)色的显示模式

由于我的Tiny4412所用屏幕是S07,是24bit(A888)显示模式,即用24位的数据来表示一个像素的颜色,每种颜色使用8位。 LCD控制器从内存中获得某个像素的24为颜色值后,直接通过VD[23:0]数据线发送给LCD;在内存中,使用4个字节(32位)来表示一个像素,其中的3个字节从高到低分别表示红、绿、蓝,剩余的1个字节无效;

以上内容是我从以前调试uboot中LCD显示查阅到的资料整合,其主要来自于网络,网络上还有各种介绍LCD的相交资料,有兴趣的朋友可以自己深究,也可以参考我即将整理的UBOOT相关文档。


二、程序说明

下面对程序进行简要说明,这时我只对USER目录下的程序实现过程进行必要说明,其他相关细节,请自行对照手册来分析程序,这一章的程序我也进行必要的注释,

首先来看一下Makefile和sdram.lds start.S几个文件


1、USER/Makefile sdram.lds start.S

上面三个程序的说明请参考上一章,其主要作用就是将user_bin.bin中的而start.s链接地址设置为0X43E00000让程序重定们DRAM中时,就执行这个程序,而start.s唯一做的事就是跳转到main.c中的main函数执行。


2、USER/main.c

Mian函数很清楚,一开始调用lcd_init();然后调用lcd_clear_screen(0x000000)清屏,接着画一个十字,再画了几条水平线和一条垂直线,最后让LDE灯一直闪烁。


3、USER/LCD.C

首先需要说明的一点时,这个程序我参考了网上很多人关于S5PV210的写法,但或多或少总存在一些问题,最后在FriendlyARM的BBS的论坛上一个ID号为“赵远远”提供的lcd_chinese_char程序,这个程序初始化流程可以很好的工作。所以,这个程序里的初始化部分主要取自于此!


lcd_init()

3.1、寄存器设置方法

如下面两句话所示:

#define LCDBLK_CFG (*(volatile unsigned int *)0x10010210)

LCDBLK_CFG = a;

语句中0x10010210是寄存器LCDBLK_CFG的地址,(volatileunsigned int *)0x10010210是将此0x10010210值强制转换成一个指向unsigned int的指针,volatile作用是防止编译器优化,再在外面加一个*就是取0x10010210地址处的值了,所以用LCDBLK_CFG就可改写0x10010210处的数据,

下面来按着LCD的初始化顺序进行说明。


3.2、定义IO引脚功能为RGB接口。

由上图8-3所示,所用的GPIO口分别是GPIO的F口的0/1/2/3四组,查看手册可知要想将其设置为LCD的RGB接口,只需要将其设置为2即可。同时将其IO口设置成为内部上拉,且将其驱动能力设置为最强代码如下:

GPF0CON = 0x22222222;                                    

GPF1CON = 0x22222222;

GPF2CON = 0x22222222;

GPF3CON = 0x00222222;

// Set pull-up,down disable

GPF0PUD = 0x0000FFFF;

GPF1PUD = 0x0000FFFF;

GPF2PUD = 0x0000FFFF;

GPF3PUD = 0x00000FFF;

 

//MAX drive strength---------//

GPF0DRV = 0x0000FFFF;

GPF1DRV = 0x0000FFFF;

GPF2DRV = 0x0000FFFF;

GPF3DRV = 0x00000FFF;

3.3、接着设置LCD相关时钟寄存器

这一步主要设置选择LCD时钟输入源为MPLL,且不对其进行分频,同时设置LCDBLK_CFG使其使用FIMD接口,且设置LCDBLK_CFG2使其PWM输出使能,其实,LCDBLK_CFG2可以不用设置。


3.4、清除Fram Buffer处的数据

这里调用一个Memset()函数,对地址0x54000000处,0X200000大小的DRAM进行初始化为统一值,一开始我设置为,后来为了调试,我将其设置为0xff00,即可以显示为绿色。


3.5、设置VIDCONx,设置接口类型,时钟分频,极性以及使能LCD控制器等

A、VIDCON0参考数据手册,这一个寄存器主要设置接口类型和时钟分频,这里仅仅设置了其时钟分频值。参考S07的手册,找到时像素时钟。由于我们的MPLL为800MHZ,所以这里设置值,根据手册进行计算,要得到33.3MHZ左右的像素时钟,所以寄存器第6~13bit设置为23.其他都保持为0即可。


代码如下:

VIDCON0 = (23 << 6);

此代码中也给出了如下代码风格的写法,后面很多寄存器配置我也均写好相类似风格的代码,但我要遗憾的说一声,这种风格的写法且总不能执行成功,LCD像是初始化成功,但且不能将图形给画出,这在此比对代码比对了很久,也没有找出原由来,所以这里代码中可运行的部分是受高手唾弃的一种写作风格,同时也给出了另一种写作风格的代码,希望细心的网友能发现其中那里我设置有差别,而让后一种风格的代码能正常运行。

// #define EXYNOS_VIDCON0_CLKVAL_F(x)                       (((x) & 0xff) << 6)

//VIDCON0 = EXYNOS_VIDCON0_CLKVAL_F(23);  //not use this method ,it does not work???

B、VIDCON1主要设置像表时钟信号一直存在,且高电平有效,而IHSYNC=1,极性反转IVSYNC=1,极性反转,这是由于S07的时序图中VSYNC和HSYNC都是低脉冲有效,而Exynos4412芯片手册时序图,如上图8-2所示:VSYNC和HSYNC都是高脉冲有效,所以需要反转。

C、VIDTCONx用来设置时序和长宽等参数,这里就主要设置VBPD(vertical back porch)、 VFBD(vertical frontporch)、VSPW(vertical sync pulse width)、HBPD(horizontal backporch)、 HFPD(horizontal sync pulse width)等参数,参数的意义前面已有简要说明,这里简单用图片的方式说明如何取值。

如下图8.4所示是VIDTCON0取值过程,VIDTCON0设置帧同步时序。



图8-4、VIDTCON0寄存器取值参考图

VBPDE与RGB接口无关,不用关心,所以其代码设置如下:

VIDTCON0 = (22 << 16) | (21 << 8) | (0);

如下图8.5所示是VIDTCON1取值过程,VIDTCON1设置像素同步时序。



图8-5、VIDTCON1寄存器取值参考图

VFPDE与RGB接口无关,不用关心,所以其代码设置如下:

VIDTCON1 = (45 << 16) | (209 << 8) | (0);

如下图8-6所示,为寄存器VIDTCON2设置取值要点:

图8-6、VIDTCON2寄存器取值参考图

VIDTCON2 = (479 << 11) | 799;

D、设置WINCON0寄存器,即设置数据格式。

Exynos4412的LCD控制器有overlay功能,它支持5个window。这里只使用window0,设置其代码RGB模式为24bit(A888)且使能window0,其相关的代码设置如下:

WINCON0 = (11 << 2) | 1;

E、设置VID0SD0A/B/C,即设置Window0的坐标系。

相关代码如下:

VIDOSD0A = 0;

VIDOSD0B = (799 << 11) | 479;

VIDOSD0C = 480 * 800;

F、配置VIDW00ADD0B0和VIDW00ADD1B0,设置framebuffer的地址;

相关代码如下:

VIDW00ADD0B0 = LCD_VIDEO_ADDR;

VIDW00ADD1B0 = LCD_VIDEO_ADDR + VIDOSD0C * 4;

G、配置SHADOWCON和WINCHMAP2、选择使能DMA通道0。由于我们使用的是Window0,所以需要使能DMA通道0;

相关代码如下:

SHADOWCON |= 1;

 

WINCHMAP2 &= ~(7 << 16);

WINCHMAP2 |= 1 << 16;

WINCHMAP2 &= ~7;

WINCHMAP2 |= 1;

H、最后设置VIDCON0低两位使能LCD,代码如下:

VIDCON0 |= 3;

我们不需要使用很强大的功能,所有只需设置这几个寄存器即可。


lcd_draw_pixel()

经过lcd_init()初始化LCD控制器之后,我们就可以在LCD上描绘图形了,代码里的所有绘制图形的函数都是基于lcd_draw_pixel()这个函数,它的作用是在LCD上描绘一个点,通过描绘一个个的点最终会可以组成图形了。在LCD上描点的本质就是往Frame Buffer中写入颜色值而已。LCD控制器自己会去读所定义的Frame Buffer内存位置处读取数据,然后输出到LCD。

lcd_draw_pixel()这个函数以及后面几个画水平线、垂直线和十字的函数我完成COPY了《Linux平台下Mini210S裸机程序开发指南》里的代码,下面我们仅仅COPY说明一下此函数,其代码如下:

void lcd_draw_pixel(int row, int col, intcolor)

{

unsigned long * pixel = (unsigned long *)LCD_VIDEO_ADDR;

*(pixel + row * COL + col) = color;

}

其中LCD_VIDEO_ADDR = 0x54000000,即framebuffer的基地址,这个值只要是DRAM中,一块可分配16M大小的DRAM的一个地址即可。row和col用来决定偏移,color是颜色值,只要在framebuffer中对应的地址处写入颜色值就可以在LCD上描绘出该点。

后面其他函数很简单,这里就不费时间做过多说明。


三、完整的烧写过程

已将SD卡插入电脑,假设linux识别了SD卡,其识别号为sdb。执行下面命令:

# chmod 777 –R 7_sdram_LCD

# cd 7_sdram_LCD

# make

# ./ fast_fuse /dev/sdb


四、上电实验

将sd卡插入Tiny4412中,选择sd卡启动,和电脑能过串口0连接好,打开一个串口调试助手,然后上电,可以看到以下现象:

串口助手中会显示一些信息,LCD初始化完成后,LCD屏幕首先会显示一整幅的绿色背景。 一两秒钟后,会显示Mian()函数中所画的几条横线和一条竖线以及一个十字,板上的LED灯会一直闪烁。

 

前面说过,这一章中留有一点问题,就是两种写法,同样的设置,为什么第二种代码风格却不能运行,我自己用人眼对比了好多次,也没有发现代码那里有问题,没办法人眼排查,只能试着将串口重新初始化,然后打印出相关信息,找出原因吧。

推荐阅读

史海拾趣

Alpha (Taiwan)公司的发展小趣事

随着全球电子市场的不断扩大,Alpha (Taiwan)公司积极寻求国际合作,拓宽市场渠道。公司与多家国际知名电子企业建立了战略合作关系,共同研发新产品,开拓新市场。此外,公司还积极参加国际电子展会,展示公司的最新技术和产品,吸引更多的潜在客户。这些国际合作的开展,不仅提升了公司的国际影响力,也为公司的长远发展注入了新的动力。

FSP [FSP TECHNOLOGY INC.]公司的发展小趣事

Alpha (Taiwan)公司自创立之初,便致力于电子技术的研发与创新。面对日益激烈的市场竞争,公司不断投入资金,引进先进设备,吸引了一批优秀的研发人才。这些人才凭借深厚的专业知识和敏锐的市场洞察力,成功开发出一系列具有竞争力的电子产品,如高性能的芯片、精密的传感器等。这些产品的推出,不仅提升了公司的市场地位,也为公司的快速发展奠定了坚实基础。

登丰微(GSTEK)公司的发展小趣事

歌普电子不仅注重产品的品质和技术创新,还非常重视客户服务。公司始终秉承“用心服务”的理念,为客户提供全方位的售前、售中和售后服务。无论是产品咨询、技术支持还是售后保障,歌普都能迅速响应并满足客户的需求。这种高效、专业的服务赢得了客户的高度评价和信赖,也为公司的持续发展奠定了坚实的基础。

Eagle Plastic Devices公司的发展小趣事

随着全球环保意识的不断提高,Eagle Plastic Devices公司也开始将环保理念融入产品研发和生产过程中。公司采用环保材料、改进生产工艺、降低能耗和排放等措施,努力降低产品对环境的影响。同时,公司还积极参与环保公益活动,倡导绿色消费和可持续发展。这些举措不仅提升了公司的品牌形象,也为公司带来了更多的市场机遇。

Comchip Technology公司的发展小趣事

随着电子行业的快速发展,Comchip Technology不断追求技术创新和产品升级。公司通过大量研发投入,成功开发出了桥式整流器、高效快速整流器等一系列具有市场竞争力的产品。这些产品不仅提高了电子设备的性能,还降低了能耗,赢得了客户的广泛认可。

FCT electronic公司的发展小趣事

随着技术的不断成熟和市场需求的增长,FCT electronic公司开始寻求市场扩张和多元化发展。公司决定将产品线拓展至刚挠结合板和挠性加热器领域,以满足不同客户的需求。同时,FCT electronic公司还积极开拓国际市场,通过参加国际展览、与海外企业合作等方式,逐渐在全球电子行业中树立了品牌形象。

问答坊 | AI 解惑

简述PCB双层板布线技巧

简述PCB双层板布线技巧    来源:深圳龙人计算机  发布者:站长  时间:2009-11-4  阅读:832次   以电池供电产品之高度竞争市场中,当考虑目标成本时总是要求设计者在设计中使用双层电路板。虽然多层板 ...…

查看全部问答>

wince软键盘的奇怪问题

这两天发现了软键盘的一个奇怪问题。 就是不停的按着两个或者多个数字,偶然性会出现自动出现空格的现象,但是我并没有按退格或者空格键。 并且每次按下的数字都是对应的,触摸屏效果是非常好的。不知道是什么原因造成的。 wince 5.0的BSP 是这 ...…

查看全部问答>

猎头职位 20万寻WINDOWS MOBILE 高级工程师

职位: WINDOWS  MOBILE  高级工程师     人数:5人 薪资水平:10-20万/年(高工)      20万以上(经理) 职位要求:必备任职条件: 1、大学本科及以上学历,计算机/电子/通 ...…

查看全部问答>

请:偶想问下,无线发射与接收模块(ic)的编码和解码原理~~~?谢谢指教:

无线发射与接收模块(ic)的编码和解码原理~~~?如果我想发送10000000,具体的工作过程是怎样的~~~>.…

查看全部问答>

中断没反应,请大家帮忙看一下

目的:想用外部中断测试CAN实现自发自收。首先点亮全部的LED灯,按下键一以CAN_Polling收发数据,如果成功则熄灭一个LED灯,否则熄灭相邻的一个LED灯。按下键2以CAN_Interrupt收发数据,如果成功则熄灭一个LED灯。否则熄灭相邻的一个LED灯。但 ...…

查看全部问答>

堆栈的问题

哪位高手帮我解答一下用F149芯片运行程序出现下面的问题: Wed Mar 12 14:54:19 2008: The stack pointer for stack \'Stack\' (currently Memory:0x9AE) is outside the stack range (Memory:0x9B0 to Memory:0xA00)…

查看全部问答>

LPC1769 驱动LCD1602 的程序如下,小弟初学者,求高手帮忙!!!

下面是我的程序,我把1602的RS,RW,E用P2【3】P2【4】 P2【5】 数据端口用P0【0——7】 系统编译时无错,不知道哪里有问题,请高手指教啊  软件使用的LPCXpresso v3.6.3_317 #include \"LPC17xx.h\" #include #include __CR ...…

查看全部问答>

MSP430G2553用户手册中文.pdf

MSP430G2553用户手册中文.pdf很全的…

查看全部问答>

MSP430X5XX的时钟系统与低功耗模式

430系列单片机中有各种时钟信号,第一次接触免不了一头雾水。而且如果想发挥430低功耗的优势,就不得不对它的时钟系统(Unified Clock System)有所了解。 1. 时钟模块总览 这是MSP430X5XX的时钟系统框图。乍一看很复杂,不过简化之后就清楚多 ...…

查看全部问答>

stm32为什么不需要烧写内核

我只知道stm32用的是cortex_m3的内核, 那请问这个内核是什么时候被烧写到stm32芯片中的? 还是说, 这里的所说的内核只是一种体系结构而不是一种文件??…

查看全部问答>