/**
******************************************************************************
* @author Maoxiao Hu
* @version V1.0.0
* @date Jan-2015
******************************************************************************
* < COPYRIGHT 2015 ISE of SHANDONG UNIVERSITY >
******************************************************************************
**/
時鍾初始化的一般方法和順序,u-boot、普通裸機程序如果需要都可以使用。
—————————————————————————————-
本文解決的問題:
1、宏觀上幾個大模塊的時鍾配置順序。
2、小模塊的時鍾選擇、分頻和一般的配置順序。
3、對小模塊來說,官方手冊推薦的時鍾源選擇問題。
4、本文只以手冊的“
推薦配置”進行說明,“自由玩法”不保證穩定性。
—————————————————————————————-
多路選擇器選擇原則:
1、盡量保持默認配置不動。
2、盡量選擇前端頻率最高的源。
3、其它手冊要求的特殊情況。
—————————————————————————————-
幾個符號:
左邊深色的:無抖動多路選擇器,無抖動意味着在多路選擇切換的瞬間,下游時鍾就可以穩定下來。需要注意是在切換時要保證上游時鍾已經存在並穩定,不然下游時鍾狀態不確定。
右邊淺色的:有抖動多路選擇器,意味着多路選擇切換后,要經歷一段時間的不穩定時間,但是有穩定后有相應寄存器標志位標示下游時鍾已經穩定,這類指示寄存器器一般以
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 三個值,不同的搭配最終頻率不同,無須自己計算,系統推薦的搭配如下:
1.2 EPLL的倍頻值:
設定對應寄存器的 P、M、S、K 四個值,不同的搭配最終頻率不同,無須自己計算,系統推薦的搭配如下:
1.3 VPLL的倍頻值
設定對應寄存器的 P、M、S、K 四個值,不同的搭配最終頻率不同,無須自己計算,系統
推薦
的搭配如下:
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
上個直觀點的圖:
三、上游多路選擇器的配置
上游多路選擇器決定下游模塊的時鍾源,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。
3.2 CMU_DMC MUXs配置
CMU_DMC有8個MUX,配置寄存器CLK_SRC_DMC,基地址0x1004_0200。配置完成后,最靠近PLL的一個MUX切換時鍾源至PLL。
3.3 CMU_TOP MUXs配置
CMU_TOP有13個MUX,配置寄存器CLK_SRC_TOP0 CLK_SRC_TOP1,基地址0x1003_C210 0x1003_C214。
3.4 CMU_LEFTBUS & CMU_RIGHTBUS MUXs配置
CMU_LEFTBUS & CMU_LEFTBUS各有2個MUX,配置寄存器CLK_SRC_LEFTBUS CLK_SRC_RIGHTBUS,基地址0x1003_4200 0x1003_8200。

四、分頻器的配置
分頻器的位置一般在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。
5.4.2 RIGHTBUS
0x10038500 寄存器寫入 0x00000013,這樣ACLK_GDR = 200MHz ACLK_GPR = 100MHz。
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
5.4.4 CPU
0x10044500寄存器寫入0x01143730/0x10044504寄存器寫入 0x00000004。
這樣:
5.4.5 TOP
0x1003C510 寄存器寫入 0x01205473。
至此,時鍾所有配置結束。
參考資料:《Exynos 4412
SCP User’s Manual Rev 0.10》。
感謝:迅為u-boot相關代碼。