1. 程式人生 > >Exynos4412晶片的時鐘管理單元

Exynos4412晶片的時鐘管理單元

本章介紹Exynos4412晶片的時鐘管理單元(CMU)。CMU控制鎖相環(PLL)併為Exynos4412晶片中的各個IP、匯流排和模組產生時鐘。它們還與電源管理單元(PMU)通訊,以便在進入某個低功耗模式之前停止時鐘,以通過時鐘切換來降低功耗。

1.Exynos4412晶片的時鐘體系介紹

對於PC機來說,CPU、記憶體、主機板、音效卡、顯示卡等等,這些功能部件由不同的晶片組成,在實體上是相互獨立的。在嵌入式系統裡,一塊晶片往往集成了多種功能,比如Exynos4412上面既有CPU,還有音訊/視訊介面、LCD介面、GPS等模組。這類晶片被稱為SoC,即System on Chip,譯為晶片級系統或片上系統。在Exynos 4412晶片中,它以非同步方式為功能塊提供時鐘,以提供更廣泛的工作頻率選擇。它還簡化了物理實現。

不同的模組往往工作在不同的頻率下,在一個晶片上採用單時鐘設計基本上是不可能實現的,在SoC設計中採取多時鐘域設計。4412的時鐘域有5個,如下圖1所示。

                                                                              圖1. Exynos 4412晶片的時鐘域

這5個時鐘域名如下(下文中的BLK表示block,模組):

CPU_BLK:內含Cortex-A9 MPCore處理器、L2 cache控制器、CoreSight(除錯用)。CMU_CPU用於給這些部件產生時鐘。

DMC_BLK:內含DRAM記憶體控制器(DMC)、安全子系統(Security sub system)、通用中斷控制器(Generic Interrupt Controller,GIC)。CMU_DMC用於給這些部件產生時鐘。

LEFTBUS_BLK和RIGHTBUS_BLK:它們是全域性的資料匯流排,用於在DRAM和其他子模組之間傳輸資料。它還包含時鐘頻率為100MHz的全域性外設匯流排。您可以使用100MHz時鐘進行暫存器訪問。

CMU_TOP:為剩餘的功能塊生成時鐘,包括G3D,MFC,LCD0,ISP,CAM,TV,FSYS,MFC,GPS,MAUDIO,PERIL和PERIR。它產生的匯流排時鐘工作在400/200/160/133/100MHz頻率。它還生成各種特殊時鐘來操作Exynos 4412晶片中的IP。

另外,非同步匯流排橋插在兩個不同的功能塊之間。

各個不同的時鐘域已經在圖中使用不同的顏色的框做了相應的標註。

表1中描述了Exynos 4412晶片中每個功能模組的典型工作頻率。

                                                                表1.在Exynos 4412晶片中各個模組的操作頻率

從原理圖上可知,下圖2所示。tiny4412開發板外接24MHz的晶振;但是4412的CPU頻率可達1.4GHz。可以想象,一定有硬體部件,把24MHZ的頻率提升為1.4GHZ,這個部件被稱為PLL。4412內部其他部件也要工作於一定頻率,比UART、DDR裡等,也應該有PLL把24MHZ的頻率提高後供給它們使用。

                    圖2. tiny441開發板連結的外部晶振

4412晶片有3個外部初始時鐘源:

  • XRTCXTI引腳:接32KHz的晶振,用於實時時鐘(RTC)。
  • XXTI引腳:接12M~50MHz的晶振,用於向系統提供時鐘。也可以不接。
  • XUSBXTI引腳:接24MHz的晶振,用於向USB和系統提供時鐘。

在tiny4412的開發板中,XRTCXTI上沒有外接晶振,系統時鐘來源是XUSBXTI引腳上接的24MHz晶振。

Exynos4412有4個PLL:APLL、MPLL、EPLL和VPLL;2個PHY:USB PHY和HDMI PHY(PHY:物理層,一般指與外部訊號介面的晶片):

  • APLL:用於CPU_BLK;作為MPLL的補充,它也可以給DMC_BLK、LEFTBUS_BLK、RIGHTBUS_BLK和CMU_TOP提供時鐘。
  • MPLL:用於DMC_BLK、LEFTBUS_BLK、RIGHTBUS_BLK和CMU_TOP。
  • EPLL:主要給音訊模組提供時鐘。
  • VPLL:主要給視訊系統提供54MHz時鐘,給G3D(3D圖形加速器)提供時鐘。
  • USB PHY:給USB子系統提供30MHz和48MHz時鐘。
  • HDMI PHY:產生54MHz時鐘。

2.Exynos4412中設定PLL的方法

以圖3為例,裡面涉及3個概念:

  • MUX:多路複用,即從多個輸入源中選擇一個;
  • PLL:把低頻率的輸入時鐘提高後輸出;
  • DIV:分頻器,把高頻率的輸入時鐘降頻後輸出。

以APLL為例,它的時鐘來源可以是XXTI引腳上接的晶振,也可以是XUSBXTI引腳上接的晶振,通過圖3中左邊的MUX來選擇,這個MUX的輸出被稱為FINPLL。

通過設定APLL的暫存器(根據公式選擇引數值,晶片手冊上面都有推薦值),可以把FINPLL提高為某個頻率輸出,假設為1.4GHz,在圖上它被命名為FOUTAPLL。

繼續往右看圖,裡面有多個DIV,可以設定對應的暫存器把頻率降下來。CPU可以工作於1.4GHz,但是其他模組不能工作於這麼高的頻率,所以要把頻率降下來。

設定PLL的流程如下:

  • 設定PLL的P、M、S值,這是根據期望得到的頻率用公式計算出來的;
  • 設定PLL的其他控制引數;
  • 使能PLL;
  • PLL會等待一段時間使得時鐘穩定;
  • 設定MUX,選擇PLL所輸出的時鐘。

簡單地說,就是先設定,再啟動,後使用。

PLL暫存器的設定:

4個PLL的暫存器功能是相似的,這些暫存器可以分為6類,見表2。

表2. PLL的暫存器分類

以APLL為例:

APLL_LOCK(地址:0x10044000)

APLL_LOCK的暫存器格式:

設定APLL的引數並使能它後,APLL並不能立刻輸出穩定的時鐘,它需要經歷一個鎖定的時間(lock time)。APLL的最大鎖定時間是:(270 x PDIV)個週期。所以APLL_LOCK設定為(270xPDIV)就可以了。PDIV在後面的APLL_CON1暫存器中介紹。

APLL_CON0(地址:0x10044100):

根據M、P、S的值,可以算出APLL的輸出時鐘:

FOUT=MDIV*FIN/(PDIV*2^{SDIV})

M、P、S的值不能亂取,需要滿足一些限制條件(請參考晶片手冊),晶片手冊裡給出了推薦的取值。

APLL_CON1(地址:0x10044104):

該暫存器用於設定BYPASS模式,即APLL是直接輸出FIN時鐘,還是提升頻率後再輸出時鐘;也用於設定AFC(自動頻率控制)功能,暫時無需理會。該暫存器取預設值即可。

CLK_SRC_CPU(地址:0x10044200):

參考"圖3. APLL時鐘流程圖":

  • BIT[0]控制第1個MUX(即MUXAPLL),用於選擇是使用FIN還是APLL的輸出時鐘,這個輸出被稱為MOUTAPLL。
  • BIT[16]控制第2個MUX(即MUXCORE),用於選擇MOUTAPLL還是SCLKMPLL。其中SCLKMPLL由下面的MUXMPLL控制。
  • BIT[24]控制第3個MUX(即MUXMPLL),用於選擇FINPLL還是FOUTMPLL,這個輸出被稱為SCLKMPLL。其中,FOUTMPLL來自MPLL的輸出。
  • BIT[20]控制第4個MUX(即MUXHPM),用於選擇MOUTAPLL還是SCLKMPLL。
  • CLK_MUX_STAT_CPU(地址:0x10044400):用於讀取CLK_SRC_CPU暫存器裡所設定的MUX狀態。
  • CLK_DIV_CPU0(地址:0x10044500),CLK_DIV_CPU1(地址:0x10044504):

CLK_DIV_CPU1的暫存器格式:

參考"圖3. APLL時鐘流程圖",以CPU的工作頻率ARMCLK為例,根據上述表計算ARMCLK的頻率:

ARMCLK = MUXCORE的輸出/DIVCORE/DIVCORE2
	   = MOUTCORE/(CORE_RATIO + 1)/DIVCORE2
	   = MOUTCORE/(CORE_RATIO + 1)/(CORE2_RATIO + 1)
MOUTCORE表示MUXCORE的輸出,在MUXAPLL和MUXCORE都設定為0時,它等於"MDIV x FIN / (PDIV x 2 ^ SDIV)"。
  • CLK_DIV_STAT_CPU0(地址:0x10044600),CLK_DIV_STAT_CPU1(地址:0x10044604)用於判斷設定分頻引數後,分頻器輸出是否已經穩定。
  • CLK_GATE_IP_CPU(地址:0x10044900)用於控制是否給某個模組提供時鐘,暫時不用理會。

APLL操作例項: