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

发布者:SereneSoul55最新更新时间:2016-05-04 来源: eefocus关键字:S3C2440  2440init.s 手机看文章 扫描二维码
随时随地手机看文章
;//2.根据工作频率设置pll

;这里介绍一下计算公式

;//Fpllo=(m*Fin)/(p*2^s)

;//m=MDIV+8,p=PDIV+2,s=SDIV

;The proper range of P and M: 1<=P<=62, 1<=M<=248

 

;Fpllo必须大于20Mhz小于66Mhz

;Fpllo*2^s必须小于170Mhz

;如下面的PLLCON设定中的M_DIV P_DIV S_DIV是取自option.h中

;#elif (MCLK==40000000)

;#define PLL_M (0x48)

;#define PLL_P (0x3)

;#define PLL_S (0x2)

;所以m=MDIV+8=80,p=PDIV+2=5,s=SDIV=2

;硬件使用晶振为10Mhz,即Fin=10Mhz

;Fpllo=80*10/5*2^2=40Mhz

 

    ;To reduce PLL lock time, adjust the LOCKTIME register.

    ldr    r0,=LOCKTIME

    ldr    r1,=0xffffff

    str    r1,[r0]

;//设置PLL的重置延迟

 

    [ PLL_ON_START

    ; Added for confirm clock divide. for 2440.

    ; Setting value Fclk:Hclk:Pclk

    ldr    r0,=CLKDIVN

    ldr    r1,=CLKDIV_VAL        ; 0=1:1:1, 1=1:1:2, 2=1:2:2, 3=1:2:4, 4=1:4:4, 5=1:4:8, 6=1:3:3, 7=1:3:6.

    str    r1,][r0]                ;//数据表示分频数

 

    ;//Configure UPLL Fin=12.0MHz UFout=48MHz

    ldr    r0,=UPLLCON

    ldr    r1,=((U_MDIV<<12)+(U_PDIV<<4)+U_SDIV) ;//USB PLL CONFIG

    str    r1,[r0]

   

    nop    ;// Caution: After UPLL setting, at least 7-clocks delay must be inserted for setting hardware be completed.

    nop

    nop

    nop

    nop

    nop

    nop

    ;//Configure MPLL Fin=12.0MHz MFout=304.8MHz

    ldr    r0,=MPLLCON

    ldr    r1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV)

    str    r1,[r0]

    ]

   

;//Check if the boot is caused by the wake-up from SLEEP mode.

    ldr    r1,=GSTATUS2

    ldr    r0,[r1]

    tst    r0,#0x2        ;test if bit[1] is 1 or 0 0->C=1

                                            1->C=0

    ;In case of the wake-up from SLEEP mode, go to SLEEP_WAKEUP handler.

    bne    WAKEUP_SLEEP    ;C=0,jump

 

    EXPORT StartPointAfterSleepWakeUp

StartPointAfterSleepWakeUp

 

;//3.置存储相关寄存器的程序

;这是设置SDRAM,flash ROM 存储器连接和工作时序的程序,片选定义的程序

;SMRDATA map在下面的程序中定义

;SMRDATA中涉及的值请参考memcfg.s程序

;具体寄存器各位含义请参考s3c44b0 spec   

    ;Set memory control registers

     ldr    r0,=SMRDATA

    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

;//set memory registers

 

 

;//4.初始化各模式下的栈指针

         ;Initialize stacks

    bl    InitStacks

   

   

 

;//5.设置缺省中断处理函数

      ; Setup IRQ handler

    ldr    r0,=HandleIRQ       ;This routine is needed

    ldr    r1,=IsrIRQ      ;if there isn't 'subs pc,lr,#4' at 0x18, 0x1c

    str    r1,[r0]

    ;//initialize the IRQ 将普通中断判断程序的入口地址给HandleIRQ

   

   

 

;//6.将数据段拷贝到ram中 将零初始化数据段清零 跳入C语言的main函数执行到这步结束bootloader初步引导结束

    ;If main() is used, the variable initialization will be done in __main().

   

      :LNOT:USE_MAIN    ;initialized {FALSE}

                          ;Copy and paste RW data/zero initialized data

                         

    LDR     r0, =|Image$$RO$$Limit| ; Get pointer to ROM data

    LDR     r1, =|Image$$RW$$Base| ; and RAM copy

    LDR     r3, =|Image$$ZI$$Base|

   

    ;Zero init base => top of initialised data

    CMP     r0, r1      ; Check that they are different just for debug??????????????????????????

    BEQ     %F2

     

    CMP     r1, r3      ; Copy init data

    LDRCC   r2, ][r0], #4    ;--> LDRCC r2, [r0] + ADD r0, r0, #4        

    STRCC   r2, [r1], #4    ;--> STRCC r2, [r1] + ADD r1, r1, #4

    BCC     %B1

     

    LDR     r1, =|Image$$ZI$$Limit| ; Top of zero init segment

    MOV     r2, #0

     

    CMP     r3, r1      ; Zero init

    STRCC   r2, [r3], #4

    BCC     %B3

    ]

 

 

      

    [ :LNOT:THUMBCODE    ;if thumbcode={false} bl main

        bl    Main        ;Don't use main() because ......

                              

    ]

 

 

;//if thumbcod={ture}

    [ THUMBCODE         ;for start-up code for Thumb mode

        orr    lr,pc,#1

        bx    lr

        CODE16

        bl    Main        ;Don't use main() because ......

          .

        CODE32

    ]

 

 

;function initializing stacks

InitStacks

    ;Don't 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.

    ;//为什么不用初始化user的stacks,系统刚启动的时候运行在哪个模式下???????????????????

    mov    pc,lr

    ;The LR register won't be valid if the current mode is not SVC mode.?????????????

;//系统一开始运行就是SVCmode????????????????????????????????????????

   

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

; 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

 

 

;存储器控制寄存器的定义区

    LTORG

 

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)+(Trc<<18)+(Tchr<<16)+REFCNT)

 

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

 

    DCD 0x30        ;MRSR6 CL=3clk

    DCD 0x30        ;MRSR7 CL=3clk

 

 

    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

 

;Don't 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               ; 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               ; 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分析第一篇(二)

上一篇:S3C2410的内存映射
下一篇: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