時鐘源:om[3:2]選擇時鐘源
mpll:main pll(主鎖相環)
在mini2440開發板中,
(1)nreset為低時復位晶元,延時一段時間等待電壓穩定後,nreset才輸出高電平,cpu才可以工作。
(2)根據om[3:2]的值,選擇輸入時鐘源,在mini2440中,輸入時鐘源是12mhz的晶振
(3)pll鎖存om[3:2]的值
(4)設定pll,並禁能時鐘一段時間,fclk停止(為什麼cpu時鐘訊號停止了還能寫暫存器???)
(5)pll重新生效,等待時鐘訊號穩定
(6)新的fclk出現,cpu執行
注意:手冊中提醒,即使使用者不想更改預設的pll配置,也要讀取pllcon的值,再原封不動地寫一次。如果
hdivn非0,則cpu需要被設定為非同步模式,否則pll設定後的fclk會出問題。
.text
.global _start
_start:
/* 關閉看門狗 */
ldr r0,
=0x53000000
ldr r1,=0
str r1,
[r0]
/* 設定mpll, fclk : hclk : pclk = 400m : 100m : 50m */
/* locktime(0x4c000000) = 0xffffffff */
ldr r0,
=0x4c000000
ldr r1,
=0xffffffff
str r1,
[r0]
/* clkdivn(0x4c000014) = 0x5, tfclk:thclk:tpclk = 1:4:8 */
ldr r0,
=0x4c000014
ldr r1,
=0x5
str r1,
[r0]
/* 設定cpu工作於非同步模式 */
mrc p15,
0,r0,c1,c0,
0 orr r0,r0,#0xc0000000
//r1_nf:or:r1_ia
mcr p15,
0,r0,c1,c0,
0/* 設定mpllcon(0x4c000004) = (92<<12)|(1<<4)|(1<<0)
* m = mdiv+8 = 92+8=100
* p = pdiv+2 = 1+2 = 3
* s = sdiv = 1
* fclk = 2*m*fin/(p*2^s) = 2*100*12/(3*2^1)=400m
*/ldr r0,
=0x4c000004
ldr r1,=(
92<<12)
|(1<<4)
|(1<<0)
str r1,
[r0]
/* 一旦設定pll, 就會鎖定lock time直到pll輸出穩定
* 然後cpu工作於新的頻率fclk
*//* 設定記憶體: sp 棧 */
/* 分辨是nor/nand啟動
* 寫0到0位址, 再讀出來
* 如果得到0, 表示0位址上的內容被修改了, 它對應ram, 這就是nand啟動
* 否則就是nor啟動
*/mov r1, #0
ldr r0,
[r1]
/* 讀出原來的值備份 */
str r1,
[r1]
/* 0->[0] */
ldr r2,
[r1]
/* r2=[0] */
cmp r1, r2 /* r1==r2? 如果相等表示是nand啟動 */
ldr sp,
=0x40000000
+4096
/* 先假設是nor啟動 */
moveq sp, #4096
/* nand啟動 */
streq r0,
[r1]
/* 恢復原來的值 */
bl main
halt:
b halt
mini2440硬體篇之系統時鐘
一般系統的時鐘又外部晶振促發,通過內部電路產生時鐘源。2440時鐘控制邏輯給整個晶元提供了三種時鐘,fclk用於cpu核,hclk用於ahb匯流排裝置,如cpu核 儲存控制器 中斷控制器 ldc控制器 dma pclk用於apb匯流排裝置,如看門狗 iis iic pwm定時器 mmc adc ua...
Mini2440學習筆記(三) SDRAM
2440的儲存控制器有個8個bank bank0 bank7,對外引出27根位址線 addr0 addr26 訪問範圍是128m,有8個片選訊號 ngcs0 ngcs7 與之對應,所有可以訪問1g的位址空間。bank6和bank7的可訪問位址空間是可以設定的。只有bank6和bank7可以外接sdr...
mini2440 解除安裝模組
我的mini2440買回來這麼久了,一直有個問題很奇怪,就是執行insmod ko一切正行,lsmod也可以看到你插入的模組,但是用rmmod就會出現no such file,一直對這個問題就感覺很奇怪,也google了很多,網上五花八門的答案都有。最後還是仔細看了手冊才找到答案,原來是要把板子上的...