u-boot分析(六)----時鐘初始化

u-boot分析(六)

  上篇博文我們按照210的啓動流程,分析到了關閉看門狗,今天我們繼續按照u-boot的啓動流程進行分析,今天我們會主要分析時鐘的初始化。

今天我們會用到的文檔:

1.       Arm9內核手冊:http://download.csdn.net/detail/wrjvszq/8358867

2.       Arm11內核手冊:http://download.csdn.net/detail/wrjvszq/8358877

3.       Arm a8內核手冊:http://download.csdn.net/detail/wrjvszq/8358893

4.       2440芯片手冊:http://download.csdn.net/detail/wrjvszq/8358949

5.       6410芯片手冊:http://download.csdn.net/detail/wrjvszq/8358965

6.       210芯片手冊:S5PV210_UM_REV1.1(我的不知道爲什麼傳不上去大家去百度搜吧)

 

由於arm的時鐘體系比較複雜我們今天會通過以下幾點,對arm的時鐘體系進行介紹:

1.     概念解析

2.     體系介紹

3.     編程分析

 

l 概念解析

1.      時鐘脈衝信號

由特定的電壓幅度以及特定的時間間隔產生的脈衝信號

2.      時鐘頻率

單位時間內產生的脈衝個數

3.      時鐘脈衝信號來源

時鐘信號的來源有一下兩種方式:

1)       晶振(晶體振盪器):石英晶體經過打磨,加電極,通電,會產生特定的時鐘頻率,但是高頻的價格比較昂貴。

2)       PLL(鎖相環):需要一個外部晶振,和一個能對晶體的特定頻率加倍或分頻的集成鎖相環電路,可以產生不同頻率的時鐘信號,可以得到高頻信號,成本低   

l 體系介紹

對於時鐘體系的介紹我們將會通過下面4點來介紹:

1)       晶振頻率

2)       PLL個數及分類

3)       每個PLL可以產生哪些時鐘

4)       時鐘用於哪些外設

1.      2440時鐘體系:

1)       晶振頻率:12 MHZ

2)       PLL個數及分類:

我們可以從芯片手冊中的7. Clock&Power Management找到下圖

從上圖我們可以知道其共有兩個PLL分別爲MPLLUPLL

3)       PLL產生的時鐘

同樣是從上圖我們可以看出

l MPLL產生了HCLKPCLKFCLK

l UPLL產生了UCLK

4)       時鐘的用途

可以總結爲下表

時鐘

應用場合

設備

FCLK

處理器

Arm9

HCLK

AHB總線

LCDDMA

PCLK

APB總線

UARTGPIO

UCLK

USB總線

USB設備

 

2.      6410時鐘體系

1)       晶振頻率:24MHZ

2)       PLL個數及分類:

同樣我們可以找到下圖

從上圖我們可以知道其共有三個PLL分別爲MPLLAPLLEPLL

3)       PLL產生的時鐘

同樣是從上圖我們可以看出

l MPLL產生了HCLKPCLK

l APLL產生了ARMCLK

l EPLL產生了SCLK

4)       時鐘的用途

可以總結爲下表

時鐘

應用場合

設備

ARMCLK

處理器

Arm11

HCLK

AHB總線

LCDDMA

PCLK

APB總線

UARTGPIO

SCLK

USB總線

USB設備

3.      210時鐘體系

1)       晶振頻率:24MHZ

2)       PLL個數及分類:

同樣我們可以找到下圖

從上圖我們可以知道其共有三個PLL分別爲MPLLAPLLEPLLVPLL

3)       PLL產生的時鐘

同樣是從上圖我們可以看出

l APLL產生了MSYS體系的時鐘包括ARMCLKHCLK_MSYSPCLK_MSYS

l MPLL產生了DSYS體系的時鐘HCLK_DSYSPCLK_DSYS

l EPLL產生了PSYS體系的時鐘HCLK_PSYSPCLK_PSYS

l VPLL產生視頻相關時鐘

4)       時鐘的用途

可以總結爲下表

經過上述內容我們對arm時鐘體系有了一定的瞭解,接下來我們分析其編程方法。

l 編程分析

1.      初始化流程

通過閱讀210的芯片手冊,很輕鬆我們在3.5 CLOCK CONFIGURATION PROCEDURE可以找到其配置過程

2.      如何配置

我們將上面找到的基本的配置流程,和u-boot的代碼比較一下,發現其步驟是一樣的,大部分的設置比較簡單(參照文檔的說明即可),在此我就不一一分析了。

 

  1 system_clock_init:
  2 
  3     ldr    r0, =ELFIN_CLOCK_POWER_BASE    @0xe0100000
  4 
  5     /* Set Mux to FIN */
  6     ldr    r1, =0x0
  7     str    r1, [r0, #CLK_SRC0_OFFSET]
  8 
  9     ldr    r1,    =APLL_LOCKTIME_VAL
 10     str    r1,    [r0, #APLL_LOCK_OFFSET]
 11 
 12     /* Disable PLL */
 13     ldr    r1, =0x0
 14     str    r1, [r0, #APLL_CON0_OFFSET]
 15     ldr    r1, =0x0
 16     str    r1, [r0, #MPLL_CON_OFFSET]
 17 
 18     ldr    r1, =0x0
 19     str    r1, [r0, #MPLL_CON_OFFSET]
 20 
 21     ldr       r1, [r0, #CLK_DIV0_OFFSET]
 22     ldr    r2, =CLK_DIV0_MASK
 23     bic    r1, r1, r2
 24 
 25     ldr    r2, =CLK_DIV0_VAL
 26     orr    r1, r1, r2
 27     str    r1, [r0, #CLK_DIV0_OFFSET]
 28 
 29     ldr    r1, =APLL_VAL
 30     str    r1, [r0, #APLL_CON0_OFFSET]
 31 
 32     ldr    r1, =MPLL_VAL
 33     str    r1, [r0, #MPLL_CON_OFFSET]
 34 
 35     ldr    r1, =VPLL_VAL
 36     str    r1, [r0, #VPLL_CON_OFFSET]
 37 #if defined(CONFIG_EVT1)
 38     ldr    r1, =AFC_ON
 39     str    r1, [r0, #APLL_CON1_OFFSET]
 40 #endif
 41     mov    r1, #0x10000
 42 1:    subs    r1, r1, #1
 43     bne    1b
 44 
 45     ldr    r1, [r0, #CLK_SRC0_OFFSET]
 46     ldr    r2, =0x10001111
 47     orr    r1, r1, r2
 48     str    r1, [r0, #CLK_SRC0_OFFSET]
 49 
 50 #if defined(CONFIG_MCP_AC)
 51 
 52     /* CLK_SRC6[25:24] -> OneDRAM clock sel = MPLL */
 53     ldr    r1, [r0, #CLK_SRC6_OFFSET]
 54     bic    r1, r1, #(0x3<<24)
 55     orr    r1, r1, #0x01000000
 56     str    r1, [r0, #CLK_SRC6_OFFSET]
 57 
 58     /* CLK_DIV6[31:28] -> 4=1/5, 3=1/4(166MHZ@667MHz), 2=1/3 */
 59     ldr    r1, [r0, #CLK_DIV6_OFFSET]
 60     bic    r1, r1, #(0xF<<28)
 61     bic    r1, r1, #(0x7<<12)    @; ONENAND_RATIO: 0
 62     orr    r1, r1, #0x30000000
 63     str    r1, [r0, #CLK_DIV6_OFFSET]
 64 
 65 #elif defined (CONFIG_MCP_H)
 66 
 67     /* CLK_SRC6[25:24] -> OneDRAM clock sel = 00:SCLKA2M, 01:SCLKMPLL */
 68     ldr    r1, [r0, #CLK_SRC6_OFFSET]
 69     bic    r1, r1, #(0x3<<24)
 70     orr    r1, r1, #0x00000000
 71     str    r1, [r0, #CLK_SRC6_OFFSET]
 72 
 73     /* CLK_DIV6[31:28] -> 4=1/5, 3=1/4(166MHZ@667MHz), 2=1/3 */
 74     ldr    r1, [r0, #CLK_DIV6_OFFSET]
 75     bic    r1, r1, #(0xF<<28)
 76     bic    r1, r1, #(0x7<<12)    @; ONENAND_RATIO: 0
 77     orr    r1, r1, #0x00000000
 78     str    r1, [r0, #CLK_DIV6_OFFSET]
 79 
 80 #elif defined (CONFIG_MCP_B) || defined (CONFIG_MCP_D)
 81 
 82     /* CLK_SRC6[25:24] -> OneDRAM clock sel = 00:SCLKA2M, 01:SCLKMPLL */
 83     ldr    r1, [r0, #CLK_SRC6_OFFSET]
 84     bic    r1, r1, #(0x3<<24)
 85     orr    r1, r1, #0x01000000
 86     str    r1, [r0, #CLK_SRC6_OFFSET]
 87 
 88     /* CLK_DIV6[31:28] -> 4=1/5, 3=1/4(166MHZ@667MHz), 2=1/3 */
 89     ldr    r1, [r0, #CLK_DIV6_OFFSET]
 90     bic    r1, r1, #(0xF<<28)
 91     bic    r1, r1, #(0x7<<12)    @; ONENAND_RATIO: 0
 92     orr    r1, r1, #0x30000000
 93     str    r1, [r0, #CLK_DIV6_OFFSET]
 94 
 95 #elif defined (CONFIG_MCP_SINGLE)
 96 
 97     /* CLK_DIV6 */
 98     ldr    r1, [r0, #CLK_DIV6_OFFSET]
 99     bic    r1, r1, #(0x7<<12)    @; ONENAND_RATIO: 0
100     str    r1, [r0, #CLK_DIV6_OFFSET]
101 
102 #endif
103 
104     mov    pc, lr

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章