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

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM