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、普通裸機程序如果需要都可以使用。
 
—————————————————————————————-
本文解決的問題:
1、宏觀上幾個大模塊的時鍾配置順序。
2、小模塊的時鍾選擇、分頻和一般的配置順序。
3、對小模塊來說,官方手冊推薦的時鍾源選擇問題。
4、本文只以手冊的“ 推薦配置”進行說明,“自由玩法”不保證穩定性。
—————————————————————————————-
多路選擇器選擇原則:
1、盡量保持默認配置不動。
2、盡量選擇前端頻率最高的源。
3、其它手冊要求的特殊情況。
—————————————————————————————-
幾個符號:
NewImage
        左邊深色的:無抖動多路選擇器,無抖動意味着在多路選擇切換的瞬間,下游時鍾就可以穩定下來。需要注意是在切換時要保證上游時鍾已經存在並穩定,不然下游時鍾狀態不確定。
        右邊淺色的:有抖動多路選擇器,意味着多路選擇切換后,要經歷一段時間的不穩定時間,但是有穩定后有相應寄存器標志位標示下游時鍾已經穩定,這類指示寄存器器一般以 CLK_MUX_STAT開頭。
 —————————————————————————————-
全局約束條件:
1、無抖動多路選擇器的時鍾源需要存在並且穩定
2、當某個PLL被設置為關閉狀態,是不可以使用它的輸出信號的。
 —————————————————————————————-
晶振說明:
由於一般USB IP核需要直接使用高精度時鍾,所以在XUSBXTI引腳上接24M晶振,XXTI引腳就不需要接了。手冊上說由於iROM代碼是根據24M晶振頻率設計的,所以24M的選擇沒什么好說的。
 —————————————————————————————-

一、時鍾之源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,所以

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

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

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

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
/*———————————————————————*/

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

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


 1、CLK_DIV_CPU0[31:0] = target value0

􏰡 2、CLK_DIV_DMC0[31:0] = target value1

􏰡 3、CLK_DIV_TOP[31:0] = target value2

􏰡 4、CLK_DIV_LEFTBUS[31:0] = target value3

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

 

上個直觀點的圖:

QQ20150113 1
 
 

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

上游多路選擇器決定下游模塊的時鍾源,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

四、分頻器的配置

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

分頻器設置時,必然會影響與它相連的所有IP核,所以個人認為設置分頻器時,應保證下游IP核停止工作,待分頻器穩定后再重新初始化下游IP核。
 

五、舉例

按照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相關代碼。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM