exynos 4412 時鐘配置

/**
******************************************************************************
* @author    Maoxiao Hu
* @version   V1.0.0
* @date       Jan-2015
******************************************************************************
* < COPYRIGHT 2015 ISE of SHANDONG UNIVERSITY >
******************************************************************************
**/
本文會不時完善和糾正一些小錯誤,還請到  http://www.cnblogs.com/humaoxiao 參考最新版本。
時鐘初始化的通常方法和順序,u-boot、普通裸機程序若是須要均可以使用。
 
—————————————————————————————-
本文解決的問題:
一、宏觀上幾個大模塊的時鐘配置順序。
二、小模塊的時鐘選擇、分頻和通常的配置順序。
三、對小模塊來講,官方手冊推薦的時鐘源選擇問題。
四、本文只以手冊的「 推薦配置」進行說明,「自由玩法」不保證穩定性。
—————————————————————————————-
多路選擇器選擇原則:
一、儘可能保持默認配置不動。
二、儘可能選擇前端頻率最高的源。
三、其它手冊要求的特殊狀況。
—————————————————————————————-
幾個符號:
NewImage
        左邊深色的:無抖動多路選擇器,無抖動意味着在多路選擇切換的瞬間,下游時鐘就能夠穩定下來。須要注意是在切換時要保證上游時鐘已經存在並穩定,否則下游時鐘狀態不肯定。
        右邊淺色的:有抖動多路選擇器,意味着多路選擇切換後,要經歷一段時間的不穩定時間,可是有穩定後有相應寄存器標誌位標示下游時鐘已經穩定,這類指示寄存器器通常以 CLK_MUX_STAT開頭。
 —————————————————————————————-
全局約束條件:
一、無抖動多路選擇器的時鐘源須要存在而且穩定
二、當某個PLL被設置爲關閉狀態,是不可使用它的輸出信號的。
 —————————————————————————————-
晶振說明:
因爲通常USB IP核須要直接使用高精度時鐘,因此在XUSBXTI引腳上接24M晶振,XXTI引腳就不須要接了。手冊上說因爲iROM代碼是根據24M晶振頻率設計的,因此24M的選擇沒什麼好說的。
 —————————————————————————————-

1、時鐘之源PLL配置

      緣由:根據全局約束條件2,若是PLL關閉那麼不可使用它的輸出,再根據全局約束條件1,多路選擇器此時只能選擇外部時鐘!而24M的時鐘直接做爲系統的時鐘顯然是不合適的!
      4412有4個PLL: APLL, MPLL, EPLL, and VPLL。推薦使用24M外部晶振做爲它們的時鐘源。
理論上講,4個PLL都可以在22 ~ 1400MHz之間自由設置,可是手冊強烈推薦的頻率範圍爲:

/*———————————————*/
APLL & MPLL:200 ~ 1400MHz
EPLL:90 ~ 416MHz
VPLL:100 ~ 440MHz
/*———————————————*/

1.0 設置PLL_LOCKTIME

        PLL頻率從小變到指定頻率須要一段時間(圖中標紅框的部分雖然不是PLL實際波形但能夠參考着理解),當PLL頻率在變化的時候,好比由復位後的初始的400MHz升到1000MHz, 這時,首先把CPU的頻率鎖定,因這此時CPU的頻率是變化的,頻率變化,CPU的狀態就沒法肯定,因此,此時用 PLL_LOCKTIME 將CPU頻率鎖定一段時間,直到頻率輸出穩定爲止。芯片手冊上顯示APLL最大的鎖定時間爲100us(Table 60 -9),若是外部晶振是24MHz,100us換算成tick就是2400個tick,因此html

APLL_LOCK(Address:0x1004_4000)寄存器該寫入0x960前端

MPLL_LOCK(Address:0x1004_0008)寄存器該寫入0x190web

EPLL_LOCK(Address:0x1003_C010)寄存器該寫入0xBB8spa

VPLL_LOCK(Address:0x1003_C020)寄存器該寫入0x190。設計



1.1 APLL & MPLL的倍頻值:

設定對應寄存器的 P、M、S 三個值,不一樣的搭配最終頻率不一樣,無須本身計算,系統推薦的搭配以下:

NewImage

1.2 EPLL的倍頻值:

設定對應寄存器的 P、M、S、K 四個值,不一樣的搭配最終頻率不一樣,無須本身計算,系統推薦的搭配以下:
 
NewImage
 

1.3 VPLL的倍頻值

設定對應寄存器的 P、M、S、K 四個值,不一樣的搭配最終頻率不一樣,無須本身計算,系統 推薦 的搭配以下:
 
NewImage
 

 1.4 等待PLL穩定

若是PLL輸出穩定了,那麼PLL_CON0的Bit[29]會由0變1。
查詢用匯編實現,以APLL爲例:
/*———————————————————————*/
wait_pll_lock:
    ldr r1, [r0, r2]
    tst r1, #(1<<29)
    beq  wait_pll_lock
    mov pc, lr
 
ldr r0, =CMU_BASE /* 0x10030000 */
ldr r2, =APLL_CON0_OFFSET /* 0x14100 */
bl wait_pll_lock
/*———————————————————————*/

2、主要模塊的初始化順序

􏰡雖然官方文檔中並無強制按下面的順序初始化,可是按照邏輯來說,是應該使用這個順序的。htm


 一、CLK_DIV_CPU0[31:0] = target value0blog

􏰡 二、CLK_DIV_DMC0[31:0] = target value1ci

􏰡 三、CLK_DIV_TOP[31:0] = target value2文檔

􏰡 四、CLK_DIV_LEFTBUS[31:0] = target value3get

􏰡 五、CLK_DIV_RIGHTBUS[31:0] = target value4

 

上個直觀點的圖:

QQ20150113 1
 
 

3、上游多路選擇器的配置

上游多路選擇器決定下游模塊的時鐘源,CMU_CPU有4個MUX,CMU_DMC有四個MUX,CMU_TOP有14個MUX,CMU_LEFTBUS有2個MUX, CMU_RIGHTBUS有2個MUX。
固然下游還有其它很是多的MUX,先擱置一下暫且不說。

3.1 CMU_CPU MUXs配置

 
CMU_CPU有4個MUX,配置寄存器CLK_SRC_CPU,基地址0x1004_4200。配置完成後,最靠近PLL的兩個MUX均切換時鐘源至PLL。
MUXs
 

3.2 CMU_DMC MUXs配置

CMU_DMC有8個MUX,配置寄存器CLK_SRC_DMC,基地址0x1004_0200。配置完成後,最靠近PLL的一個MUX切換時鐘源至PLL。
 
MUXs

3.3 CMU_TOP MUXs配置

CMU_TOP有13個MUX,配置寄存器CLK_SRC_TOP0 CLK_SRC_TOP1,基地址0x1003_C210 0x1003_C214
MUXs

3.4 CMU_LEFTBUS & CMU_RIGHTBUS MUXs配置

CMU_LEFTBUS & CMU_LEFTBUS各有2個MUX,配置寄存器CLK_SRC_LEFTBUS CLK_SRC_RIGHTBUS,基地址0x1003_4200 0x1003_8200

MUXs

4、分頻器的配置

分頻器的位置通常在MUX以後,一般是一個MUX,但若是須要旁路時鐘輸出,可能須要兩個或更多個分頻器級連來獲取最終的頻率。
分頻器設置的前提條件(手冊並沒有強制要求,根據各類約束條件得到,有疑問留言討論):
一、若是分頻器上級還有分頻器,請首先保證上級分頻器頻率已穩定,一直確認到上級是MUX爲止。
二、確認上級級連的一個或多個MUX已使能且輸出穩定,一直確認到上級是APLL MPLL EPLL VPLL這四個PLL爲止。
三、確認APLL MPLL EPLL VPLL已使能且輸出穩定。

分頻器設置時,必然會影響與它相連的全部IP核,因此我的認爲設置分頻器時,應保證下游IP核中止工做,待分頻器穩定後再從新初始化下游IP核。
 

5、舉例

按照PLL -> MUX ->分頻器的順序舉例說明。

5.1 PLLLOCKTIME

APLL_LOCK(Address:0x1004_4000)寄存器該寫入0x00000960

MPLL_LOCK(Address:0x1004_0008)寄存器該寫入0x00000190

EPLL_LOCK(Address:0x1003_C010)寄存器該寫入0x00000BB8

VPLL_LOCK(Address:0x1003_C020)寄存器該寫入0x00000190

 

5.2 PLL

APLL 1000MHz 0x10044100寄存器 寫入 0x807D0300,注:爲何此時APLL通常不設置到1400MHz?由於ARM_CORE從APLL取時鐘,可是此時電源管理芯片上電默認給ARM_CORE只提供1.1V的電壓,反查手冊後發如今1.1V下,ARM核最高只能運行在1000MHz,要想運行在1400MHz須要設置電源管理芯片輸出1.4V電壓。
MPLL 800MHz 0x10040108寄存器 寫入 0x80640300
EPLL 400MHz 0x1003C110寄存器 寫入 0x80640301 / 0x1003C114 寄存器 寫入0x66010000/0x1003C118 寄存器 寫入0x00000080
VPLL 100MHz 0x1003C120寄存器 寫入 0x80640303 / 0x1003C124 寄存器 寫入0x66016000/0x1003C128 寄存器 寫入0x00000080

5.3 MUX

按照3.1 - 3.4節配置後的通路。
CMU_CPU:0x10044200 寄存器寫入 0x01000001
CMU_DMC:0x10040200 寄存器寫入 0x00011000
CMU_TOP:0x1003C210 寄存器寫入 0x00000110/0x1003C214 寄存器寫入 0x00011000
CMU_LEFTBUS:0x10034200 寄存器寫入 0x00000010
CMU_RIGHTBUS:0x10038200 寄存器寫入 0x00000010

5.4 分頻器

5.4.1 LEFTBUS

0x10034500 寄存器寫入 0x00000013,這樣ACLK_GDL = 200MHz ACLK_GPL = 100MHz。
NewImage

5.4.2 RIGHTBUS

0x10038500 寄存器寫入 0x00000013,這樣ACLK_GDR = 200MHz ACLK_GPR = 100MHz。

NewImage

5.4.3 DMC

0x10040500 寄存器寫入 0x00111113/0x10040504 寄存器寫入 0x01011113。
這樣,
ACLK_ACP = 200MHz
PCLK_ACP = 100MHz
SCLK_DPHY = 400MHz
SCLK_DMC (DDR時鐘) = 400MHz
ACLK_DMCD = 200MHz
ACLK_DMCP = 100MHz
SCLK_G2D_ACP = 200MHz
SCLK_C2C = 400MHz
ACLK_C2C = 200MHz
SCLK_PWI = 12MHz 
NewImage

5.4.4 CPU

0x10044500寄存器寫入0x01143730/0x10044504寄存器寫入 0x00000004。

這樣:
NewImage

5.4.5 TOP

0x1003C510 寄存器寫入 0x01205473。
NewImage
 
至此,時鐘全部配置結束。
 
通過整理後的JLink時鐘初始化腳本,會放到這裏 《JLink V8初始化exynos4412腳本》

參考資料:《Exynos 4412 SCP User’s Manual Rev 0.10》。
 
感謝:迅爲u-boot相關代碼。
相關文章
相關標籤/搜索