Bootloader学习分析

某款2440(b2440)开发板的BootLoader分析

1、包含文件:

 GET option.inc
 GET memcfg.inc
 GET 2440addr.inc

option.inc 顾名思义是可以改变的配置选项,其中包括一些起始地址,初始状态,总线宽度,时钟频率。如果以后对系统的设置有变化,直接修改”option.inc”中的配置即可,无需大量改动boot loader.

 

对b2440中option.inc分析如下:
;Start address of each stacks,
_STACK_BASEADDRESS EQU 0x33ff8000 ; STACK 的起始地址
_MMUTT_STARTADDRESS EQU 0x33ff8000 ; 定义MMU表基地址
_ISR_STARTADDRESS EQU 0x33ffff00 ; 定义中断向量表的地址

补充MMU知识:

a.        什么是MMU

MMU – Memory Management Unit 缩写, 用来管理virtual memoryphysical memory的控制线路。

一台256M32bit x86主机来说,virtual memory范围为0~0x(2^32-1)=0xFFFFFFFF (4G), physical memory范围为0~0xFFFFFFF (256M)

在没有使用virtual memory 的机器上, address被送到内存总线上,是具有同地址的physical memory被读写;而使用了virtual memory的情况下,address不是直接被送到内存address bus上,而是送到了memory management unit (MMU), virtual address映射到physical address上。

大多数使用virtual memory的系统都使用一种称为分页(paging)机制。Virtual address space划分成page的单位,而相应的physical address space也被进行划分,单位是页帧 (). Page 和的大小必须相同。如上一例256M32bit的机器虽然只有256Mphysical address,但是可以运行4Gprogram, 但该program 不能一次性调入内存运行。首先,这台机器必须有一个大到可以存放4G的程序外部存储器(flash), 以保证程序片段在需要时可以被调用。如此例,page大小为4K page相同,因为内存和外围存储器之间的传输总是以page为单位的。对应的4Gvirtual address存储器和256Mphysical address 存储器,分别包含了1M page4K 

b.        MMU 的功能

Translating virtual address to Physical address

现代的多用户,多进程的操作系统,需要MMU, 才能使每个用户进程都能拥有自己独立的地址空间  使用MMU, 操作系统划分一段地址区域,在这块地址区域中,每个进程看到的内容都不一样。例如MICROSOFT WINDOWS Operating system将地址范围4M-2G划分为用户地址空间, 进程A在地址0x400000(4M) 映射了可执行文件,进程B在相同地址映射可执行文件。如果进程A读地址0x400000,读到的是A的可执行文件映射到RAM的内容,而进程B读取地址0x400000时,读到的是B的可执行文件映射到RAM的内容。这就是MMU在进行地址转换所起的作用。

 

Option.inc 还包括:

设置初始值:

  GBLL  PLL_ON_START      ;GBLL 指令声明一个全局逻辑变量,并将其值初始化为 {FALSE}。

PLL_ON_START SETL  {TRUE} ; 设置PLL 初始状态

ENDIAN_CHANGE SETL {FALSE}  ;设置模式改变 选择ENDIAN,具体值应该根据硬件的设置来定

ENTRY_BUS_WIDTH; 配置入口总线宽度

  GBLA ENTRY_BUS_WIDTH ;GBLA 指令声明一个全局算术变量,并将其值初始化为 16。

ENTRY_BUS_WIDTH SETA 16; 配置GPIO的总线宽度

UCLK; 配置USB clock (见芯片手册214页)

;(1) Select CPU          

;CPU_SEL    SETA     32440000     ; 32440000:2440X.

CPU_SEL     SETA     32440001     ; 32440001:2440A 配置ARM chip ID

XTAL_SEL  SETA     12000000   ; 配置晶振频率

FCLK; 配置FLCK

CLKDIV_VAL; 设置CLOCK DIVISION

根据设置CPU_SEL, UCLK, XTAL_SEL, FCLK, CLIKDIV_VAL是用 “if”语句来配置相应的参数如M_MDIV, M_PDIV, M_SDIV, U_MIDV, U_PDIV, U_SDIV

公式如下:FCLK=Mpll=(2*m*Fin)/(p*2^s)

m=M(the value for divider M)+8, p=P(the value for divider P)+2

" [ " 相当于 if 
" | "相当于else 
" ] " 相当于endif

CLOCK and POWER MANAGEMENT知识补充 (见芯片手册208

参考: http://hi.baidu.com/caibaihui/blog/item/ae635cd3f71506daa9ec9a9e.html

a.        Overview

                     i.            The Clock & Power management block consists of three parts: clock control, USB control, and Power Control.

                    ii.            S3C2440A 有两个PLL (phase locked loop, 锁相环,可以实现倍频,S3C2440的高频就是由此电路产生). 其中一个PLL, MPLL (main PLL), 用来产生三种时钟信号:FCLK (CPU核供给的时钟信号,也就是我们所说的S3C2440CPU主频相应的, 1/FCLK即为CPU实践中周期), HCLK (AHB bus peripherals供给时钟信号, AHBadvanced high-performance bus), PCLK (APB bus peripherals 供给时钟信号). 另一个PLL用来产生USB Block (48MHz).在这里,需要了解一下AMBA system  architecture了, 可以到www.arm.com下载相关资料。 简单来说, AMBA使一种协议,这种协议成为片上组织通信的事实上的标准。英文描述如下:

The AMBA protocol is an open standard, on-chip bus specification that details a strategy for the interconnection and management of al blocks that makes up a system-on-chip (SoC). It facilitates “right-first-time” development of embedded processors with one or more CPU/signal processors and multiple peripherals. The AMBA protocol enhances a reusable design methodology by defining a common backbone for SoC modules.

需要知道的是, AMBA总线是ARM提出的一种结局方案,它并非唯一的规范,但是因为ARM的广泛使用,AMBA总线也就是事实上的规范了。现在AMBA总线最新为AMBA 3 specification版本,包括了AMBA 3 AXI interfaceAMBA 3 AHB interface, AMBA 3 APB interface AMBA 3 ATB interface. S3C2440A还只能支持AMBA2 specification 这个版本包括含 AMBA 2AHB interfaceAMBA 2 APB interface. 也就是在S3C2440A的框图中看到的良好总总线接口。需要注意的是,这两种总线所连接的外设是有区别的。AHB总线连接高速外设,低俗外设这通过APB总线相互结节。显然,对不同的总线上的外设,应该使用不同的时钟信号,AHB总线度应HCLK APB总线对应PCLK。那么实现就应该弄清楚,每条总线对应的外设有哪些,这样在设置好时钟信号后,对应外设的初始化值就要依此而确定了。

AHB bus上的外设有LCD controller (CONT代表controller,控制器), USB Host CONT, ExtMaster, Nand CONT  Nand flash boot loader, bus CONT, interrupt CONT, power management, memory CONT (SRAM/NOR/SDRAM)

APB bus 上的外设有 UART, USB device, SDI/MMC, Watch Dog Timer, bus CONT, SPI, IIC, IIS, GPIO, RTC, ADC, Timer/PWM.

                  iii.            主时钟源来自外部晶振或者外部时钟。复位后, MPLL虽然默认启动,但是如果不向MPLLCON中写入value, 那么外部晶振直接作为系统时钟,即便是使用默认值或者保持值不变,在复位后,必须软件写入同一个值。EDUKIT-III的外部晶振有两个,一个用于系统时钟,为12MHz;一个哟功能RTC 2.768KHz. 以前试验没有像MPLLCON写入数据,所以系统时钟都是12MHz。从这里可以发现一个问题,如果晶振开始没有焊上,那么系统是无法正常启动的。因为按照上述规则,复位后还没有写入MPLLCON 这是又没有可以使用的时钟源,所以不会启动。也就是硬件完成后,这个12MHz的晶振时一定要焊上的,才能进行后续的硬件测试工作。

                     iv.            USB Clock Control

USB host interface and USB device interface needs 48MHz clock. In the S3C2440A, the USB dedicated PLL (UPLL) generates 48MHz for USB. UCLK does not fed until the PLL (UPLL) is configured.

 

b.        CLOCK配置

  Power-On Reset (XTIpll)

Figure 7-4 shows the clock behavior during the power-on reset sequence. The crystal oscillator begins oscillation within several milliseconds. When nRESET is released after the stabilization of OSC (XTIpll) clock, the PLL starts to operate according to the default PLL configuration. However, PLL is commonly known to be unstable after power-on reset, so Fin isfed directly to FCLK insteadof the Mpll (PLL output) before the software newly configures the PLLCON. Even if the user does not want to change the default value of PLLCON register after reset, the user should write the same value into PLLCON register by software.

The PLL restarts the lockup sequence toward the new frequency only after the software configures the PLL with a new frequency. FCLK can be configured as PLL output (Mpll) immediately after lock time.

这个主要是基于PLL的特点。简单的描述就是,上电复位后,几个ms后晶振起振。当OSC时钟信号稳定之后,nRESET电平拉高(这是硬件自动检测过程)。这个时候,PLL开始按照默认的PLL配置开始工作,但是特苏醒就在于PLL在上电复位后开始时不稳定的,所以S3C2440设计为把Fin在上电复位后直接作为FCLK, 这时MPLL时不起作用的。如果想要使MPLL起作用,那么就要写入MPLLCON寄存器的值,然后等待LOCKTIME时间后,新的FCLK开始工作。下面把这些步骤分开来描述,软件步骤部分结合程序进行。

                     I.            上电几个ms后,晶振输出稳定。FCLK=晶振频率。nRESET恢复高电平后,cpu开始执行指令,这完全是硬件操作,不需要软件设置。

                    II.            第一步软件工作:设置PMS divider control, 也就是设置MPLLCON寄存器。

关于PMS, 可以看到Figure 7-2寄存器MPLLCON的设置,其实有一定规则的,并非你想要的每个FCLK频率都可以得到。官方推荐了一个表PLL VALUE SELECTION TABLE, 要按照这个进行。否则的话,就需要自己按照公式推算,但是mizi公司并不保证你的设置合适的。所以,如果要工作在200MHz, 还是按照vivi的推荐值即可。

 



 三星官方搭载的wince系统的FLCK值为400MHz,HCLK值为100MHz、PCLK值为50MHz。那么这些值通过什么方法计算出来呢?大概过程如下,这些值在外部晶振12MHz的基础上通过PLL的作用倍频到我们需要的核心频率如400MHz,由于该频率过高,需要通过对预分频器进行适当的设置获取外围设备能够正常工作的频率如HCLK 100MHz、PLCK 50MHz。

在这里有必要说明FCLK、HCLK、PCLK的含义,FCLK为内核时钟,HCLK为总线时钟(包括USB时钟),PCLK为I/O接口时钟(如常用的SPI、I2C、UART的时钟配置都是通过PCLK时钟为基准的)。

在WINCE6.0 BSP中,设置MPLLCON与设置CLKDINV的代码如下:

 

;设置MPLLCON

ldr     r0, = MPLLCON

ldr      r1, = ((92 << 12) + (1 << 4) + 1)

str     r1, [r0]

 

MPLLCON的配置是用来确定FCLK频率的,计算公式如下:

图1 计算FLCK

 

 

从“ldr      r1, = ((92 << 12) + (1 << 4) + 1) ”该代码中可以看到数值存在移位操作,即92<<12、1<<4,这个可以参考图2各预分频值的配置。

 

图2 MDIV、PDIV、SDIV

 

MDIV的配置在MPLLCON的[19:12]位,因此配置MDIV的值需要左移12位。同样的道理,配置PDIV值需要左移4位,SDIV值需要左移0位(左移0位相当于不用偏移,废话,嘻嘻)。

 

那么根据图1计算FLCK的公式,计算过程如下:

 

FCLK=2*(92+8)*(12000000)/(3+2^1)=400000000=400MHz

 

    当FCLK得到正确的配置后,这时就需要对HCLK、FCLK进行配置了,即进行预分频操作,该配置过程很见到,只需要对CLKDIVN简单配置一下就OK了。

 

CLKDIVN寄存器内容如图3。

 

;设置CLKDIVN

ldr r0,=CLKDIVN

ldr r1,=0x5

str r1,[r0]

 

在bsp中CLKDIVN的配置值为0x5,即FCLK:HCLK:PCLK=1:4:8。相对应的频率将会是400MHz、100MHz、50MHz。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值