第2階段 編寫uboot之編譯測試以及改進 3

2022-03-10 23:42:53 字數 2824 閱讀 6072

編譯測試:

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

addr)

上面之所以錯是因為nand flash是2048b一頁,這裡的寫的一頁是a11~a0,其值=4096,已經屬於兩頁大小了

應該改為:

void nand_read_addr(unsigned int

addr)

優化改進(加快核心啟動時間)1 提高cpu頻率將cpu頻率設為最大值400mhz(核心啟動時間7s變為6s,因為hclk和pclk頻率沒有改變)

然後分頻係數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位址資料時,每次都需要先訪問一次位址值,在讀資料.

當開了icahe後,第一次讀取sdram位址資料時,icahe發現快取裡沒有這個位址資料,然後將sdram中需要讀取的那部分一大塊記憶體資料都複製在快取中,後面陸續讀取資料就不會再訪問sdram了,直到cpu沒有找到位址資料後icahe再從sdram中重新複製

通過cp15協處理器來開啟icahe

(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...