/**
******************************************************************************
* @author Maoxiao Hu
* @version V1.0.0
* @date Jan-2015
******************************************************************************
* < COPYRIGHT 2015 ISE of SHANDONG UNIVERSITY >
******************************************************************************
**/
時鐘初始化的通常方法和順序,u-boot、普通裸機程序若是須要均可以使用。
—————————————————————————————-
本文解決的問題:
一、宏觀上幾個大模塊的時鐘配置順序。
二、小模塊的時鐘選擇、分頻和通常的配置順序。
三、對小模塊來講,官方手冊推薦的時鐘源選擇問題。
四、本文只以手冊的「
推薦配置」進行說明,「自由玩法」不保證穩定性。
—————————————————————————————-
多路選擇器選擇原則:
一、儘可能保持默認配置不動。
二、儘可能選擇前端頻率最高的源。
三、其它手冊要求的特殊狀況。
—————————————————————————————-
幾個符號:
左邊深色的:無抖動多路選擇器,無抖動意味着在多路選擇切換的瞬間,下游時鐘就能夠穩定下來。須要注意是在切換時要保證上游時鐘已經存在並穩定,否則下游時鐘狀態不肯定。
右邊淺色的:有抖動多路選擇器,意味着多路選擇切換後,要經歷一段時間的不穩定時間,可是有穩定後有相應寄存器標誌位標示下游時鐘已經穩定,這類指示寄存器器通常以
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 三個值,不一樣的搭配最終頻率不一樣,無須本身計算,系統推薦的搭配以下:
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
/*———————————————————————*/
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
上個直觀點的圖:
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。
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。
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。
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相關代碼。