S3C6410 時(shí)鐘初始化
S3C6410里包含三個(gè)PLL(鎖相環(huán)),APLL, MPLL, EPLL,通過設(shè)置它們將輸入時(shí)鐘同步輸出達(dá)到操作CPU的工作頻率的目的。如圖1-1所示。
Voltage Controlled Oscillator (VCO)P[5:0]位來設(shè)置FIN進(jìn)行分頻。通過設(shè)置Main-Divider分頻數(shù),分頻壓控振蕩器產(chǎn)生的輸出時(shí)鐘頻率,分頻之后的低頻進(jìn)入鑒相器ScalerS[2:0]位設(shè)置PLL的輸出時(shí)鐘頻率都可以通過
PLL的時(shí)鐘選擇和輸入?yún)⒄諘r(shí)鐘
圖1-2描述了時(shí)鐘產(chǎn)生邏輯。S3C6410有三個(gè)PLL鎖相環(huán),工作時(shí)鐘也分為三組,APLL用來為ARM芯片提供工作時(shí)鐘,MPLL為AXI,AHB,APB總線上設(shè)備提供工作時(shí)鐘,EPLL為特殊外設(shè),如:視頻解碼器,圖片編碼器等,提供工作時(shí)鐘。
圖1-2時(shí)鐘產(chǎn)生邏輯單元
CLK_SRC寄存器的低三位CLK_SRC[2:0]分別控制三種工作時(shí)鐘。當(dāng)對應(yīng)位被置位,則產(chǎn)生對應(yīng)PLL的工作時(shí)鐘。否則,不會(huì)產(chǎn)生對應(yīng)的PLL工作時(shí)鐘。
3.三種工作時(shí)鐘的產(chǎn)生
ARM1176最高產(chǎn)生667Mhz的工作頻率。用戶可以通過設(shè)置內(nèi)部時(shí)鐘分頻器的值來控制輸出工作時(shí)鐘,而不用修改PLL的工作頻率。分頻器可以選擇1~16的分頻數(shù)。ARM內(nèi)核可以通過修改分頻器的值來減少系統(tǒng)電源的損耗。
S3C6410內(nèi)部含有AXI,AHB和APB總線,通過不同的總線控制不同的外設(shè),關(guān)閉總線上的時(shí)鐘頻率可以達(dá)到系統(tǒng)節(jié)能的目的。AXI,AHB總線最高工作在133MHz頻率下,APB總線最高工作在66MHz頻率下。由于APB和AXI,AHB總線上二者工作頻率不一致,在這兩種總線上進(jìn)行數(shù)據(jù)同步傳輸時(shí)會(huì)采用特殊邏輯單元,如圖1-3所示。
圖1-3系統(tǒng)總線工作頻率設(shè)置
HCLKX2時(shí)鐘由DDR0,DDR1兩個(gè)DDR控制器產(chǎn)生,其最高可以以266MHz頻率發(fā)送和接收數(shù)據(jù)。每個(gè)HCLKX2時(shí)鐘可以根據(jù)用戶需要分別被關(guān)閉掉來減少系統(tǒng)損耗。AHB總線上的時(shí)鐘由DIV(HCLK)分頻器分頻后輸出,同樣AHB總線上的外設(shè)也可以被關(guān)閉掉以節(jié)省電源消耗。HCLK_GATE寄存器用來關(guān)閉工作在HCLKX2和HCLK時(shí)鐘上的外設(shè)。
慢速設(shè)備連接在APB總線上。APB時(shí)鐘最高工作在66MHz,通過DIV(PCLk)分頻器來進(jìn)行分頻設(shè)置,通過設(shè)置PCLK_GATE寄存器來關(guān)閉對應(yīng)的APB總線上的外設(shè)。根據(jù)S3C6410硬件手冊說明,AHB總線和APB總線上的頻率必須是偶數(shù),例如,如果DIV(HCLK)對應(yīng)控制位CLK_DIV[8]設(shè)置為1,則DIV(PCLK)對應(yīng)位CLK_DIV0[15:12]必須設(shè)置為1,3,5,…等奇數(shù)。否則,APB總線上的外設(shè)不能正解的進(jìn)行數(shù)據(jù)傳輸。
AHB總線上的JPEG和安全相關(guān)子系統(tǒng)不能工作在133MHz,AHB總線專門為這樣低頻子系統(tǒng)提供低頻工作時(shí)鐘,通過設(shè)置DIV(CLKJPEG)和DIV(CLKSECUR)分頻位來設(shè)置其工作頻率。因此,同樣在APB總線上也有類似的這種限制設(shè)定,DIV(CLKJPEG)和DIV(CLKSECUR)對應(yīng)的CLK_DIV0[27:24]分頻位和CLK_DIV0[19:18]分頻位必須是奇數(shù),二者的和是偶數(shù)。如表1-1所示,官方給出了推薦的設(shè)置參數(shù)。
表1-1官方推薦參數(shù)
4.MFC模塊時(shí)鐘的產(chǎn)生
MFC模塊需要特殊的時(shí)鐘,如圖1-5所示。
圖1-5 MFC時(shí)鐘產(chǎn)生邏輯
MFC時(shí)鐘源可以從HCLKX2和MOUT(EPLL)中選擇。MFC的工作時(shí)鐘使用HCLKX2來分頻。默認(rèn)HCLKX2時(shí)鐘頻率為266MHz。因此,CLK_DIV0[31:28]必須設(shè)置為b0001來產(chǎn)生MFC工作的133MH時(shí)鐘。當(dāng)MFC模塊不需要工作在高性能模式下時(shí),有兩種方式可以減少M(fèi)FC模塊工作頻率來達(dá)到減少M(fèi)FC模塊的功耗。第一種方式是設(shè)置CLK_SRC[4]使用EPLL的輸出時(shí)鐘,另外一種方式是設(shè)置CLK_DIV0[31:28]的分頻數(shù),同時(shí),設(shè)置CLK_SRC[4]位,這樣低頻工作時(shí)鐘就可以提供給MFC模塊。EPLL輸出時(shí)鐘是與HCLKX2和HCLK獨(dú)立的。
5.UART,SPI,MMC工作時(shí)鐘的產(chǎn)生
如圖1-6所示,是上述三種外設(shè)工作時(shí)鐘邏輯。
圖1-6 UART,SPI,MMC工作時(shí)鐘邏輯模塊
通過設(shè)置CLK_DIV2[19:16]位來設(shè)置UART的工作頻率的分頻數(shù),通過SCLK_GATE[9]來開啟關(guān)閉UART時(shí)鐘源。
該模塊中有一個(gè)額外的時(shí)鐘源CLK27M,使用該時(shí)鐘源可以提供更多的可選工作時(shí)鐘。
6.時(shí)鐘的開啟/關(guān)閉控制
HCLK_GATE,PCLK_GATE和SCLK_GATE用來控制三種時(shí)鐘源的產(chǎn)生,如果對應(yīng)的位被設(shè)置,對應(yīng)時(shí)鐘就會(huì)產(chǎn)生。
HCLK_GATE控制HCLK總線上的外設(shè)工作時(shí)鐘的產(chǎn)生,PCLK_GATE控制PCLK總線上的外設(shè)工作時(shí)鐘的產(chǎn)生,PCLK總線上的外設(shè)需要特定的時(shí)鐘,它們通過SCLK_GATE來設(shè)置。
7.同步667MH操作模式
根據(jù)S3C6410硬件手冊,ARMCLK和HCLK的時(shí)鐘比必須是整數(shù),用來同步ARM內(nèi)核和AXI總線接口二者的時(shí)鐘。S3C6410沒有對CPU工作在533MHz做限制,ARMCLK = 533MHz,HCLKX2=266MHz,HCLK=133MH,不過,對于工作在533MHz以上時(shí),例如667Mhz時(shí),只能支持1:2.5:5的時(shí)鐘比(ARMCLK = 667MHz,HCLKX2=266MHz,HCLK=133MH)
8.時(shí)鐘分頻
圖1-7時(shí)鐘分頻模塊
如圖1-7所示,時(shí)鐘分頻模塊產(chǎn)生三種時(shí)鐘,ARMCLK,HCLKX2,HCLK。時(shí)鐘分頻器包含兩部分,預(yù)分頻器組和后分頻器組,預(yù)分頻器包含一個(gè)1/2預(yù)分頻器和1/5預(yù)分頻器,這兩個(gè)分頻器是固定的不能被軟件配置,而后分頻器可以通過配置CLK_DIV0寄存器方式進(jìn)行配置。當(dāng)MISC_CON的SYNC667MHz位被設(shè)置時(shí),兩個(gè)預(yù)分頻器同時(shí)工作,產(chǎn)生APLL的分頻經(jīng)過預(yù)分頻器分頻的時(shí)鐘,如果APLL的FOUT輸出頻率為1.33GHz,預(yù)分頻器ARMCLK的輸出為667Mhz,預(yù)分頻器HCLK的輸出為266MHz。這樣經(jīng)過分頻的時(shí)鐘可以通過CLK_DIV0寄存器進(jìn)行配置。
我們打算將ARM內(nèi)核時(shí)鐘設(shè)置為官方推薦的穩(wěn)定的533MHz,讓APLL為AHB,APB輸出工作頻率。讓MPLL為UART等外設(shè)提供工作頻率,EPLL不工作。同時(shí)設(shè)置HCLKX2為266MHz,HCLK為133MHz,PCLK為66.5MHz,UART工作時(shí)鐘為66.5MHz。
1.選擇HCLKX2, HCLK, PCLK的時(shí)鐘源,由圖1-2可知其時(shí)鐘源可以通過OTHER[6]選擇是由DOUT_APLL還是MOUT_MPLL,我們選擇從DOUT_APLL。
ldrr0, =CLOCK_BASE;0x7e00f000
ldrr1, [r0, #OTHERS_OFFSET];選擇MPLL的時(shí)鐘源
movr2, #0x40
orrr1, r1, r2
strr1, [r0, #OTHERS_OFFSET]
nop
nop
nop
nop
;選擇CPU的同步工作模式
ldrr2, =0x80
orrr1, r1, r2
strr1, [r0, #OTHERS_OFFSET]
;測試是否已經(jīng)工作在同步模式下
check_syncack
ldrr1, [r0, #OTHERS_OFFSET]
ldrr2, =0xf00
andr1, r1, r2
cmpr1, #0xf00
bnecheck_syncack
ldrr1, [r0, #OTHERS_OFFSET];選擇MPLL的時(shí)鐘源
movr2, #0x40
orrr1, r1, r2
strr1, [r0, #OTHERS_OFFSET]
nop
nop
nop
nop
;選擇CPU的同步工作模式
ldrr2, =0x80
orrr1, r1, r2
strr1, [r0, #OTHERS_OFFSET]
;測試是否已經(jīng)工作在同步模式下
check_syncack
ldrr1, [r0, #OTHERS_OFFSET]
ldrr2, =0xf00
andr1, r1, r2
cmpr1, #0xf00
bnecheck_syncack
2.設(shè)置變頻鎖定時(shí)間,當(dāng)系統(tǒng)時(shí)鐘修改之后要經(jīng)過段LOCK時(shí)間
;設(shè)置變頻鎖定時(shí)間
movr1, #0xff00
orrr1, r1, #0xff
strr1, [r0, #APLL_LOCK_OFFSET]
strr1, [r0, #MPLL_LOCK_OFFSET]
strr1, [r0, #EPLL_LOCK_OFFSET]
movr1, #0xff00
orrr1, r1, #0xff
strr1, [r0, #APLL_LOCK_OFFSET]
strr1, [r0, #MPLL_LOCK_OFFSET]
strr1, [r0, #EPLL_LOCK_OFFSET]
3.設(shè)置ARMCLK, HCLKX2, HCLK, PCLK的分頻
各種頻率的關(guān)系如圖1-3所述:
APLL或MPLL產(chǎn)生的輸出頻率經(jīng)過OTHER[6]選擇之后再經(jīng)過MISC_CON[19]選擇是否被1/5分頻,產(chǎn)生的輸出頻率進(jìn)入DIV_HCLKx2,根據(jù)CLK_DIV0的不同位設(shè)置HCLKX2,HCLK,PCLK,CLKJPEG,CLKSECUR的輸出頻率。其值設(shè)置情況如CLK_DIV0寄存器描述內(nèi)容所述。
l我們將MPLL選擇DOUT_APLL,MISC_ON[19]不進(jìn)行分頻,DOUT_APLL產(chǎn)生的時(shí)鐘(533MHz)直接進(jìn)入到DIV_HCLKX2分頻器中。
l根據(jù)硬件手冊可知,HCLKX2的頻率固定為266MHz,所以HCLKX2_RATIO設(shè)置為0b1
lHCLK上掛接有內(nèi)存,Mobile DDR內(nèi)存最高工作在133MHz,所以HCLK最高主頻設(shè)置為HCLKX2的1/2,即:HCLK_RATIO = 0b1
l設(shè)置PCLK上的工作頻率為66.5MHz,即:PCLK_RATIO = 0b11
l設(shè)置ARM內(nèi)核工作頻率為553MHz,即:ARM_RATIO = 0b0
l設(shè)置DOUT_MPLL為266MHz,為后面UART提供時(shí)鐘源,即:MPLL_RATIO = 0b0
l其它時(shí)鐘頻率保持默認(rèn)值
; MPLL_RATIO = 0<<4, ARM_RATIO = 0
; DOUT_MPLL = MOUT_MPLL/(MPLL_RATIO + 1)
;即ARMCLK = DOUT_APLL / (ARM_RATIO + 1)
;即ARMCLK = 533MHz, DOUT_MPLL = 266MHz
; HCLKX2_RATIO = 1<<9 , HCLK_RATIO = 1<<8,PCLK_RATIO = 3<<12, HCLKX2IN = 533
;即HCLKX2 = HCLKX2IN / (HCLKX2_RATIO + 1) = 266
;即HCLK = HCLKX2 / (HCLK_RATIO + 1) = 133
;即PCLK = HCLKX2 / (PCLK_RATIO + 1) = 66.5
ldrr1, [r0, #CLK_DIV0_OFFSET]
bicr1, r1, #0xff00
bicr1, r1, #0xff
ldrr2, =0x3300
orrr1, r1, r2
strr1, [r0, #CLK_DIV0_OFFSET]
; DOUT_MPLL = MOUT_MPLL/(MPLL_RATIO + 1)
;即ARMCLK = DOUT_APLL / (ARM_RATIO + 1)
;即ARMCLK = 533MHz, DOUT_MPLL = 266MHz
; HCLKX2_RATIO = 1<<9 , HCLK_RATIO = 1<<8,PCLK_RATIO = 3<<12, HCLKX2IN = 533
;即HCLKX2 = HCLKX2IN / (HCLKX2_RATIO + 1) = 266
;即HCLK = HCLKX2 / (HCLK_RATIO + 1) = 133
;即PCLK = HCLKX2 / (PCLK_RATIO + 1) = 66.5
ldrr1, [r0, #CLK_DIV0_OFFSET]
bicr1, r1, #0xff00
bicr1, r1, #0xff
ldrr2, =0x3300
orrr1, r1, r2
strr1, [r0, #CLK_DIV0_OFFSET]
4.設(shè)置UART工作時(shí)鐘
由圖1-6可知,通過設(shè)置CLK_SRC[1]選擇DOUT_MPLL的工作時(shí)鐘是否進(jìn)行倍頻,通過設(shè)置CLK_DIV0[4]對時(shí)鐘進(jìn)行分頻,再通過CLK_SRC[13]選擇UART的工作時(shí)鐘源,設(shè)置CLK_DIV2[19:16]位用于分頻UART工作時(shí)鐘。由前面可知DOUT_MPLL = 266MHz,UART選擇其作為自己工作時(shí)鐘源,則對其進(jìn)行1/4分頻可以得到66.5MHz。
如下表可知:設(shè)置寄存器CLK_DIV2[19:16] = 0b11,同時(shí)還要設(shè)置CLK_SRC[13] = 0b1即可。
;設(shè)置UART串口的分頻數(shù)寄存器CLK_DIV2
ldrr1, [r0, #CLK_DIV2_OFFSET]
bicr1, r1, #0x70000
orrr1, r1, #0x30000;設(shè)置其值為3,即CLKUART = CLKUARTIN / 4
strr1, [r0, #CLK_DIV2_OFFSET]
ldrr1, [r0, #CLK_DIV2_OFFSET]
bicr1, r1, #0x70000
orrr1, r1, #0x30000;設(shè)置其值為3,即CLKUART = CLKUARTIN / 4
strr1, [r0, #CLK_DIV2_OFFSET]
5.使能APLL,EPLL鎖相環(huán)
根據(jù)硬件手冊上的說明設(shè)置APLL, EPLL的M,D,S分頻數(shù)。
APLL產(chǎn)生533MHz的FOUT_APLL
EPLL產(chǎn)生266MHz的MOUT_EPLL
;使能APLL鎖相環(huán),配置M,D,S分頻數(shù), according to Datasheet FOUT_APLL = 533 then
; APLL_EN = 1<<31, MDIV = 266<<16, PDIV = 3<<8, SDIV = 1
ldrr1, = 0x810a0301
strr1, [r0, #APLL_CON_OFFSET]
;使能MPLL鎖相環(huán),配置M,D,S分頻數(shù)
; MPLL_EN = 1<<31, MDIV = 266<<16, PDIV = 3<<8, SDIV = 2
ldrr1, = 0x810a0302
strr1, [r0, #MPLL_CON_OFFSET]
; APLL_EN = 1<<31, MDIV = 266<<16, PDIV = 3<<8, SDIV = 1
ldrr1, = 0x810a0301
strr1, [r0, #APLL_CON_OFFSET]
;使能MPLL鎖相環(huán),配置M,D,S分頻數(shù)
; MPLL_EN = 1<<31, MDIV = 266<<16, PDIV = 3<<8, SDIV = 2
ldrr1, = 0x810a0302
strr1, [r0, #MPLL_CON_OFFSET]
6.設(shè)置對應(yīng)時(shí)鐘源寄存器,為各種外設(shè)提供時(shí)鐘頻率
; UART_SEL = 0b1
; MPLL_SEL = 0b1, APLL_SEL = 0b1
ldrr1, [r0, #CLK_SRC_OFFSET]
ldrr2, =0x2005;同時(shí)設(shè)置UART的時(shí)鐘源來自MPLL
orrr1, r1, r2
strr1, [r0, #CLK_SRC_OFFSET]
; MPLL_SEL = 0b1, APLL_SEL = 0b1
ldrr1, [r0, #CLK_SRC_OFFSET]
ldrr2, =0x2005;同時(shí)設(shè)置UART的時(shí)鐘源來自MPLL
orrr1, r1, r2
strr1, [r0, #CLK_SRC_OFFSET]
評論