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。


發佈了49 篇原創文章 · 獲贊 30 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章