依据JZ2440开垦板编写bootloader总括(风流洒脱)

作者:电脑系统

在链接文件中钦定了开发银行代码在SDRAM的中存放地方:0x33f80000,运转代码存到SDRAM最上端512k的地点空间中。

三、S3C2440A时钟配置流程和样例

      1、设置S3C2440A的原子钟频率要求配备4个寄存器:LOCKTIME(0x4C000000)CLKDIVN (0x4C000014)MPLLCON

        ( 0x4C000004)UPLLCON(0x4C000008)。

      2、石英钟配置顺序如上:LOCKTIME => **CLKDIVN  => MPLLCON => **UPLLCON。注意:UPLL的装置要先于MPLL,切超前7个机械钟

            设置。

      3、机械钟样例:

          (1)、LOCKTIME:位[31:16]用于UPLL,位[15:0]用于MPLL。确省值为0xFFFFFFFF

          (2)、CLKDIVN:DIVN _UPLL[3]:HDIVN [2:1]:PDIVN [0]用来设置FCLK:HCLK:PCLK的比重关系,默感觉1:1:1。

                       CLKDIVN不相同的安装及相应的石英手表比例关系如下图:图片 1

                             图HDIVN 和PDIVN对应的百分比,HCLK4_HALF和HCLK3_HALF在壁画头CAMDIVN寄存器中。  图片 2

          ( 3)MPLLCON寄放器位[19:12]-MDIV(Main divider control);[9:4]-PDIV(Pre-divider control);[1:0]-SDIV(Post divider        

                    control)。                     

图片 3 

             锁相环输出石英钟MPLL(FCLK卡塔尔(قطر‎ 通过如下计算公式得出:

                              MPLL(FCLK) = (m * Fin)/(p * 2^s);**内部:m = (MDIV 8卡塔尔国, p = (PDIV 2卡塔尔(英语:State of Qatar), s = SDIV,Fin 输入的石英表频率。**

                     如:MPLLCON设为(0x5c << 12卡塔尔(英语:State of Qatar)|(0x01 << 4卡塔尔(قطر‎|(0x1卡塔尔(英语:State of Qatar),即0x5c010,能够测算出FCLK=200MHz,要是CLKDIVN设置 

                      HDIV=1和PDIV=1;可以知道比例FCLK、HCLK、PCLK比率为1:2:4,所以HCLK=100MHz,PCLK=50MHz。

                     下图 为锁相环配置推荐表。

图片 4

            UPLLCON同理同样设置,计算公式如下:UPLL(UCLK) = (m * Fin) / (p * 2^s),m = (MDIV 8), p = (PDIV 2), s =SDIV。

       Fin 输入的石英钟频率。

   (4)程序:

[cpp] view plaincopyprint?

  1. ;To reduce PLL lock time, adjust the LOCKTIME register.  
  2.   ldr r0,=LOCKTIMEldr r1,=0xffffffstr r1,[r0] ;Configure CLKDIVN  
  3.  ; Added for confirm clock divide. for 2440.; Setting value Fclk:Hclk:Pclkldr r0,=CLKDIVNldr 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  
  4.     ldr r0,=UPLLCON  
  5.     ldr r1,=((U_MDIV<<12) (U_PDIV<<4) U_SDIV)    
  6.     str r1,[r0]  
  7.     nop ; Caution: After UPLL setting, at least 7-clocks delay must be inserted for setting hardware be completed.  
  8.     nop  
  9.     nop  
  10.     nop  
  11.     nop  
  12.     nop  
  13.     nop  
  14. ;Configure MPLL  
  15.     ldr r0,=MPLLCON  
  16.     ldr r1,=((96<<12) (M_PDIV<<4) M_SDIV)  ;Fin=16.9344MHz  68<<12 1<<4 1  
  17.     str r1,[r0]  

 

 

上面将详细呈报各类步骤细节:

凡走过必留下印痕,学点什么都会使得的。

四、时钟改进影响单元

    在移植程序是要潜心石英钟改良后对应的模块频率也改变了,小编的Nboot移植时,须求改进八个地方:UART 和 SDRAM。 UART,它是接在APB总线上,对应的电子钟功率信号为PCLK,假设今后为50MHz。若是想要设置Porter率为115200bps,那么根公式 UB索罗德DIV0=(int卡塔尔(قطر‎(PCLK/(bps*16))-1计算,应该为26。程序:UBRDIV0 = ((int)(PCLK/16./UART_BAUD_RATE) -1).

 

(3)初始化SDRAM

既然,那么哪些让CPU工作在400MHz,让牛车速度增加到轻轨的快慢吗?

       

二、S3C2440A石英钟上电经过

       1、主石英钟源可以由外界石英钟(EXTCLK)或然外部晶振(XTIPll)提供,挂钟源由情势调节引脚OM3和OM2采摘,在重新复苏设置信号

              的提高沿检查评定OM3和OM2引脚状态并锁定在OM[3:2]中。

      2、大家能够在程序发轫运营MPLL,在装置MPLL的多少个存放器后,须求静观其变风流倜傥段时间(Lock Time卡塔尔(英语:State of Qatar),MPLL的输出才平稳。在这里段 

            (Lock Time卡塔尔国时间内,FCLK停振,CPU甘休职业。Lock Time的长短由寄放器LOCKTIME设定。Lock Time之后,MPLL输出平    

         稳。在上电未有设置MPLL时,系统石英钟为晶振机械钟。

(1)禁看门狗

l   HCLK:100MHz

启航代码大小 = 代码段 只读数据段 数据段。BSS段不含有在起步代码中,bss段存放未有开首化的全局变量,大概开始化为0的全局变量,程序运营前将bss段清零。

豆蔻梢头、S3C2440A机械钟概述

     1、S3C2440A的电源管理有4种格局:NORMAL,SLOW,IDLE,SLEEP。

     2、 有4种石英钟:FCLK,HCLK,PCLK,UCLK具体分工如下:

FCLK is used by ARM920T.
HCLK is used for AHB bus, which is used by the ARM920T, the memory controller, the interrupt controller, the LCD
                    controller, the DMA and USB host block.
PCLK is used for APB bus, which is used by the peripherals such as WDT, IIS, I2C, PWM timer, MMC interface,
                    ADC, UART, GPIO, RTC and SPI.

           UCLK专门为USB供电,有UPLL输出。

      3、有四个锁相环,一个MPLL担任FCLK,HCLK,PCLK,四个UPLL担负USB的48MHz,通过四个倍频因子MDIV、PDIV和SDIV来 设置倍频。

       在行使SDRAM在此以前,有须求了然下什么样是SDRAM。请参阅《高手进级_极限内部存款和储蓄器技艺指南——完整》,这篇小说解释了SDRAM的基本原理。系统上电必要对SDRAM进行开始化,完结对方式贮存器(M昂科威,Mode Register)的配备。首要安装操作方式、CAS潜伏期时间、突发传输形式和发生长度,完毕结构后可以事务厅点读写SDRAM。本文操作的SDRAM型号是K4S561632N,S3C2440提供正规的总线接口(BANK6),用于操作SDRAM,因而建构了硬件连接之后,操作S3C2440对应的支配存放器就能够到位对SDRAM的布署和读写,具体操作参阅《[嵌入式Linux应用开采完全手册]》第6章 存款和储蓄调控器。

l   FCLK:400MHz

做到上述4个步骤后,CPU会转到SDRAM中取指令实践。

系统石英钟

        2. CLKDIVN 设置 HCLK , FCLK,PCLK比例关系;

2    时钟驱动实验

系统时钟驱动可以分级用ARM汇编和C语言多个本子完结。

ARM汇编版本:

; 以下为时钟相关寄存器地址

LOCKTIME                                    EQU     0x4c000000        

MPLLCON                                 EQU                   0x4c000004       

CLKDIVN                                  EQU                   0x4c000014

CAMDIVN                                          EQU                   0x4c000018



clock_init                                                            ; 时钟初始化代码

    ; 设置变频锁定时间

    ldr r0, =LOCKTIME

    ldr r1, =0x00ffffff

    str r1, [r0]



    ; 设置分频比FCLK:HCLK:PCLK=1:4:8

    ; 由于CAMDIVN[9]位初始值为0,寄存器CAMDIVN未使用,这儿不用再设置其值

    ldr r0, =CLKDIVN

    mov r1, #0x05

    str r1, [r0]



    ; 修改CPU总线模式

    mrc   p15, 0, r1, c1, c0, 0

    orr    r1, r1, #0xc0000000

    mcr     p15, 0, r1, c1, c0, 0



    ldr r0, =MPLLCON

    ldr r1, =0x5c011                                ; MPLL = 400MHz

str r1, [r0]

mov pc, lr                                           ; 函数调用返回

该汇编代码入口处先设置了变频锁定时间为0x00ffffff,然后设置FCLK:HCLK:PCLK的分频比,由于系统时钟已经改变,需要修改CPU总线模式,最后设置系统时钟工作频率。

C语言版本:

/* 通过MPLL计算公式可以算出:MDIV=92,PDIV=1,SDIV=0时,MPLL=400MHz

#define MPLL_400MHz ((92 << 12)|(1 << 4)|(1 << 0))

void clock_init(void){

           /* 设置变频锁定时间 */

           LOCKTIME = 0x00ffffff;

           /* 设置分频比FCLK:HCLK:PCLK=1:4:8,CAMDIVN初始值为0,不用再对其设置 */

           CLKDIVN  = 0x05;

           /* 修改CPU总线模式 */

           __asm{

                    mrc   p15, 0, r1, c1, c0, 0

                    orr     r1, r1, #0xc0000000

                    mcr p15, 0, r1, c1, c0, 0
              }

           MPLLCON = MPLL_400MHz;

}

C语言版本与汇编版本相同,只是出于更改CPU总线形式时要运用mrc指令,由此只可以利用C语言嵌入汇编格局来兑现。

 

系统石英钟驱动实验:

;

; 系统时钟初始化实验

;

WTCON                        EQU          0x53000000        ; 看门狗控制寄存器

WTDAT                         EQU          0x53000004        ; 看门狗数据寄存器

LOCKTIME                  EQU     0x4c000000         ; 变频锁定时间寄存器

MPLLCON                   EQU          0x4c000004        ; MPLL寄存器

CLKDIVN                    EQU          0x4c000014        ; 分频比寄存器

GPBCON                      EQU      0x56000010        ; LED控制寄存器

GPBDAT                       EQU      0x56000014        ; LED数据寄存器

GPBUP                         EQU      0x56000018        ; 上拉电阻设置寄存器

DELAYVAL                  EQU      0x8fff                  ; 延时数值



         AREA    CLOCK, CODE, READONLY

         ENTRY
         start

           ldr r0, = 0x53000000                      ; 看门狗关闭代码

         mov  r1, #0

         str  r1, [r0]



         bl  clock_init                                  ; 调用时钟初始化函数

         bl  led_on                                      ; 调用点亮Led函数



clock_init                                                  ; 时钟初始化代码

           ; 设置锁频时间

    ldr r0, =LOCKTIME                         ; 取得LOCKTIME寄存器地址

    ldr r1, =0x00ffffff                              ; LOCKTIME寄存器设置数据

    str r1, [r0]                                          ; 将LOCKTIME设置数据写入LOCKTIME寄存器

           ; 设置分频数

    ldr r0, =CLKDIVN                           ; 取得CLKDIVN寄存器地址

    mov r1, #0x05                                   ; CLKDIVN寄存器设置数据

    str r1, [r0]                                          ; 将CLKDIVN设置数据写入CLKDIVN寄存器



    ; 修改CPU总线模式

    mrc    p15, 0, r1, c1, c0, 0

    orr    r1, r1, #0xc0000000

    mcr    p15, 0, r1, c1, c0, 0



    ldr r0, =MPLLCON

    ldr r1, =0x5c011                                ; MPLL is 400MHz

    str r1, [r0]

    mov pc, lr



led_on                                                        ; 亮点Led函数

           ; Led初始化开始

    ldr  r0,=GPBCON                        ; 将LED控制寄存器地址放入r0

    ldr  r1,[r0]                                        ; 将控制寄存器里的值读出放入r1

    bic  r1,r1,#0x3fc00                          ; 将r1里的值(控制寄存器里的值)

                                                              ; bit[10]~bit[17]清位,其它位不变

    orr  r1,r1,#0x15400                         ; 设置控制寄存器

    str  r1,[r0]                                        ; 将r1里的值写入控制寄存器



    ; 禁止GPF4-GPF7端口的上拉电阻

    ldr  r0,=GPBUP

    ldr  r1,[r0]

    orr  r1,r1,#0x1e0

    str  r1,[r0]

           ; Led初始化结束





led_loop                                                     ; 循环点亮Led

    ldr  r2,=GPBDAT                                     ; 将LED数据寄存器的地址放入r2

    ldr  r3,[r2]                                        ; 将数据寄存器(r2)里的值放入r3

    bic  r3,r3,#0x1e0                              ; 清除bit[5]~bit[8],bit[n]代表led1~led4

    orr  r3,r3,#0x1c0                              ; 清对应Led位-亮灯,设置相应位-灭灯(点亮led1)

    str  r3,[r2]                                       ; 将控制亮灯数据写入数据寄存器r2

    ldr r0,=DELAYVAL                         ; 设置延迟数

    bl   delay                                         ; 调用延迟子程序



    ldr  r3,[r2]                                        ; 将数据寄存器(r2)里的值放入r3

    bic  r3,r3,#0x1e0                              ; 清除bit[5]~bit[8],bit[n]代表led1~led4

    orr  r3,r3,#0x1a0                              ; 清对应Led位-亮灯,设置相应位-灭灯(点亮led2)

    str  r3,[r2]                                       ; 将控制亮灯数据写入数据寄存器r2

    ldr r0,=DELAYVAL                         ; 设置延迟数

    bl   delay                                       ; 调用延迟子程序



    ldr  r3,[r2]                                        ; 将数据寄存器(r2)里的值放入r3

    bic  r3,r3,#0x1e0                              ; 清除bit[5]~bit[8],bit[n]代表led1~led4

    orr  r3,r3,#0x160                             ; 清对应Led位-亮灯,设置相应位-灭灯(点亮led3)

    str  r3,[r2]                                       ; 将控制亮灯数据写入数据寄存器r2

    ldr r0,=DELAYVAL                         ; 设置延迟数

    bl   delay                                       ; 调用延迟子程序



    ldr  r3,[r2]                                        ; 将数据寄存器(r2)里的值放入r3

    bic  r3,r3,#0x1e0                              ; 清除bit[5]~bit[8],bit[n]代表led1~led4

    orr  r3,r3,#0xe0                               ; 清对应Led位-亮灯,设置相应位-灭灯(点亮led4)

    str  r3,[r2]                                       ; 将控制亮灯数据写入数据寄存器r2

    ldr r0,=DELAYVAL                         ; 设置延迟数

    bl   delay                                      ; 调用延迟子程序



    b led_loop



delay

         sub r0,r0,#1                             ; r0=r0-1

           cmp r0,#0x0                                   ; 将r0的值与0相比较

bne delay                                                  ; 比较的结果不为0,继续调用delay

           mov pc,lr                                        ; 返回

    END                                ; 程序结束符

该试验首先关闭了看门狗电火花计时器,然后改革系统时钟,将私下认可系统专门的学问频率12MHz进步到400MHz,由于CPU专门的工作在较高频率下,其施行进程鲜明比未运行系统石英钟时高的多,能够经过注释掉系统机械钟开首化代码跳转指令 bl clock_init,相比LED的跑马灯效果能够印证。


 在移植Nboot时,发掘串口输出乱码,检查串口配置没难点后,感到应该是挂钟配置没配好,改过后果然ok,所以补习一下!
2440挂钟配置详细表达,以上电为顺序陈说:

         配置石英钟早前先参考下集成电路手册  S3C2440A_UserManual_Rev13,要求操作七个贮存器:

1   系统专门的工作石英钟频率

在对系统石英钟进行提速早前,让我们先来打探下S3C2440上的办事石英钟频率,FCLK,HCLK,PCLK,此中FCLK主要为ARM920T内核提供专门的工作频率,如图2-44所示:

图片 5

 

图2-44  ARM920T内核构造

HCLK主要为S3C2440 AHB总线(Advanced High performance Bus)上挂接硬件提供职业频率,AHB总线主要挂接有内部存款和储蓄器,NAND,LCD调节器等硬件,如图2-45所示:

 图片 6

图2-45 S3C2440 AHB总线上挂接硬件

PCLK首要为APB总线提供职业频率,由图2-46所示,APB总线主要挂接UART串口,Watchdog等硬件调控器。

图片 7

 

图2-46 S3C2440 APB总线挂接硬件

也等于说,对于一些内需时钟工作的硬件,借使斩断其石英钟源 ,就不会再职业,从而达成降低功耗的目标,那也是便携嵌入式设备里的一个特色。

电子原子钟源:为了减小外部情状对开采板电磁忧虑,减少制作开销,常常开辟板的外表晶振时钟频率都好低,MINI2440开垦板由12MHz的晶振来提供挂钟源,要想让CPU运维在更加高的频率就要通过时钟调节逻辑单元PLL(锁相环)来加强主频。

S3C2440里有八个PLL:MPLL和UPLL,MPLL用来产生FCLK,HCLK,PCLK的一再专门的学业石英钟,UPLL用来为USB提供工作频率。

 图片 8

图2-47系统石英钟开端化时序

开辟板上电后,晶振OSC初步提供晶振机械钟,由于系统刚刚上电,电压非时限信号等都还不安定,当时重置随机信号(nRESET)拉低,当时MPLL即使暗中同意运行,不过假设不向MPLLCON中写入值,那么外界晶振则一贯作为系统石英钟FCLK,过几飞秒后,重置信号上拉,CPU伊始取指运营,这个时候能够经过代码设置运行MPLL,MPLL运行须求一定锁依期期(LockTime),那是因为MPLL输出频率还没平安,在当时期FCLK都终止输出,CPU截至职业,过了LockTime后机械钟牢固出口,CPU职业在新安装的功效下,那个时候能够由此设置FCLK,HCLK和PCLK三者的频率比例来发出不一样总线上急需的不等频率,上面详细介绍开启MPLL的长河:

l  设置LockTime变频锁按期期

l  设置FCLK与晶振输入频率(Fin)的翻番

l  设置FCLK,HCLK,PCLK三者之间的比例

LockTime变频锁定期期由LOCKTIME寄放器(见下表)来安装,由于变频后开拓板全数重视石英钟工作的硬件都亟待一小段调治时间,该时间计数通过安装LOCKTIME寄存器[31:16]来安装UPLL(USB石英钟锁相环)调解时间,通过设置LOCKTIME贮存器 [15:0]安装MPLL调度时间,那四个调度时间数值平常用其私下认可值就可以。

表2-8变频锁如时期存放器(LOCKTIME卡塔尔(英语:State of Qatar)

寄存器名

地址

是否读写

描述

复位默认值

LOCKTIME

0x4C000000

R/W

变频锁定时间寄存器

0xFFFFFFFF

 

LOCKTIME

描述

初始值

U_TIME

[31:16]

UPLL对UCLK的锁定时间值

(U_TIME:300us)

0xFFFF

M_TIME

[15:0]

MPLL对于FCLK,HCLK,PCLK的锁定时间值(M_TIME:300us)

0xFFFF

FCLK与Fin的翻番通过MPLLCON寄放器设置,三者从前有以下关系:

MPLL(FCLK) = (2*m*Fin)/(p*2^s)

其中:m = MDIV 8, p = PDIV 2, s = SDIV

当设置完MPLL之后,就能自动步向LockTime变频锁准期间,LockTime之后,MPLL输出稳固石英钟频率。

表2-9 MPLL配置贮存器(MPLLCON卡塔尔(英语:State of Qatar)

寄存器名

地址

是否读写

描述

复位默认值

MPLLCON

0x4C000004

R/W

MPLL配置寄存器

0x00096030

 

MPLLCON

描述

初始值

MDIV

[19:12]

主分频器控制位

0x96

PDIV

[9:4]

预分频器控制位

0x03

SDIV

[1:0]

后分频器控制位

0x0

由此上述算法相比为难找到适当的PLL值,下表给出了官方推荐的生机勃勃部分MPLL参照他事他说加以调查设置:

表2-10 官方推荐MPLL

图片 9

 

FCLK,HCLK,PCLK三者之间的比重通过CLKDIVN存放器进行安装,S3C2440时钟设置时,还要额外设置C英特尔IVN贮存器,如下表,HCLK4_HALF,HCLK3_HALF分别与CAMDIVN[9:8]对应,下表列出了各个石英钟比例:

表2-11 FCLK HCLK PCLK设置比例

图片 10

 

假使HDIV设置为非0,CPU的总线情势要拓宽改变,私下认可意况下FCLK = HCLK,CPU专业在fast bus mode火速总线形式下,HDIV设置为非0后, FCLK与HCLK不再相等,要将CPU改为asynchronous bus mod异步总线形式,可以通过上面包车型客车嵌入汇编代码完成:

__asm{ 

mrc p15, 0, r1, c1, c0, 0         /* 读取CP15 C1寄存器 */ 

orr r1, r1, #0xc0000000         /* 设置CPU总线形式 */ 

mcr p15, 0, r1, c1, c0, 0         /* 写回CP15 C1寄存器 */

关于mrc与mcr指令,请查看MMU与内部存款和储蓄器敬爱的达成章节。

表2-12时钟分频器调控寄放器(CLKDIVN)

寄存器名

地址

是否读写

描述

复位默认值

CLKDIVN

0x4C000014

R/W

时钟分频器控制寄存器

0x00000000

 

CLKDIVN

描述

初始值

DIV_UPLL

[3]

UCLK选择寄存器(UCLK必须对USB提供48MHz)

0:UCLK=UPLL clock

1:UCLK=UPLL clock/2

0

HDIVN

[2:1]

00:HCLK = FCLK/1

01:HCLK = FCLK/2

10:HCLK = FCLK/4,当CAMIVN[9]=0

HCLK = FCLK/8,当CAMIVN[9]=1

11: HCLK = FCLK/3,当CAMIVN[8]=0

HCLK = FCLK/6,当CAMIVN[8]=1

0

PDIVN

[0]

0:PCLK是和HCLK/1相同时钟

1:PCLK是和HCLK/2相同时钟

0

表2-13摄像头石英钟分频调节存放器(CIntelIVN)

寄存器名

地址

是否读写

描述

复位默认值

CAMDIVN

0x4C000018

R/W

摄像头时钟分频控制寄存器

0x00000000

 

CAMDIVN

描述

初始值

HCLK4_HALF

[9]

HDIVN分频因子选择位(当CLKIVN[2:1]位为10b时有效)

0: HCLK=FCLK/4

1: HCLK=FCLK/8

0

HCLK3_HALF

[8]

HDIVN分频因子选择位(当CLKIVN[2:1]位为11b时有效)

0: HCLK=FCLK/3

1: HCLK=FCLK/6

0

1 /* 3. 初始化SDRAM */
2     ldr r0, =MEM_CTL_BASE //SDRAM控制器寄存器首地址,总计需要对13个寄存器配置完成SDRAM的初始化工作
3     adr r1, sdram_config  //读取sdram_config的当前地址到r1,此地址取决于当前PC值,是相对跳转
4     add r3, r0, #(13*4)   //r3=r0 52  r3值代表了全部控制寄存器所占地址空间大小,总计52字节
5 1:
6     ldr r2, [r1], #4      //从r1所指的地方加载指存入r2,之后r1=r1 4,地址加4字节,32位
7     str r2, [r0], #4      //将r2的值存入r0所指的地方,之后r0=r0 4
8     cmp r0, r3
9     bne 1b                //b表示back

 1 sdram_config:
 2     .long 0x22011110     //BWSCON
 3     .long 0x00000700     //BANKCON0
 4     .long 0x00000700     //BANKCON1
 5     .long 0x00000700     //BANKCON2
 6     .long 0x00000700     //BANKCON3  
 7     .long 0x00000700     //BANKCON4
 8     .long 0x00000700     //BANKCON5
 9     .long 0x00018005     //BANKCON6
10     .long 0x00018005     //BANKCON7
11     .long 0x008C04F4     //REFRESH
12     .long 0x000000B1     //BANKSIZE
13     .long 0x00000030     //MRSRB6
14     .long 0x00000030     //MRSRB7

 

开发银行代码烧写在NAND,待系统上电后,片内SRAM会加载NAND的伊始4K内容。因而运行代码起先地址为:0x00000000图片 11

参考:

  • 读多少(大小)

l   PCLK:50MHz

SDRAM由BANK6调控,bank6地址空间为0x30000000~0x38000000,共计128MB。上海体育场面所示SDRAM存款和储蓄空间为64M,因而SDRAM地址空间为0X30000000~0X33FFFFFF。

MINI2440开辟板在从来不拉开石英钟前,整个开荒板全靠一个12MHz的晶振提供频率来运营,约等于说CPU,内部存款和储蓄器,UART等急需用到机械钟频率的硬件都干活12MHz下,而S3C2440A能够健康干活在400MHz下,两个速度相差总体上看,就好比牛车和轻轨。假诺CPU职业在12MHz频率下,开辟板的行使频率超级低,全数重视系统机械钟职业的硬件,其工效也超级低,例如,大家Computer内部平时涉及的超频,超频就是让CPU职业在越来越高的作用下,让计算机械运输算速度更加快,固然频率是越高越好,不过出于硬件性情决定了别的一个配备都不容许无边无际的超频,计算机超频时要思忖到CPU或主板发热过大,烧坏的危险,同样开荒板的主板上的外设和CPU也会有三个功能限度,ARM920T内核的S3C2440的万丈寻常专门的学业频率如下:

bootloader 是二个用来运行linux内核的C程序,为了达到最终运行水源的指标供给完成以下多少个步骤:

step3:设置须要传递给根底的运维参数;


将起动代码从片内SRAM复制到SDRAM中,使用C代码编写。调用C代码必要安装栈,至于缘何要设置栈请参阅

图片 12

step4:跳转到SDRAM,运维基本;

    #define S3C2440_MPLL_200MHZ     ((0x5c<<12)|(0x01<<4)|(0x02))

    /* 2. 设置时钟 */     //先设置各个时钟的比例对CLKDIVN赋值,之后设置系统时钟对MPLLCON赋值
    ldr r0, =0x4c000014  //CLKDIVN : CLOCK DIVIDER CONTROL REGISTER  Address = 0x4c000014
    mov r1, #0x03        //FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1   FCLK=200MHZ HCLK=100MHZ PCLK=50MHZ
    str r1, [r0]         //将r1中的值存到r0所指定的地址中

    /* 如果HDIVN非0,CPU的总线模式应该从“fast bus mode”变为“asynchronous bus mode” */
    mrc    p15, 0, r1, c1, c0, 0        /* 读出控制寄存器 */ 
    orr    r1, r1, #0xc0000000          /* 设置为“asynchronous bus mode” */
    mcr    p15, 0, r1, c1, c0, 0        /* 写入控制寄存器 */

    /* MPLLCON = S3C2440_MPLL_200MHZ */
    ldr r0, =0x4c000004                      //MPLLCON Address = 0x4c000004
    ldr r1, =S3C2440_MPLL_200MHZ             // S3C2440_MPLL_200MHZ值比较复杂,使用ldr伪汇编
    str r1, [r0]

 

 

 

骨干流程见下图1

(4)重平昔代码

本体系博文化总同盟结了团结在读书嵌入式Linux编制程序进程中的收获,若有错误,恳请指正,多谢!

  1. MPLLCON 设置MPLL锁相环倍频因子;

——参照他事他说加以考查教材韦东山连串教材

step1:硬件相关最初化,为运营水源考虑硬件平台;

 

step2:将基本从NAND FLASH读取到SDRAM;

  • 从哪去读取运维代码(源地址)

          MPLL计算公式 : Mpll = (2 * m * Fin) / (p * 2S卡塔尔   ;   m = (MDIV 8卡塔尔国, p = (PDIV 2卡塔尔, s = SDIV ;Fin决计于外界晶振频率,JZ2440开荒板的 [OM2:OM3] 设置为 [0:0] ,因此

  • 读到哪去(目标地址)

  下图是SDRAM的法则图,由两片32M的SDRAM级联成64M,访问叁次传递4字节数据。

 

 第一步:硬件相关伊始化,为运维水源希图硬件平台

 图片 13

 

         FCLK, HCLK, and PCLK
         FCLK is used by ARM920T.
         HCLK is used for AHB bus, which is used by the ARM920T, the memory controller, the interrupt controller, the LCD controller, the DMA and USB host block.
         PCLK is used for APB bus, which is used by the peripherals such as WDT, IIS, I2C, PWM timer, MMC interface,ADC, UART, GPIO, RTC and SPI.

SDRAM 原理图

 1 /* 4. 重定位 : 把bootloader本身的代码从flash复制到它的链接地址去 */
 2     ldr sp, =0x34000000    //设置栈,copy函数使用C语言写,调用C代码之前需要设置栈
 3     bl nand_init
 4     
 5     mov r0, #0              //传递参数给 copy_code_to_sdram, 对于NOR 启动
 6     ldr r1, =_start         //链接地址即为代码存储区的首地址 _start = 0x33f80000;
 7     ldr r2, =__bss_start    //代码段不包括bss段
 8     sub r2, r2, r1          //除去BSS段外的所有代码的空间大小
 9 
10     bl copy_code_to_sdram   //参数依次为r0,r1,r2
11     bl clear_bss

          main clock和USB clock 信赖外界12MHZ 晶振。


1     ldr r0, =0x53000000  //WTCON : WATCHDOG TIMER CONTROL REGISTER  Address = 0x53000000
2     mov r1, #0           //bit 0 = 0 : Disable the reset function of the watchdog timer.
3     str r1, [r0]         //将r1中的值存到r0所指定的地址中

(2)设置系统机械钟

本文由美高梅4858官方网站发布,转载请注明来源

关键词: