原本想这个LCD应该很难做,可是一个小时搞出来了,2个小时收拾下,让自己代码美观一点。这个次不能像I2C相同,用最简的代码来完成了,显现一个图片都要很大,4k的sdram底子不够用,就要用到SDRAM了。发动用的nand,sdram,clock,wathc_dog都是曾经的模块,基本上拿来就能用,并没有太难。为了让代码一起具有调试和运转的特性。我想起来了u-boot对这个问题的解决方法,并照做了,作用不不错。原理很简单便是在copy_to_ram_from_nand前边进行一下判别。假如_start的运转地址便是链接地址阐明是在调试,那么就不进行劳动了;假如不是则进行劳动。详细的代码如下:
relocate:/* relocate U-Boot to RAM */
adrr0, _start/* r0 <- current position of code */
ldrr1, =TEXT_BASE/* test if we run from flash or RAM */
cmpr0, r1/* dont reloc during debug */
beqstack_setup
ldr sp, =1024*4 @ 设置仓库
bl copy_to_ram_from_nand @ 到SDRAM中
注释都没有换,不过诚心好用。完好的发动代码如下:
@*
@ File:start.S
@ 功用:设置SDRAM,将程序到SDRAM,然后跳到SDRAM持续碑文
@*
.equ MEM_CTL_BASE, 0x48000000
.equ TEXT_BASE, 0x33F80000
.text
.global _start
_start:
bl pre_lowlevel_init @ 封闭WATCHDOG,屏蔽中止
bl system_clock_init
bl mem_ctrl_asm_init @ 设置存储操控器
bl nand_asm_init
relocate:/* relocate U-Boot to RAM */
adrr0, _start/* r0 <- current position of code */
ldrr1, =TEXT_BASE/* test if we run from flash or RAM */
cmpr0, r1/* dont reloc during debug */
beqstack_setup
ldr sp, =1024*4 @ 设置仓库
bl copy_to_ram_from_nand @ 到SDRAM中
stack_setup:
ldr sp, =0x33F80000 @ 设置仓库
ldrpc, _start_armboot @ 跳到SDRAM中持续碑文
_start_armboot:.word main
@stack_setup:
@ ldr sp, =1024*4 @ 设置仓库
@ bl main
halt_loop:
b halt_loop
/*
* 板级初始化预处理函数
* 关看门狗、屏蔽中止
*/
pre_lowlevel_init:
/* turn off the watchdog */
#define pWTCON0x53000000
#define INTMSK0x4A000008/* Interrupt-Controller base addresses */
#define INTSUBMSK0x4A00001C
#define CLKDIVN0x4C000014/* clock divisor register */
ldrr0, =pWTCON
movr1, #0x0
strr1, [r0]
/*
* mask all IRQs by setting all bits in the INTMR – default
*/
movr1, #0xffffffff
ldrr0, =INTMSK
strr1, [r0]
ldrr1, =0x7fff
ldrr0, =INTSUBMSK
strr1, [r0]
movpc, lr
/* end_of pre_lowlevel_init */
/*
* 体系时钟初始化函数
* S3C2440: FCLK:HCLK:PCLK = 1:4:8(FCLK is 405 MHz)
*/
#define CLKDIVN0x4C000014
#define CLK_CTL_BASE0x4C000000
#define MDIV_4050x7f << 12
#define PSDIV_4050x21
#define MDIV MDIV_405
#define PSDIV PSDIV_405
#define CLKDIV 0x5 /* FCLK:HCLK:PCLK = 1:4:8 */
system_clock_init:
ldrr0, =CLKDIVN
movr1, #CLKDIV
strr1, [r0]
/*
* 设置arm920t为异步时钟形式
*
* 复位时,arm920t处于快速总线时钟形式,该形式下
* core和AMBA都由BCLK操控,设置为异步形式后,core
* 由FCLK操控
*/
mrcp15, 0, r1, c1, c0, 0
orrr1, r1, #0xc0000000
mcrp15, 0, r1, c1, c0, 0
movr1, #CLK_CTL_BASE
movr2, #MDIV
addr2, r2, #PSDIV
strr2, [r1, #0x04]/* MPLLCON */
movpc, lr
/* end_of system_clock_init*/
/*
* NAND FLASH初始化函数
* TACLS:TWRPH0:TWRPH1 = 1:2:1, BUS_WIDTH_8
*/
#define S3C2440_NAND_BASE0x4E000000
#define NFCONF_OFFSET 0x0
#define NFCONT_OFFSET 0x4
nand_asm_init:
ldrr0, =S3C2440_NAND_BASE
ldrr1, =0x001210
str r1, [r0, #NFCONF_OFFSET]
movr1, #0x3
str r1, [r0, #NFCONT_OFFSET]
movpc, lr
/*end_of nand_asm_init*/
mem_ctrl_asm_init:
@ 设置存储操控器以便运用SDRAM等外设
mov r1, #MEM_CTL_BASE @ 存储操控器的13个寄存器的开端地址
adrl r2, mem_cfg_val @ 这13个值的开始存储地址
add r3, r1, #52 @ 13*4 = 54
1:
ldr r4, [r2], #4 @ 读取设置值,并让r2加4
str r4, [r1], #4 @ 将此值写入寄存器,并让r1加4
cmp r1, r3 @ 判别是否设置完一切13个寄存器
bne 1b @ 若没有写成,持续
mov pc, lr @ 回来
.align 4
mem_cfg_val:
@ 存储操控器13个寄存器的设置值
.long 0x22011110 @ BWSCON
.long 0x00000700 @ BANKCON0
.long 0x00000700 @ BANKCON1
.long 0x00000700 @ BANKCON2
.long 0x00000700 @ BANKCON3
.long 0x00000700 @ BANKCON4
.long 0x00000700 @ BANKCON5
.long 0x00018005 @ BANKCON6
.long 0x00018005 @ BANKCON7
.long 0x008C07A3 @ REFRESH
.long 0x000000B1 @ BANKSIZE
.long 0x00000030 @ MRSRB6
.long 0x00000030 @ MRSRB7
发动完就跳到了main那里出了。关于LCD的参数什么的就不多说了,曾经RVDS下的整个过来都没有问题。许多博客,教材上讲的很清楚。这儿首要写写完成进程。
调试截图:
显现截图:
代码:http://download.csdn.net/detail/kangear/5268137