上篇博文我們按照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. 編程分析
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分別為MPLL和UPLL
3) PLL產生的時鍾
同樣是從上圖我們可以看出
l MPLL產生了HCLK、PCLK、FCLK
l UPLL產生了UCLK。
4) 時鍾的用途
可以總結為下表
時鍾 |
應用場合 |
設備 |
FCLK |
處理器 |
Arm9 |
HCLK |
AHB總線 |
LCD、DMA等 |
PCLK |
APB總線 |
UART、GPIO等 |
UCLK |
USB總線 |
USB設備 |
2. 6410時鍾體系
2) PLL個數及分類:
同樣我們可以找到下圖
從上圖我們可以知道其共有三個PLL分別為MPLL、APLL和EPLL
3) PLL產生的時鍾
同樣是從上圖我們可以看出
l MPLL產生了HCLK、PCLK
l APLL產生了ARMCLK
l EPLL產生了SCLK
4) 時鍾的用途
可以總結為下表
時鍾 |
應用場合 |
設備 |
ARMCLK |
處理器 |
Arm11 |
HCLK |
AHB總線 |
LCD、DMA等 |
PCLK |
APB總線 |
UART、GPIO等 |
SCLK |
USB總線 |
USB設備 |
3. 210時鍾體系
1) 晶振頻率:24MHZ
2) PLL個數及分類:
同樣我們可以找到下圖
從上圖我們可以知道其共有三個PLL分別為MPLL、APLL、EPLL和VPLL
3) PLL產生的時鍾
同樣是從上圖我們可以看出
l APLL產生了MSYS體系的時鍾包括ARMCLK、HCLK_MSYS、PCLK_MSYS
l MPLL產生了DSYS體系的時鍾HCLK_DSYS、PCLK_DSYS
l EPLL產生了PSYS體系的時鍾HCLK_PSYS、PCLK_PSYS
l VPLL產生視頻相關時鍾
4) 時鍾的用途
可以總結為下表
經過上述內容我們對arm時鍾體系有了一定的了解,接下來我們分析其編程方法。
l 編程分析
通過閱讀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