天天看點

回顧-uboot

因為要找工作了我準備把以前做的東西再看一下,感覺以前學的不是很紮實,很多東西都不明白,是以我參考網上的視訊再看了一下。

http://study.163.com/course/courseMain.htm?courseId=890008(韋東山的感覺講得很細,特别是做過之後帶着問題去看的話應該收獲不少)

由于本人能力有限,隻解決一下我力所能及的問題。

首先我們還是看一下我們s3c2440的存儲控制器的位址空間分布圖吧。

***************************************************************************************************************************************************************************************

回顧-uboot

我們主要是看右邊,因為我fl2440的開發闆是隻支援nand flash的不支援nor flasn.

首先來2個小問題來壓壓驚~

*********************************************************************************************************************************************************************************

問題一:如果換一塊開發闆有可能改哪些東西?

                   首先,cpu的運作模式,如果需要對cpu進行設定那就設定,關看門狗,關中斷不用改,時鐘有可能要改,如果能正常使用則不用改,關閉catch和MMU不用改,設定bank有可能要改。最後一步拷貝時看位址會不會變,如果變化也要改,執行記憶體中代碼,位址有可能要改。

紅色字型的原因是:

因為我們sdram是64M的,你可以從圖中看出來它是挂載BANK6上的,我們用JLINK第一次燒uboot的時候setpc的位址是33f80000,這個位址看得出來是在sdram的位址範圍裡面,因為我們留了512K給uboot運作,如果你的uboot大于了 512K,你在燒的時候是可以把這個位址往下拉一點的。

問題二:Nor Flash和Nand Flash本質差別:(nor flash不存在壞塊,nand flash存在壞塊是以放在上面的檔案系統也都不同)

                  就在于是否進行代碼拷貝,也就是下面代碼所表述:無論是Nor Flash還是Nand Flash,核心思想就是将uboot代碼搬運到記憶體中去運作,但是沒有拷貝bss後面這段代碼,隻拷貝bss前面的代碼,bss代碼是放置全局變量的。Bss段代碼是為了清零,拷貝過去再清零重複操作(nor flash支援XIP,片上執行,不用将代碼搬到記憶體中去,直接在nor flash運作)

因為我們的nand flash是沒有位址線的,不是直接接在cpu上的,我們是通過nand flash控制器用指令來控制nand flsh的資料傳輸,比如什麼時候傳位址,什麼時候傳資料,是讀還是寫,我們都是先通過指令來設定,然後再傳輸資料。

**********************************************************************************************************************************************************************************

言歸正傳:我們看圖,因為每個BANK的位址空間是128MB,有8個BANK是以總的位址空間是1GB,上面這個位址空間是用來連接配接外設的。我們的BANK0-BANK6分别連接配接了如下裝置:NOR FLASH,IDE接口,10M網卡CS8900A,100M網卡DM9000,擴充序列槽晶片16C2550,SDRAM。

s3c2440作為32位的CPU,可以使用的位址範圍理論上達到了4GB。除去上面用于連接配接外設的1GB位址空間外,還有一部分是CPU内部寄存器的位址,剩下的位址空間還沒使用。 s3c2440的寄存器的位址範圍處于0X4800000----0X5FFFFFFF,我們的NAND FLASH控制器位址就在裡面。

下面是我燒寫uboot進開發闆的步驟(開發闆什麼都沒有,全部清除了)

1.首先是用JLINK燒寫bootstrap 到0位址,這個位址是SRAM的位址,SRAM是不需要啟動的,上電就有,不過隻有4K,這個程式用來啟動我們的SDRAM。

2.繼續用JLINK燒寫我們的uboot.bin檔案到0x33f80000這個位址(前面這個位址說過了SDRAM的位址範圍,我們用來存放uboot的),然後打開我們的CRT,我們可以看見UBOOT啟動的資訊了(能夠在CRT上看到這些資訊也是uboot裡面設定的,為了開發友善)。

3.進入了我們的uboot,我們就需要用tftp指令将我們的uboot放到我們的0x30008000這個位址,可以看出,這個位址也是在SDRAM裡面,我們用tftp 30008000 offset filesize這個指令将uboot傳到30008000這個位址,偏移位址是offset,大小是filesize。 OK,到現在為止我們都還隻是将uboot放到了SDRAM中啟動,并沒有将其放到nand flsh中存儲起來,這樣一掉電,我們的uboot就沒了。

4.使用nand write指令将uboot寫進我們的nand flash中去,這樣就大功告成了,再重新開機開發闆就能直接啟動了,看得到uboot的資訊,當然你要把jlink拔掉,不然不能啟動!

其實上面還是沒有說到uboot的作用是啥,上面隻是一個流程,第一步。

我再說一下uboot到底幹了什麼事情。(在uboot已經燒進去,寫 進了nand flash中後,我們上電後的情況)

大多數bootloader都分為stage1和stage2兩部分,u-boot也不例外。依賴于CPU體系結構的代碼(如裝置初始化代碼等)通常都放在stage1且可以用彙編語言來實作,而stage2則通常用C語言來實作,這樣可以實作複雜的功能,而且有更好的可讀性和移植性。

第一階段用彙編的原因:因為c語言隻能通路通用寄存器,第一階段通常要配置特殊寄存器,通常用特殊彙編指令集來通路,C需要不支援,就隻能用彙編了

我們可以将uboot分為2個部分:前4K和後面的内容

前4K:

PS:由于我們的nand flash的特性,它會将自己前4K的内容由硬體拷貝到sram(4K)中,因為我們的uboot是放在nand flash的最開頭嘛,是以它前4K的内容也就是uboot的前4K内容,是以uboot前4K的内容是----------初始化CPU,初始化SDRAM,将UBOOT搬到SDRAM中運作。

1、Stage1 start.S代碼結構 

u-boot的stage1代碼通常放在start.S檔案中,他用彙編語言寫成,其主要代碼部分如下:

(1)定義入口。由于一個可執行的Image必須有一個入口點,并且隻能有一個全局入口,通常這個入口放在ROM(Flash)的0x0位址,是以,必須通知編譯器以使其知道這個入口,該工作可通過修改連接配接器腳本來完成。

(2)設定異常向量(Exception Vector)。

(3)設定CPU的速度、時鐘頻率(一上電的頻率是12M,最大能到400M,是以我們需要設定時鐘頻率讓它工作快一點)及終端控制寄存器。

(4)初始化記憶體控制器。

(5)将ROM中的程式複制到RAM中。

(6)初始化堆棧。

(7)轉到RAM中執行,該工作可使用指令ldr pc來完成。

後面的内容:

Stage2 C語言代碼部分

lib_arm/board.c中的start arm boot是C語言開始的函數也是整個啟動代碼中C語言的主函數,同時還是整個u-boot(armboot)的主函數,該函數隻要完成如下操作:

(1)調用一系列的初始化函數。

(2)初始化Flash裝置。

(3)初始化系統記憶體配置設定函數。

(4)如果目标系統擁有NAND裝置,則初始化NAND裝置。

(5)如果目标系統有顯示裝置,則初始化該類裝置。

(6)初始化相關網絡裝置,填寫IP、MAC位址等。

(7)進去指令循環(即整個boot的工作循環),接受使用者從序列槽輸入的指令,然後進行相應的工作。

OK~上面就是uboot做的事情。

我們得先要了解最基本的工作原理,當初我在學的時候隻是照着文檔走了一遍,還不懂為什麼這麼做,當然上面寫的隻是一些很淺顯的東西,具體對于檔案的操作,還需要了解makefile,知道如何去修改,還要看得懂C語言,還要知道nand flasn存儲結構,對了nand flash中的每頁有一個OOB區,大小是64位元組,是用來存放壞塊資訊,ECC校驗資訊的,一般情況下我們不會去用,我也沒去看。

對了,還有一個很重要的就是腳本連結檔案 .lds

makefile 裡面arm-linux-ld 就是連結了這個連結腳本,在這個連結腳本裡面第一個檔案都start.o這個檔案,是以我們在分析uboot的時候就會首先去看start.s這個檔案

 連結腳本就是告訴連結器按怎麼樣的順序去連接配接.o檔案,和實際記憶體位址。

下面這個人分析的很好,大家可以參考他的 http://blog.163.com/[email protected]/blog/static/3391508720111023104948907/