S3C2440 2440init.s分析第二篇(二)

发布者:书香门第最新更新时间:2016-05-04 来源: eefocus关键字:S3C2440  2440init.s 手机看文章 扫描二维码
随时随地手机看文章
S3C2440 2440init.s分析第二篇(二)


;*****************************************************************************
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;终说见到艳阳天了!!!!!!!!!!
      跳到C语言的main函数处了.
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;*****************************************************************************
    [ :LNOT:THUMBCODE
   bl Main ;Do not use main() because ......
   ;ldr pc, =Main ;hzh
   b .
    ]

    [ THUMBCODE ;for start-up code for Thumb mode
   orr lr,pc,#1
   bx lr
   CODE16
   bl Main ;Do not use main() because ......
   b .
CODE32
    ]


;function initializing stacks
InitStacks
;Do not use DRAM,such as stmfd,ldmfd......
;SVCstack is initialized before
;Under toolkit ver 2.5, 'msr cpsr,r1' can be used instead of 'msr cpsr_cxsf,r1'
mrs r0,cpsr
bic r0,r0,#MODEMASK
orr r1,r0,#UNDEFMODE|NOINT
msr cpsr_cxsf,r1 ;UndefMode
ldr sp,=UndefStack ; UndefStack=0x33FF_5C00

orr r1,r0,#ABORTMODE|NOINT
msr cpsr_cxsf,r1 ;AbortMode
ldr sp,=AbortStack ; AbortStack=0x33FF_6000

orr r1,r0,#IRQMODE|NOINT
msr cpsr_cxsf,r1 ;IRQMode
ldr sp,=IRQStack ; IRQStack=0x33FF_7000

orr r1,r0,#FIQMODE|NOINT
msr cpsr_cxsf,r1 ;FIQMode
ldr sp,=FIQStack ; FIQStack=0x33FF_8000

bic r0,r0,#MODEMASK|NOINT
orr r1,r0,#SVCMODE
msr cpsr_cxsf,r1 ;SVCMode
ldr sp,=SVCStack ; SVCStack=0x33FF_5800

;USER mode has not be initialized.

mov pc,lr
;The LR register will not be valid if the current mode is not SVC mode.

;===========================================================
ReadNandID
mov      r7,#NFCONF
ldr      r0,[r7,#4] ;NFChipEn();
bic      r0,r0,#2
str      r0,[r7,#4]
mov      r0,#0x90 ;WrNFCmd(RdIDCMD);
strb     r0,[r7,#8]
mov      r4,#0   ;WrNFAddr(0);
strb     r4,[r7,#0xc]
      ;while(NFIsBusy());
ldr      r0,[r7,#0x20]
tst      r0,#1
beq      %B1
ldrb     r0,[r7,#0x10] ;id = RdNFDat()<<8;
mov      r0,r0,lsl #8
ldrb     r1,[r7,#0x10] ;id |= RdNFDat();
orr      r5,r1,r0
ldr      r0,[r7,#4] ;NFChipDs();
orr      r0,r0,#2
str      r0,[r7,#4]
mov   pc,lr

ReadNandStatus
mov   r7,#NFCONF
ldr      r0,[r7,#4] ;NFChipEn();
bic      r0,r0,#2
str      r0,[r7,#4]
mov      r0,#0x70 ;WrNFCmd(QUERYCMD);
strb     r0,[r7,#8]
ldrb     r1,[r7,#0x10] ;r1 = RdNFDat();
ldr      r0,[r7,#4] ;NFChipDs();
orr      r0,r0,#2
str      r0,[r7,#4]
mov   pc,lr

WaitNandBusy
mov      r0,#0x70 ;WrNFCmd(QUERYCMD);
mov      r1,#NFCONF
strb     r0,[r1,#8]
      ;while(!(RdNFDat()&0x40));
ldrb     r0,[r1,#0x10]
tst      r0,#0x40
beq   %B1
mov      r0,#0   ;WrNFCmd(READCMD0);
strb     r0,[r1,#8]
mov      pc,lr

CheckBadBlk
mov r7, lr
mov r5, #NFCONF

bic      r0,r0,#0x1f ;addr &= ~0x1f;
ldr      r1,[r5,#4] ;NFChipEn()
bic      r1,r1,#2
str      r1,[r5,#4]

mov      r1,#0x50 ;WrNFCmd(READCMD2)
strb     r1,[r5,#8]
mov      r1, #5;6 ;6->5
strb     r1,[r5,#0xc] ;WrNFAddr(5);(6) 6->5
strb     r0,[r5,#0xc] ;WrNFAddr(addr)
mov      r1,r0,lsr #8 ;WrNFAddr(addr>>8)
strb     r1,[r5,#0xc]
cmp      r6,#0   ;if(NandAddr)  
movne    r0,r0,lsr #16 ;WrNFAddr(addr>>16)
strneb   r0,[r5,#0xc]

; bl WaitNandBusy ;WaitNFBusy()
;do not use WaitNandBusy, after WaitNandBusy will read part A!
mov r0, #100
1
subs r0, r0, #1
bne %B1
2
ldr r0, [r5, #0x20]
tst r0, #1
beq %B2

ldrb r0, [r5,#0x10] ;RdNFDat()
sub r0, r0, #0xff

mov      r1,#0   ;WrNFCmd(READCMD0)
strb     r1,[r5,#8]

ldr      r1,[r5,#4] ;NFChipDs()
orr      r1,r1,#2
str      r1,[r5,#4]

mov pc, r7

ReadNandPage
mov   r7,lr
mov      r4,r1
mov      r5,#NFCONF

ldr      r1,[r5,#4] ;NFChipEn()
bic      r1,r1,#2
str      r1,[r5,#4]

mov      r1,#0   ;WrNFCmd(READCMD0)
strb     r1,[r5,#8]
strb     r1,[r5,#0xc] ;WrNFAddr(0)
strb     r0,[r5,#0xc] ;WrNFAddr(addr)
mov      r1,r0,lsr #8 ;WrNFAddr(addr>>8)
strb     r1,[r5,#0xc]
cmp      r6,#0   ;if(NandAddr)  
movne    r0,r0,lsr #16 ;WrNFAddr(addr>>16)
strneb   r0,[r5,#0xc]

ldr      r0,[r5,#4] ;InitEcc()
orr      r0,r0,#0x10
str      r0,[r5,#4]

bl       WaitNandBusy ;WaitNFBusy()

mov      r0,#0   ;for(i=0; i<512; i++)
1
ldrb     r1,[r5,#0x10] ;buf[i] = RdNFDat()
strb     r1,[r4,r0]
add      r0,r0,#1
bic      r0,r0,#0x10000
cmp      r0,#0x200
bcc      %B1

ldr      r0,[r5,#4] ;NFChipDs()
orr      r0,r0,#2
str      r0,[r5,#4]
  
mov   pc,r7

;--------------------LED test
EXPORT Led_Test
Led_Test
mov r0, #0x56000000
mov r1, #0x5500
str r1, [r0, #0x50]
0
mov r1, #0x50
str r1, [r0, #0x54]
mov r2, #0x100000
1
subs r2, r2, #1
bne %B1

mov r1, #0xa0
str r1, [r0, #0x54]
mov r2, #0x100000
2
subs r2, r2, #1
bne %B2
b %B0
mov pc, lr

;===========================================================

LTORG

;GCS0->SST39VF1601
;GCS1->16c550
;GCS2->IDE
;GCS3->CS8900
;GCS4->DM9000
;GCS5->CF Card
;GCS6->SDRAM
;GCS7->unused

SMRDATA DATA
; Memory configuration should be optimized for best performance
; The following parameter is not optimized.
; Memory access cycle parameter strategy
; 1) The memory settings is safe parameters even at HCLK=75Mhz.
; 2) SDRAM refresh period is for HCLK<=75Mhz.

DCD (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))
DCD ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))   ;GCS0
DCD ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))   ;GCS1
DCD ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))   ;GCS2
DCD ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))   ;GCS3
DCD ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))   ;GCS4
DCD ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))   ;GCS5
DCD ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))    ;GCS6
DCD ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))    ;GCS7
DCD ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Tsrc<<18)+(Tchr<<16)+REFCNT)

DCD 0x32     ;SCLK power saving mode, BANKSIZE 128M/128M

DCD 0x30     ;MRSR6 CL=3clk
DCD 0x30     ;MRSR7 CL=3clk

BaseOfROM DCD |Image$$RO$$Base|
TopOfROM DCD |Image$$RO$$Limit|
BaseOfBSS DCD |Image$$RW$$Base|
BaseOfZero DCD |Image$$ZI$$Base|
EndOfBSS DCD |Image$$ZI$$Limit|

ALIGN

;Function for entering power down mode
; 1. SDRAM should be in self-refresh mode.
; 2. All interrupt should be maksked for SDRAM/DRAM self-refresh.
; 3. LCD controller should be disabled for SDRAM/DRAM self-refresh.
; 4. The I-cache may have to be turned on.
; 5. The location of the following code may have not to be changed.

;void EnterPWDN(int CLKCON);
EnterPWDN
mov r2,r0 ;r2=rCLKCON
tst r0,#0x8 ;SLEEP mode?
bne ENTER_SLEEP

ENTER_STOP
ldr r0,=REFRESH
ldr r3,[r0] ;r3=rREFRESH
mov r1, r3
orr r1, r1, #BIT_SELFREFRESH
str r1, [r0] ;Enable SDRAM self-refresh

mov r1,#16   ;wait until self-refresh is issued. may not be needed.
0 subs r1,r1,#1
bne %B0

ldr r0,=CLKCON ;enter STOP mode.
str r2,[r0]

mov r1,#32
0 subs r1,r1,#1 ;1) wait until the STOP mode is in effect.
bne %B0 ;2) Or wait here until the CPU&Peripherals will be turned-off
    Entering SLEEP mode, only the reset by wake-up is available.

ldr r0,=REFRESH ;exit from SDRAM self refresh mode.
str r3,[r0]

MOV_PC_LR

ENTER_SLEEP
;NOTE.
;1) rGSTATUS3 should have the return address after wake-up from SLEEP mode.

ldr r0,=REFRESH
ldr r1,[r0] ;r1=rREFRESH
orr r1, r1, #BIT_SELFREFRESH
str r1, [r0] ;Enable SDRAM self-refresh

mov r1,#16   ;Wait until self-refresh is issued,which may not be needed.
0 subs r1,r1,#1
bne %B0

ldr r1,=MISCCR
ldr r0,[r1]
orr r0,r0,#(7<<17) ;Set SCLK0=0, SCLK1=0, SCKE=0.
str r0,[r1]

ldr r0,=CLKCON ; Enter sleep mode
str r2,[r0]

b .   ;CPU will die here.


WAKEUP_SLEEP
;Release SCLKn after wake-up from the SLEEP mode.
ldr r1,=MISCCR
ldr r0,[r1]
bic r0,r0,#(7<<17) ;SCLK0:0->SCLK, SCLK1:0->SCLK, SCKE:0->=SCKE.
str r0,[r1]

;Set memory control registers
ldr r0,=SMRDATA ;be careful!, hzh
ldr r1,=BWSCON ;BWSCON Address
add r2, r0, #52 ;End address of SMRDATA
0
ldr r3, [r0], #4
str r3, [r1], #4
cmp r2, r0
bne %B0

mov r1,#256
0 subs r1,r1,#1 ;1) wait until the SelfRefresh is released.
bne %B0

ldr r1,=GSTATUS3 ;GSTATUS3 has the start address just after SLEEP wake-up
ldr r0,[r1]

mov pc,r0

;=====================================================================
; Clock division test
; Assemble code, because VSYNC time is very short
;=====================================================================
EXPORT CLKDIV124
EXPORT CLKDIV144

CLKDIV124

ldr     r0, = CLKDIVN
ldr     r1, = 0x3 ; 0x3 = 1:2:4
str     r1, [r0]
; wait until clock is stable
nop
nop
nop
nop
nop

ldr     r0, = REFRESH
ldr     r1, [r0]
bic r1, r1, #0xff
bic r1, r1, #(0x7<<8)
orr r1, r1, #0x470 ; REFCNT135
str     r1, [r0]
nop
nop
nop
nop
nop
mov     pc, lr

CLKDIV144
ldr     r0, = CLKDIVN
ldr     r1, = 0x4 ; 0x4 = 1:4:4
str     r1, [r0]
; wait until clock is stable
nop
nop
nop
nop
nop

ldr     r0, = REFRESH
ldr     r1, [r0]
bic r1, r1, #0xff
bic r1, r1, #(0x7<<8)
orr r1, r1, #0x630 ; REFCNT675 - 1520
str     r1, [r0]
nop
nop
nop
nop
nop
mov     pc, lr


ALIGN

AREA RamData, DATA, READWRITE

  _ISR_STARTADDRESS ; _ISR_STARTADDRESS=0x33FF_FF00
HandleReset #   4
HandleUndef #   4
HandleSWI #   4
HandlePabort     4
HandleDabort     4
HandleReserved #   4
HandleIRQ #   4
HandleFIQ #   4

;Do not use the label 'IntVectorTable',
;The value of IntVectorTable is different with the address you think it may be.
;IntVectorTable
;@0x33FF_FF20
HandleEINT0 #   4
HandleEINT1 #   4
HandleEINT2 #   4
HandleEINT3 #   4
HandleEINT4_7 #   4
HandleEINT8_23 #   4
HandleCAM #   4 ; Added for 2440.
HandleBATFLT #   4
HandleTICK #   4
HandleWDT #   4
HandleTIMER0 #   4
HandleTIMER1 #   4
HandleTIMER2 #   4
HandleTIMER3 #   4
HandleTIMER4 #   4
HandleUART2    4
;@0x33FF_FF60
HandleLCD    4
HandleDMA0 #   4
HandleDMA1 #   4
HandleDMA2 #   4
HandleDMA3 #   4
HandleMMC #   4
HandleSPI0 #   4
HandleUART1 #   4
HandleNFCON #   4 ; Added for 2440.
HandleUSBD #   4
HandleUSBH #   4
HandleIIC #   4
HandleUART0 #   4
HandleSPI1    4
HandleRTC    4
HandleADC    4
;@0x33FF_FFA0
END


关键字:S3C2440  2440init.s 引用地址:S3C2440 2440init.s分析第二篇(二)

上一篇:S3C2440 2440init.s分析第一篇(一)
下一篇:S3C2440 2440init.s分析第二篇(一)

推荐阅读最新更新时间:2024-03-16 14:52

S3C2440开发板-LCD基础(源代码)
首先了解TFT LCD的时序,每个VSYNC信号表示一帧数据的开始,每个HSYNC表示一行数据的开始,无论这些数据是否有效,每个VCLK表示正在传输一个像素的数据,无论它是否有效。VSPW称为垂直同步信号的脉宽,VBPD称为垂直同步信号的后肩,VFPD称为垂直同步信号的前肩。HSPW称为水平同步信号的脉宽,HBPD称为水平同步信号的后肩,HFPD称为水平同步信号的前肩。查看时序图,VSYNC信号有效时,表示一帧数据的开始,VSPW表示VSYNC信号的脉冲宽度为(VSPW+1)个HSYNC信号周期,即(VSYNC+1)行,这(VSPW+1)行的数据无效。VSYNC信号脉冲之后,还要经过(VBPD+1)个HSYNC信号周期,有效的行数
[单片机]
<font color='red'>S3C2440</font>开发板-LCD基础(源代码)
2440串口linux编程,S3C2440串口通讯的相关配置
UART配置的相关寄存器如下(按s3c2440手册中的顺序列出): 1.ULCONn寄存器:线性控制寄存器 功能:设置奇偶校验,停止位, 数据位(5-8位) 注意:一般设置为无校验,一个停止位,数据位为8位,也就是常说的“8N1”,此时寄存器值为0x3。(bit =0为正常模式,否则为红外模式); 2.UCONn寄存器:通道n控制器 功能:选择UART时钟源、设置UART中断方式 注意:可选择PCLK、UEXTCLK或FCLK/n。bit =1为回送模式,用于测试;bit 和bit 分别控制传输和接收模式,初学者常设置为中断请求或查询模式,bit =bit =01。 3.UFCONn寄存器:FIFO控制寄存器 功能:用于设
[单片机]
s3c2440对nandflash的操作
nandflash在对大容量的数据存储中发挥着重要的作用。相对于norflash,它具有一些优势,但它的一个劣势是很容易产生坏块,因此在使用nandflash时,往往要利用校验算法发现坏块并标注出来,以便以后不再使用该坏块。nandflash没有地址或数据总线,如果是8位nandflash,那么它只有8个IO口,这8个IO口用于传输命令、地址和数据。nandflash主要以page(页)为单位进行读写,以block(块)为单位进行擦除。每一页中又分为main区和spare区,main区用于正常数据的存储,spare区用于存储一些附加信息,如块好坏的标记、块的逻辑地址、页内数据的ECC校验和等。 三星公司是最主要的nandf
[单片机]
基于S3C2440的U-BOOT的start.S分析
在了解了ARM相关的汇编指令后,同时结合网上各位大虾的提点开始阅读u-boot的启动代码,现将分析过程记录如下 可执行文件及内存映射 我们可以把可执行文件分为2种情况:存放态和运行态 1.存放态:可执行文件经过烧到存储介质上(flash或磁盘)的分布,此时可执行文件通常有2部分组成,代码段和数据段,代码段又分为可执行代码段 (.text)和只读数据段(.rodata),数据段可以分为初始化数据段(.data)和未初始化代码段(.bss),如下: +-------------+----------- | .bss | (ZI) +-------------+-- 数据段 | .data | (RW) +-----------
[单片机]
移植U-Boot.1.2.0到友善之臂S3C2440 (2)
8、在个文件中添加“CONFIG_S3C2440”,使得原来s3c2410的代码可以编译进来。 (1)/include/common.h文件的第454行: #if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) || defined(CONFIG_LH7A40X) || defined(CONFIG_S3C2440) (2)/include/s3c24x0.h文件的第85、95、99、110、148、404行: #if defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440) (3)/cpu/arm920t/s3c24x0/inte
[单片机]
s3c2440】第四课:外部中断
外部中断初始化流程 外部中断的流程图如下: 此处不考虑中断优先级,涉及的寄存器如下: 外部中断配置 一、初始化中断 将系统的模式(MODE)从SVC(supervise)模式设置位USER模式。将M4~M0设置为b10000即可。 CPSR寄存器详细描述: 各种模式下M4~M0的值: 打开中断总开关。CPSR中的第6位表示中断总开关。当I等于0时,irq中断使能。 初始化外部中断,中断控制器中的INTMSK寄存器可以屏蔽各种中断,需要解除外部中断的屏蔽。INTMSK的默认值为0xFFFFFFFF。0表示使能中断,1表示屏蔽中断。 INTMSK寄存器详细信息: INTMOD设置中断模式:0: IRQ MOD
[单片机]
【<font color='red'>s3c2440</font>】第四课:外部中断
s3c2440裸机-内存控制器(三-2、norflash编程之适配访问时序)
前面我们了解了 norFlash的特性和原理 ,那么cpu是如何和nor进行通信的呢?下面开始详细介绍。 1.内存控制器适配norflash 如图是S3C2440的内存控制器的可编程访问周期读写时序,里面的时间参数要根据外部norflash的性能进行配置,这里先列出时间参数的含义: Tacs: Address set-up time before nGCSn(表示地址信号A发出多久后才能发出nGCS片选) Tcos: Chip selection set-up time before nOE(表示片选信号nGCS发出多久后才能发出读使能信号) Tacc:access cycle(数据访问周期) Tacp:page模式下的访问周
[单片机]
<font color='red'>s3c2440</font>裸机-内存控制器(三-2、norflash编程之适配访问时序)
S3C2440-LCD图片显示
折腾了几日,终于可以将图片显示在LCD上了,我使用的东华的WXCAT35-TG3#001 TFT LCD。首先使用PHOTOSHOP软件将图片改成宽320,高240,注意不要反了。然后用Image2Lcd_32软件提取出数组。我选的是24位真彩。所以一个像素3个字节,显示的时候,通过位运算将3个字节合到一起,显示在一个像素上。 Image2Lcd_32的配置方法: #include 2440addr.h #include picture.h //垂直同步信号的脉宽、后肩和前肩 #define VSPW 15 #define VBPD 3 #defi
[单片机]
S3C2440-LCD图片显示
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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