編譯測試:
1.將寫好的uboot複製到linux下面
2.make編譯,然後將錯誤的地方修改,生成boot.bin
(編譯出錯的解決方案:
3.通過make生成的反彙編來檢視**是否正確
4.通過oflash燒寫到板子nand flash上
5.檢視串列埠是否資料列印
發現串列埠無資料,發現兩處錯誤:
5.1在init.c中define定義 沒有加大括號,沒有定義volatile型
例如:#define nfconf *((unsigned long *)0x4e000000)
需要改為: #define nfconf (*((volatile unsigned long *)0x4e000000) )
5.2 在init.c中nand_read_addr()函式出錯,**如下:
void nand_read_addr(unsigned int上面之所以錯是因為nand flash是2048b一頁,這裡的寫的一頁是a11~a0,其值=4096,已經屬於兩頁大小了addr)
應該改為:
void nand_read_addr(unsigned int優化改進(加快核心啟動時間)1 提高cpu頻率將cpu頻率設為最大值400mhz(核心啟動時間7s變為6s,因為hclk和pclk頻率沒有改變)addr)
然後分頻係數fclk:hclk:pclk需要設定為1:4:8
因為hclk最高133mhz,這裡需要設定為100mhz
pclk最高50mhz,這裡需要設定為50hz
如下圖所示,得出 clkdivn暫存器需要等於0x5即可
通過下圖看出,提高cpu頻率需要設定mpllcon中mdiv、pdiv、sdiv
通過下圖得出,取400mhz時,設定mdiv為0x5c,pdiv為0x1,sdiv為0x1
所以改進**如下:
#define s3c2440_mpll_400mhz ((0x5c<<12)|(0x01<<4)|(0x01)) //設定fclk=400mhz
/*2.設定時鐘(必須設為非同步匯流排模式)
*/ldr r0,=clkdivn
mov r1,#5/*
fclk:hclk:pclk=1:4:8
*/str r1,[r0]
mrc p15,
0, r1, c1, c0 /*
讀出控制暫存器
*/orr r1, r1, #
0xc0000000
/*設定為「asynchronous bus mode」
*/mcr p15,
0, r1, c1, c0, 0
/*寫入控制暫存器
*/ldr r0,=mpllcon
ldr r1,= s3c2440_mpll_400mhz //
使用複雜的數不能用mov,需要用ldr
str r1,[r0]
2.開啟icahe(核心啟動時間6s變為1.5s)
cahe介紹:通過快取記憶體儲存器來加快對記憶體的資料訪問,在cahe中有icahe(指令快取)和dcahe(資料快取)
icahe: 指令快取,用來存放執行這些資料的指令
dcahe:用來存放資料,需要開啟mmu才能開啟dcahe
在沒開啟icahe之前,cpu讀取sdram位址資料時,每次都需要先訪問一次位址值,在讀資料.通過cp15協處理器來開啟icahe當開了icahe後,第一次讀取sdram位址資料時,icahe發現快取裡沒有這個位址資料,然後將sdram中需要讀取的那部分一大塊記憶體資料都複製在快取中,後面陸續讀取資料就不會再訪問sdram了,直到cpu沒有找到位址資料後icahe再從sdram中重新複製
(cp15協處理器操作用法:
)從上面鏈結中可以找到icahe控制位在cp15的暫存器c1中位12(如下圖), 然後通過mrs和msr向該位12置1,開啟icahe
所以**如下(放在sdram初始化之前)
mrc p15, 0, r0, c1, c0, 0//將 cp15 的暫存器 c1 的值讀到 r0 中
orr r0, r0, #(
1<<12) //
將r0中位12置1
mcr p15,
0, r0,c1,c0,0
//開啟icahe
第2階段 編寫uboot之編譯測試以及改進 3
編譯測試 1.將寫好的uboot複製到linux下面 2.make編譯,然後將錯誤的地方修改,生成boot.bin 編譯出錯的解決方案 3.通過make生成的反彙編來檢視 是否正確 4.通過oflash燒寫到板子nand flash上 5.檢視串列埠是否資料列印 發現串列埠無資料,發現兩處錯誤 5....
uboot啟動之BL1階段的分析2
lowlevel init.s是中最重要的就是包含了lowlevel init函式的實現部分,而lowlevel init是start.中很重要的乙個函式。ldr sp,0xd0036000 end of sram dedicated to u boot sub sp,sp,12 set stack...
uboot啟動第二階段之x load分析
開發板 dm3730 虛擬機器 ubuntu 14.04 編譯器 arm none linux gnueabi x loader 這幾天小小的研究了一下linux的啟動機制 所裡這裡做個小小的總結吧 現在一般的晶元的linux啟動機制是這樣的 上電自執行romcode也就是在rom裡固化的 romc...