想要修改arm晶元的時鐘,需要去查詢晶元手冊和原理圖,獲取相關的資訊(見下方)
首先來看時鐘的結構圖
根據結構圖可以看出,時鐘源有兩種選擇:1. xtipll和xtopll所連線的晶振
2. extclk引腳外接乙個時鐘源
om[3:2]用來選擇到底使用哪個時鐘源
再檢視原理圖,可以發現:om3和om2硬體上都是接gnd,所以可以知道:採用12mhz晶振作為時鐘源
jz2440內部使用三種時鐘:
fclk: 用於arm920t晶元,即cpu
hclk:通過ahb匯流排,提供給arm920t晶元、記憶體控制器,中斷控制器,lcd控制器等等
pclk: 通過apb匯流排,提供給一些外圍裝置使用,如wdt,iis,i2c等等
fclk通過hdivn分頻得到hclk,通過pdivn分頻得到pclk,這裡設定fclk:hclk:pclk=400mhz : 100mhz : 50hz
1、修改mpllcon暫存器中mdiv ,pdiv ,sdiv的值為92 ,1 ,1,可以得到fclk為400mhz
2、修改clkdivn中,hdivn和pdivn分別為0b10和1,使得hclk=fclk/4 , pclk=hclk/2
閱讀晶元手冊中,晶振作為時鐘源的時序圖,可以發現,當配置pll時,會有乙個locktime時間,用來等待輸出的fclk頻率穩定
在這裡,不對locktime進行修改,仍然使用它的預設值0xffffffff
當hdivn不是0且cpu工作於快速匯流排模式的時候,cpu會採用hclk作為它的時鐘頻率,
因此如果想讓hdivn修改後,cpu採用fclk,必須新增下方**,讓cpu工作於非同步模式
mrc p15,0,r0,c1,c0,0
orr r0,r0,#r1_nf:or:r1_ia
mcr p15,0,r0,c1,c0,0
【** #r1_nf:or:r1_ia 的意思】———— 點我
對時鐘修改的分析就大致差不多了,接下來寫彙編檔案實現要求
.text另外再附上jz2440開發板3盞led燈迴圈點亮的c程式(和按鍵點亮led燈需要知道的知識差不多,這裡不再作分析),用來觀察時鐘修改後的效果.global
_start
_start:
/*關閉看門狗,如果不關閉,系統會自動重啟
*/ldr r0,=0x53000000
ldr r1,=0
str r1,[r0]
/*修改時鐘,fclk=400mhz,hclk=100mhz,pclk=50mhz
*//*
設定配置mpll時的locktime時間為預設值
*/ldr r0,=0x4c000000
ldr r1,=0xffffffff
str r1,[r0]
/*設定fclk:hclk:pclk=8:2:1
*/ldr r0,=0x4c000014
ldr r1,=0x5
str r1,[r0]
/*設定cpu工作於非同步模式
** 如果不作此設定,當hdivn不是0時,cpu會採用hclk的頻率而不是採用fclk的頻率
*/mrc p15,
0,r0,c1,c0,0
orr r0,r0,#
0xc0000000
//#r1_nf:or:r1_ia等價於#0xc0000000
mcr p15,0,r0,c1,c0,0
/*設定mpll的pms,使得fclk=400mhz
** 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)=400mhz
*/ldr r0,=0x4c000004
ldr r1,=(92
<<12)|(1
<<4)|(1
<<0
) str r1,[r0]
/*設定好pll之後,就會鎖定lock time,直到pll穩定輸出
*//*
cpu會工作於新的頻率fclk
/* 判斷是nor啟動還是nand啟動
** 先把0位址原來的值讀取出來,儲存到r0暫存器中
** 再把0寫入0位址對應的記憶體單元,之後讀取0位址記憶體單元的值
** 如果讀取出來的值與原來的值不一致,說明是nor啟動
** 如果讀取出來的值與原來的值一致,說明是nand啟動,此時需要修改棧的位址
*/mov r1,#
0ldr r0,[r1]
//讀取原來的值,備份一下
str r1,[r1] //
把0寫入0位址
ldr r2,[r1] //
讀取0位址新的值
cmp r2,r0 //
如果r0和r2的值一樣,說明是nand啟動,此時修改sp的值
/*設定棧:sp
*/ldr sp,=0x40000000+4096
//先預設nor啟動
// moveq sp,#4096
//如果r2=r1,把4096傳給sp,改為nand啟動
streq r0,[r1] //
如果r2=r1,恢復0位址原來的值
bl main //
跳轉到main函式
halt:
b halt
//不停的跳轉到halt,相當於死迴圈,方便觀察效果
#include "上傳到 linux,編譯得到 led.bin檔案,燒寫到開發板之後,發現led燈切換得比以前快多了,因為cpu是400mhz了,arm晶元時鐘修改成功。s3c2440_soc.h
"void delay(volatile
int d) //
延時函式
int main(void
) }
return0;
}
編譯JZ2440開發板的u boot
以前我在大四的時候準備學習linux,然後就去買了塊cortex a8架構的開發板,我當時選的是qt210,可惜哪會完全沒有基礎,根本不能搞定a8強大的資料手冊,而且當時連uboot也不知道,呵呵,當時勇氣真大,一來就買a8板,後面的前景也讓我嘗到了苦頭,對著一塊在當時看來何等高階的板子我壓根不知道...
uboot配置分析(jz2440開發板)
yonzuge學習總結 uboot配置分析 解壓tar xvf u boot 1.1.6.tar.bz2 打補丁patch p1 配置make 100ask24x0 config 編譯make 1 檢視makefile 1.0100ask24x0 config unconfig mkconfig c...
jz2440開發板以nfs啟動
1,ping通 關防火牆 虛擬機器橋連線 設定為同一閘道器 採用 電腦連wifi 開發板接路由器模式 2,修改ubuntu上的 etc exports 加上要共享的目錄按照格式修改 3,重啟nfs 服務 sudo etc init.d nfs kernel server restart 4,修改開發...