ok6410初始化內存

1.      PHASE LOCKED LOOPPLL

S3C6410裏包含三個PLL(鎖相環)APLL, MPLL, EPLL,通過設置它們將輸入時鐘同步輸出達到操作CPU的工作頻率的目的。如圖1-1所示。

 

Voltage Controlled Oscillator (VCO)P[5:0]位來設置FIN進行分頻。通過設置Main-Divider分頻數,分頻壓控振盪器產生的輸出時鐘頻率,分頻之後的低頻進入鑑相器ScalerS[2:0]位設置PLL的輸出時鐘頻率都可以通過

PLL的時鐘選擇和輸入參照時鐘

1-2描述了時鐘產生邏輯。S3C6410有三個PLL鎖相環,工作時鐘也分爲三組,APLL用來爲ARM芯片提供工作時鐘,MPLLAXIAHBAPB總線上設備提供工作時鐘,EPLL爲特殊外設,如:視頻解碼器,圖片編碼器等,提供工作時鐘。

 

 

1-2時鐘產生邏輯單元

 

CLK_SRC寄存器的低三位CLK_SRC[2:0]分別控制三種工作時鐘。當對應位被置位,則產生對應PLL的工作時鐘。否則,不會產生對應的PLL工作時鐘。

3.      三種工作時鐘的產生

ARM1176最高產生667Mhz的工作頻率。用戶可以通過設置內部時鐘分頻器的值來控制輸出工作時鐘,而不用修改PLL的工作頻率。分頻器可以選擇1~16的分頻數。ARM內核可以通過修改分頻器的值來減少系統電源的損耗。

S3C6410內部含有AXIAHBAPB總線,通過不同的總線控制不同的外設,關閉總線上的時鐘頻率可以達到系統節能的目的。AXIAHB總線最高工作在133MHz頻率下,APB總線最高工作在66MHz頻率下。由於APBAXIAHB總線上二者工作頻率不一致,在這兩種總線上進行數據同步傳輸時會採用特殊邏輯單元,如圖1-3所示。

 

 

1-3系統總線工作頻率設置

HCLKX2時鐘由DDR0DDR1兩個DDR控制器產生,其最高可以以266MHz頻率發送和接收數據。每個HCLKX2時鐘可以根據用戶需要分別被關閉掉來減少系統損耗。AHB總線上的時鐘由DIV(HCLK)分頻器分頻後輸出,同樣AHB總線上的外設也可以被關閉掉以節省電源消耗。HCLK_GATE寄存器用來關閉工作在HCLKX2HCLK時鐘上的外設。

慢速設備連接在APB總線上。APB時鐘最高工作在66MHz,通過DIV(PCLk)分頻器來進行分頻設置,通過設置PCLK_GATE寄存器來關閉對應的APB總線上的外設。根據S3C6410硬件手冊說明,AHB總線和APB總線上的頻率必須是偶數,例如,如果DIV(HCLK)對應控制位CLK_DIV[8]設置爲1,則DIV(PCLK)對應位CLK_DIV0[15:12]必須設置爲135等奇數。否則,APB總線上的外設不能正解的進行數據傳輸。

AHB總線上的JPEG和安全相關子系統不能工作在133MHzAHB總線專門爲這樣低頻子系統提供低頻工作時鐘,通過設置DIV(CLKJPEG)DIV(CLKSECUR)分頻位來設置其工作頻率。因此,同樣在APB總線上也有類似的這種限制設定,DIV(CLKJPEG)DIV(CLKSECUR)對應的CLK_DIV0[27:24]分頻位和CLK_DIV0[19:18]分頻位必須是奇數,二者的和是偶數。如表1-1所示,官方給出了推薦的設置參數。

1-1官方推薦參數

 

 

4.      MFC模塊時鐘的產生

MFC模塊需要特殊的時鐘,如圖1-5所示。

 

 

1-5 MFC時鐘產生邏輯

MFC時鐘源可以從HCLKX2MOUT(EPLL)中選擇。MFC的工作時鐘使用HCLKX2來分頻。默認HCLKX2時鐘頻率爲266MHz。因此,CLK_DIV0[31:28]必須設置爲b0001來產生MFC工作的133MH時鐘。當MFC模塊不需要工作在高性能模式下時,有兩種方式可以減少MFC模塊工作頻率來達到減少MFC模塊的功耗。第一種方式是設置CLK_SRC[4]使用EPLL的輸出時鐘,另外一種方式是設置CLK_DIV0[31:28]的分頻數,同時,設置CLK_SRC[4]位,這樣低頻工作時鐘就可以提供給MFC模塊。EPLL輸出時鐘是與HCLKX2HCLK獨立的。

5.      UARTSPIMMC工作時鐘的產生

如圖1-6所示,是上述三種外設工作時鐘邏輯。

 

 

1-6 UARTSPIMMC工作時鐘邏輯模塊

通過設置CLK_DIV2[19:16]位來設置UART的工作頻率的分頻數,通過SCLK_GATE[9]來開啓關閉UART時鐘源。

該模塊中有一個額外的時鐘源CLK27M,使用該時鐘源可以提供更多的可選工作時鐘。

6.      時鐘的開啓/關閉控制

HCLK_GATEPCLK_GATESCLK_GATE用來控制三種時鐘源的產生,如果對應的位被設置,對應時鐘就會產生。

HCLK_GATE控制HCLK總線上的外設工作時鐘的產生,PCLK_GATE控制PCLK總線上的外設工作時鐘的產生,PCLK總線上的外設需要特定的時鐘,它們通過SCLK_GATE來設置。

7.      同步667MH操作模式

根據S3C6410硬件手冊,ARMCLKHCLK的時鐘比必須是整數,用來同步ARM內核和AXI總線接口二者的時鐘。S3C6410沒有對CPU工作在533MHz做限制,ARMCLK = 533MHzHCLKX2=266MHzHCLK=133MH,不過,對於工作在533MHz以上時,例如667Mhz時,只能支持1:2.5:5的時鐘比(ARMCLK = 667MHzHCLKX2=266MHzHCLK=133MH

8.      時鐘分頻

 

 

1-7時鐘分頻模塊

如圖1-7所示,時鐘分頻模塊產生三種時鐘,ARMCLKHCLKX2HCLK。時鐘分頻器包含兩部分,預分頻器組和後分頻器組,預分頻器包含一個1/2預分頻器和1/5預分頻器,這兩個分頻器是固定的不能被軟件配置,而後分頻器可以通過配置CLK_DIV0寄存器方式進行配置。當MISC_CONSYNC667MHz位被設置時,兩個預分頻器同時工作,產生APLL的分頻經過預分頻器分頻的時鐘,如果APLLFOUT輸出頻率爲1.33GHz,預分頻器ARMCLK的輸出爲667Mhz,預分頻器HCLK的輸出爲266MHz。這樣經過分頻的時鐘可以通過CLK_DIV0寄存器進行配置。

 

我們打算將ARM內核時鐘設置爲官方推薦的穩定的533MHz,讓APLLAHBAPB輸出工作頻率。讓MPLLUART等外設提供工作頻率,EPLL不工作。同時設置HCLKX2266MHzHCLK133MHzPCLK66.5MHzUART工作時鐘爲66.5MHz

1.      選擇HCLKX2, HCLK, PCLK的時鐘源,由圖1-2可知其時鐘源可以通過OTHER[6]選擇是由DOUT_APLL還是MOUT_MPLL,我們選擇從DOUT_APLL

 

 

 

 

ldr   r0, =CLOCK_BASE                                ;0x7e00f000

ldr   r1, [r0, #OTHERS_OFFSET]               ; 選擇MPLL的時鐘源

movr2, #0x40

orr   r1, r1, r2

        str    r1, [r0, #OTHERS_OFFSET]

    nop

          nop

          nop

          nop

   ; 選擇CPU的同步工作模式

ldr   r2, =0x80

orr   r1, r1, r2

        str    r1, [r0, #OTHERS_OFFSET]

 

;測試是否已經工作在同步模式下

check_syncack

ldr   r1, [r0, #OTHERS_OFFSET]

ldr   r2, =0xf00

and r1, r1, r2

cmpr1, #0xf00

        bne  check_syncack                                     

 

 

2.      設置變頻鎖定時間,當系統時鐘修改之後要經過段LOCK時間

 

 

; 設置變頻鎖定時間

movr1, #0xff00

orr   r1, r1, #0xff

str   r1, [r0, #APLL_LOCK_OFFSET]

str   r1, [r0, #MPLL_LOCK_OFFSET]

str   r1, [r0, #EPLL_LOCK_OFFSET]

 

3.      設置ARMCLK, HCLKX2, HCLK, PCLK的分頻

各種頻率的關係如圖1-3所述:

APLLMPLL產生的輸出頻率經過OTHER[6]選擇之後再經過MISC_CON[19]選擇是否被1/5分頻,產生的輸出頻率進入DIV_HCLKx2,根據CLK_DIV0的不同位設置HCLKX2HCLKPCLKCLKJPEGCLKSECUR的輸出頻率。其值設置情況如CLK_DIV0寄存器描述內容所述。

 

 

 

l 我們將MPLL選擇DOUT_APLLMISC_ON[19]不進行分頻,DOUT_APLL產生的時鐘(533MHz)直接進入到DIV_HCLKX2分頻器中。

l 根據硬件手冊可知,HCLKX2的頻率固定爲266MHz,所以HCLKX2_RATIO設置爲0b1

l HCLK上掛接有內存,Mobile DDR內存最高工作在133MHz,所以HCLK最高主頻設置爲HCLKX21/2,即:HCLK_RATIO = 0b1

l 設置PCLK上的工作頻率爲66.5MHz,即:PCLK_RATIO = 0b11

l 設置ARM內核工作頻率爲553MHz,即:ARM_RATIO = 0b0

l 設置DOUT_MPLL266MHz,爲後面UART提供時鐘源,即:MPLL_RATIO = 0b0

l 其它時鐘頻率保持默認值

 

; 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

ldr r1, [r0, #CLK_DIV0_OFFSET]

bic   r1, r1, #0xff00

bic   r1, r1, #0xff

ldr   r2, =0x3300

orr   r1, r1, r2

str   r1, [r0, #CLK_DIV0_OFFSET]

 

4.      設置UART工作時鐘

由圖1-6可知,通過設置CLK_SRC[1]選擇DOUT_MPLL的工作時鐘是否進行倍頻,通過設置CLK_DIV0[4]對時鐘進行分頻,再通過CLK_SRC[13]選擇UART的工作時鐘源,設置CLK_DIV2[19:16]位用於分頻UART工作時鐘。由前面可知DOUT_MPLL = 266MHzUART選擇其作爲自己工作時鐘源,則對其進行1/4分頻可以得到66.5MHz

如下表可知:設置寄存器CLK_DIV2[19:16] = 0b11,同時還要設置CLK_SRC[13] = 0b1即可。

 

 

 

 

; 設置UART串口的分頻數寄存器CLK_DIV2

ldr r1, [r0, #CLK_DIV2_OFFSET]

bic   r1, r1, #0x70000

orr   r1, r1, #0x30000                ; 設置其值爲3,即CLKUART = CLKUARTIN / 4

str   r1, [r0, #CLK_DIV2_OFFSET]

 

5.      使能APLLEPLL鎖相環

根據硬件手冊上的說明設置APLL, EPLLM,D,S分頻數。

APLL產生533MHzFOUT_APLL

EPLL產生266MHzMOUT_EPLL

;使能APLL鎖相環,配置M,D,S分頻數, according to Datasheet FOUT_APLL = 533 then

; APLL_EN = 1<<31, MDIV = 266<<16, PDIV = 3<<8, SDIV = 1

ldr   r1, = 0x810a0301

str   r1, [r0, #APLL_CON_OFFSET]

 

; 使能MPLL鎖相環,配置M,D,S分頻數

; MPLL_EN = 1<<31, MDIV = 266<<16, PDIV = 3<<8, SDIV = 2

ldr   r1, = 0x810a0302

str   r1, [r0, #MPLL_CON_OFFSET]

 

6.      設置對應時鐘源寄存器,爲各種外設提供時鐘頻率

 

 

 

 

; UART_SEL = 0b1

; MPLL_SEL = 0b1, APLL_SEL = 0b1

 

ldr   r1, [r0, #CLK_SRC_OFFSET]

ldr   r2, =0x2005                                                   ; 同時設置UART的時鐘源來自MPLL

orr   r1, r1, r2

str   r1, [r0, #CLK_SRC_OFFSET]

發佈了24 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章