S5PV210 時鐘體系 如下麵時鐘結構圖所示,S5PV210 中包含 3 大類時鐘域, 分別是主系統時鐘域(簡稱 MSYS)、顯示相關的時鐘域(簡稱 DSYS)、 外圍設備的時鐘域(簡稱 PSYS)。 ~~~~ 1) MSYS:用來給 cortex a8 處理器、DRAM 控制器、3D、IRAM、 ...
S5PV210 時鐘體系
如下麵時鐘結構圖所示,S5PV210 中包含 3 大類時鐘域, 分別是主系統時鐘域(簡稱 MSYS)、顯示相關的時鐘域(簡稱 DSYS)、 外圍設備的時鐘域(簡稱 PSYS)。
1) MSYS:用來給 cortex a8 處理器、DRAM 控制器、3D、IRAM、IROM、INTC(中斷控制器)等提供時鐘;
2) DSYS:用來給顯示相關的部件提供時鐘,包括 FIMC、FIMD、JPEG 和 multimedia IPs;
3) PSYS:用來給外圍設備提供時鐘,如 i2s、spi、i2c、uart 等。
Mini210S 外接的晶振頻率(簡稱 Fin)為 24MHz,通過時鐘控制邏輯 PLL 可以提高系統時鐘。
S5PV210 共有 4 個倍頻器,即 PLL, 包括 APLL(供 MSYS 使用),MPLL(供 DSYS 使用),EPLL(供 PSYS使用),VPLL(供 video 相關的時鐘使用)。 3 大類時鐘域中,可以使用不同的分頻,使其給不同部件輸出所需要的時鐘,各類時鐘的關係如下圖:
晶元手冊上給出了參考值, 我們按照參考值設置即可, 各類時鐘的參考值如下圖:
時鐘初始化程式
#define APLL_MDIV 0x7d
#define APLL_PDIV 0x3
#define APLL_SDIV 0x1
#define MPLL_MDIV 0x29b
#define MPLL_PDIV 0xc
#define MPLL_SDIV 0x1
#define set_pll(mdiv, pdiv, sdiv) (1<<31 | mdiv<<16 | pdiv<<8 | sdiv)
#define APLL_VAL set_pll(APLL_MDIV,APLL_PDIV,APLL_SDIV)
#define MPLL_VAL set_pll(MPLL_MDIV,MPLL_PDIV,MPLL_SDIV)
void clock_init()
{
/* 1 設置各種時鐘開關, 暫時不使用 PLL */
CLK_SRC0 = 0x0;
/* 2 設置鎖定時間,使用預設值即可 */
APLL_LOCK = 0x0000FFFF;
MPLL_LOCK = 0x0000FFFF;
/* 3 設置分頻 */
CLK_DIV0 = 0x14131440;
/* 4 設置 PLL */
APLL_CON0 = APLL_VAL;
MPLL_CON = MPLL_VAL;
/* 5 設置各種時鐘開關,啟用 PLL */
CLK_SRC0 = 0x10001111;
}
程式分析:
第一步 設置各種時鐘開關,暫時不使用 PLL
在未設置 PLL 和各種分頻繫數之前,我們不能使用 PLL, 為了保險起見, 暫時直接使用頻率較低的外接的 24MHz 晶振,待設置好 PLL 和分頻繫數後再重新設置各種時鐘開關。
第二步 設置鎖定時間
設置 PLL 後,時鐘從 Fin 提升到目標頻率時,需要一定的時間,即鎖定時間,使用預設值即可。
第三步 設置分頻
與分頻相關的寄存器是 CLK_DIV0,見下圖:
根據手冊中給出的參考值來設置該寄存器。
ARMCLK = 1000MHz = MOUT_MSYS / (APLL_RATIO + 1),經過在第四和第五步的設置後, MOUT_MSYS會被設置為 1000MHz,所以 APLL_RATIO=0 即可
SCLKA2M = 200MHz = SCLKAPLL / (A2M_RATIO + 1),由於 SCLKAPLL = 1000MHz,所以 A2M_RATIO=4。
HCLK_MSYS = 200MHz = ARMCLK / (HCLK_MSYS_RATIO + 1),所以 HCLK_MSYS_RATIO=4
PCLK_MSYS = 100MHz = HCLK_MSYS / (PCLK_MSYS_RATIO + 1),所以 PCLK_MSYS_RATIO=1
HCLK_DSYS = 166MHz = MOUT_DSYS / (HCLK_DSYS_RATIO + 1), 經過在第四和第五步的設置後,MOUT_DSYS =667MHz, 所以 HCLK_DSYS_RATIO=3
PCLK_DSYS = 83MHz = HCLK_DSYS / (PCLK_DSYS_RATIO + 1),所以 PCLK_DSYS_RATIO=1
HCLK_PSYS = 133Mhz = MOUT_PSYS / (HCLK_PSYS_RATIO + 1), 經過在第四和第五步的設置後,MOUT_PSYS =667MHz 所以 HCLK_PSYS_RATIO=4
PCLK_PSYS = 66Mhz = HCLK_PSYS / (PCLK_PSYS_RATIO + 1), 所以 HCLK_PSYS_RATIO=1
第四步 設置 PLL
PLL 即倍頻器,用來放大運行頻率。 設置好分頻後,我們就需要設置 PLL 了。 APLL 和 MPLL 的啟動是通過分別設置 APLL_CON0 和 MPLL_CON 寄存器,我們逐個來設置。
APLL_CON0
APLL_CON0 負責設置 APLL, FINPLL=24MHz,經過 APLL 後,我們將輸出 FOUT=1000Mhz 的時鐘頻率, FOUT 的計算公式如下:
FOUT=MDIV*FIN/(PDIV*2^(SDIV-1)) = 1000 MHz
由於 FIN=24MHz,FOUT=1000MHz,我們可以這樣取值: MDIV= 0x7d, PDIV= 0x3, SDIV=1。這 3 個值並不是固定死的,只要能使 FOUT=1000Mhz,任意搭配都是可以的。
MPLL_CON
MPLL_CON 寄存器負責設置 MPLL,經過 MPLL 後,我們將輸出 FOUT=667Mhz 的時鐘頻率, FOUT 的計算公式如下:
FOUT=MDIV*FIN/(PDIV*2^SDIV) = 667 MHz
由於 FIN=24MHz,FOUT=667MHz,我們可以這樣取值: MDIV=0x29B,PDIV= 0xC, SDIV=1。這 3 個值並不是固定死的,只要能使 FOUT=667Mhz,任意搭配都是可以的。
第五步 設置各種時鐘開關
參考 S5PV210 時鐘結構圖,設置各種時鐘開關:
APLL_SEL = 1,使用 FOUTAPLL
MPLL_SEL = 1,使用 FOUTMPLL
EPLL_SEL = 1, 使用 FOUTEPLL
VPLL_SEL = 1,使用 FOUTVPLL
MUX_MSYS_SEL = 0, 使用 SCLKAPLL
MUX_DSYS_SEL = 0, 使用 SCLKMPLL
MUX_PSYS_SEL = 0,使用 SCLKMPLL
ONENAND_SEL = 1, 使用 HCLK_DSYS
所以 CLK_SRC0 = 0x10001111;
以上程式,通過設置時鐘相關的寄存器,達到了初始化時鐘的目的(實際上我們並不需要設置好所有部件的工作時鐘,我們只需設置好我們需要使用的硬體部件的工作時鐘即可)。
本篇文章參考:《友善之臂210手冊》