主要參考博客:http://blog.sina.com.cn/s/blog_e18772030101pn0i.html
這裏主要講MPLL的設置,具體的硬件電路以及功能,請參考上面那篇博客,這裏主要談我的理解。
在u-boot移植過程中,在第一階段彙編start.S中首先設置了FCLK:HCLK:PCLK三者比例
/* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
在第二階段C中,從crt0.S中board_init_f函數實現相關的初始化initcall_run_list(init_sequence_f),其中的init_sequence_f變量就包含了時鐘的第二部分初始化board_early_init_f
struct s3c24x0_clock_power * const clk_power =
s3c24x0_get_base_clock_power(); //get address 0x4C000000
struct s3c24x0_gpio * const gpio = s3c24x0_get_base_gpio();
/* to reduce PLL lock time, adjust the LOCKTIME register */
writel(0xFFFFFF, &clk_power->locktime);
/* configure MPLL */
writel((M_MDIV << 12) + (M_PDIV << 4) + M_SDIV,
&clk_power->mpllcon);
/* some delay between MPLL and UPLL */
pll_delay(4000);
/* configure UPLL */
writel((U_M_MDIV << 12) + (U_M_PDIV << 4) + U_M_SDIV,
&clk_power->upllcon);
/* some delay between MPLL and UPLL */
pll_delay(8000);
從S3C2440芯片手冊瞭解到,
其中,MDIV、PDIV和SDIV在寄存器MPLLCON和UPLLCON設置
其中,有個問題不解,爲什麼MDIV、PDIV和SDIV的參數設置成這樣?由此引出的另一個問題,爲什麼MPLL是405M呢?(MPLL=(2*m*Fin)/(p*2^s) =(2*169*12/(5*2))=405M)
由此問題,就牽引出更多的問題了。
下圖是S3C2440上電後,時鐘系統的相關變化。
在芯片手冊上文還提到這麼一段,換成人話就是說,在CPU上電後PLL要經過Lock Time後,才能輸出穩定MPLL,因此,在此前Fin代替MPLL供給FCLK(此處在Uboot第一階段代碼中體現)。
等待穩定後,在通常模式下FCLK=MPLL可從圖7-7瞭解到
而FCLK是供給CPU時鐘,CPU最高時鐘頻率爲400MHz,因此得出MDIV、PDIV和SDIV參數的由來。