在進行U-Boot移植之前,我們會用到一些有關S5PV210的知識,在這裡簡單的給大家介紹一下~
硬體平台:OK210開發闆
U-Boot:2011.06
---------------------------------第一部分-----------------------------------
S5pv210是一個32位精簡指令集、低功耗、高性能的cortex-a8處理器,它屬于armv7架構。

上邊的這張圖,顯示了S5PV210處理器的整體框圖。從這張圖中我們可以了解到210的主要功能,這些小的子產品共同構成了210處理器。
首先說一說CPU核心部分,CPU的主頻可以達到800M或1GHz,我們可以通過配置U-Boot源碼中對應控制主頻的宏來進行主頻的選擇。U-boot預設的主頻是1GHz。CPU的核心部分還有512KB的高速緩存。還有NEON,NEON它是ARM内部內建的可以實作複雜算法的子產品,比如說圖像的智能分析,數學上的運算等都是通過NEON來實作的。
左上角是系統外設,這一部分主要是一些低速裝置。其中:
RTC是實時時鐘,負責系統時間的控制;
PLL是鎖相環,主要起倍頻作用;
Timer with PWM是定時器子產品;
Watching Timer是看門狗,看門狗主要是在應用程式跑飛或者系統當機一段時間之後,将系統重新開機。看門狗在實際的項目中是要打開的。
DMA(24ch)是24通道的DMA控制器。如果沒有DMA的話,資料是通過CPU傳給記憶體,再由記憶體傳給系統外設的;有了DMA之後,資料可以不通過CPU。比如音頻資料通過DMA控制通道直接傳到記憶體中。DMA可以控制外設資料與外設資料、外設資料與記憶體資料、記憶體資料與記憶體資料之間的傳輸,這樣可以有效的提升系統的工作效率。6410中也有DMA,隻是沒有210的多;
Keypad(14x8):14x8的鍵盤接口;
TS-ADC(12Bit/10ch):12位的數模轉換,有些電阻屏的觸摸功能就是由他來實作的;
左下角是外部總線子產品。從這個子產品可以看到210支援IIS、AC97和PCM這樣的音頻标準接口;
HSMMC/SDx4:4路MMC總線,可以接SD卡、TF卡和SDIO接口;
USB Host2.0/OTG2.0:210支援USB Host 2.0,和師傅實際測試了一下,USB Host2.0的傳輸速度大概是12~16M/s;
UARTx4:4路序列槽;
IICx3:3路IIC總線,一些常用的電容屏的觸摸晶片,重力傳感器就是接在了IIC總線上;
HS-SPIx2:2路SPI總線;
GPIO:GPIO接口;
下邊中間的是電源管路子產品,如果在做手機或者平闆電腦類的産品的話,一般會用到,他的作用是通過軟體動态調節CPU功耗,一般是通過升高或降低,打開或者關閉電壓的方式來調節功耗的;
右下角是存儲接口子產品,以前聽到Memory總會幼稚的認為是記憶體的意思,其實并不是這樣,Memory其實是存儲的意思;
S5PV210的NAND支援SLC和MLC兩種,SLC的穩定性由于MLC,同等容量的SLC價格高于MLC;
它還支援16位硬體ECC。由于nand flash的工藝問題,在資料讀取的過程中可能會出現位錯誤,這時就需要Ecc來檢查和糾正了;
210 常用的晶片是LPDDR2和DDR2,這裡的LP就是low power的意思,就是低功耗~
右上角部分就是210強大的多媒體功能子產品了;
首先是攝像頭接口;
MFC多媒體格式轉換子產品,主要的任務就是視訊檔案的編解碼;具有30幀/s的處理能力,支援H.263/H.264/MPEG4編碼和解碼;
支援2D/3D圖形引擎;
HDMI,高清數字多媒體接口;
JPEG主要用于圖檔檔案的硬體編碼,原始資料通過JPEG編碼生成jpg格式檔案;
最後是LCD控制器;
中間的Multi layer AHB/AXI Bus是高速總線,CPU内部各個子產品與CPU就是通過這個高速總線來實作通訊的。
--------------------------------------第二部分---------------------------------------
簡單的了解了210處理器之後呢,就開始進行U-Boot的移植了。說到U-Boot,肯定會有不少朋友産生疑問,什麼是U-Boot?U-Boot的功能是什麼呢?其實啊,這個U-Boot它就是universal bootloader,也就是通用的bootloader。它存在于nandflash或者SD卡中,它是在開機上點之後,作業系統起來之前用來引導的一個程式。U-boot 的主要作用是進行記憶體的初始化、CPU的初始化、序列槽初始化等一系列的初始化工作,完成這些之後,再将作業系統加載到記憶體中,進而運作起來。
U-Boot 源碼檔案下包括一些目錄檔案和文本檔案,這些檔案可分為”與平台相關的檔案”和”與平台無關的檔案”,其中common檔案夾下的檔案就是與平台無關的檔案;與平台相關的檔案又分為CPU級相關的檔案和與闆級相關的檔案:arch目錄下的檔案就是與CPU級相關的檔案,而board、drivers、include等檔案夾下的檔案都是與闆級相關的檔案。我們在移植的過程中,需要修改的檔案也就是這些與平台相關的檔案。
U-Boot 的移植過程主要包括以下四個步驟:
1.下載下傳U-Boot源碼
2.修改相應的檔案代碼
3.編譯U-Boot
4.燒寫到開發闆上,運作
下面是移植2011.06版本到210處理器上時修改(或添加)的檔案:
以下檔案均為與CPU級相關的檔案
uboot2011.06/arch/arm/cpu/armv7/start.s
uboot2011.06/arch/arm/cpu/armv7/Makefile
uboot2011.06/arch/arm/include/asm/arch-s5pc1xx/hardware.h
uboot2011.06/arch/arm/lib/board.c
uboot2011.06/arch/arm/lib/Makefile
uboot2011.06/arch/arm/config.mk
以下檔案均為與闆級相關的檔案
uboot2011.06/board/samsung/OK210/tools/mkv210_image.c
uboot2011.06/board/samsung/OK210/lowlevel_init.S
uboot2011.06/board/samsung/OK210/mem_setup.S
uboot2011.06/board/samsung/OK210/OK210.c
uboot2011.06/board/samsung/OK210/OK210_val.h
uboot2011.06/board/samsung/OK210/mmc_boot.c
uboot2011.06/board/samsung/OK210/Makefile
uboot2011.06/drivers/mtd/nand/s5pc1xx_nand.c
uboot2011.06/drivers/mtd/nand/Makefile
uboot2011.06/include/configs/OK210.h
uboot2011.06/include/s5pc110.h
uboot2011.06/include/s5pc11x.h
uboot2011.06/spl/Makefile
uboot2011.06/boards.cfg
uboot2011.06/config.mk
uboot2011.06/Makefile
在這裡簡單的說明一下我選擇2011.06版本的uboot 進行移植的原因,在自己平時在各個論壇、貼吧中的了解,發現大家對2011.06版本的讨論相對來說多一些,是以選擇的這個版本。在這裡我想自己試一下U-Boot移植的過程也希望能給大家有一些幫助。
另外呢,附件提供的移植參考目錄是在原始U-boot-2011.06版本基礎上進行的修改,把修改的檔案單獨拿出來,友善大家使用對比工具檢視我修改了哪些内容,當然移植參考目錄裡面,并不是所有的檔案都是從U-boot-2011.06拷貝出來的,有些檔案是從U-boot-1.3.4拷貝的:目錄board/samsung/OK210下面的mmcboot.c 檔案,從SD啟動U-Boot必須含有該檔案,三星官方提供的U-boot-1.3.4源碼包含有該檔案,我們直接拷貝過來就可以了。
下面的内容是我在移植uboot的時候師傅給我總結的移植思路(貼出來和大家一起分享一下~~):
移植過程就是在新的U-Boot代碼中增加CPU級和Board級代碼,使之能夠在開發闆上面運作。
1.看一下源代碼裡面是否有CPU級相關代碼,比如S5PV210是ARMV7架構,看一下CPU目錄下面是否有ARMV7的目錄,因為U-Boot已經是嵌入式平台裡面應用很廣泛的Bootloader了,是以基本上都已經有了CPU級相關代碼。
2.下一步就是檢視闆級相關代碼了。一款主流CPU釋出的時候,廠商一般都會提供官方開發闆,比如S5PV210釋出的時候三星公司提供了官方開發闆,使用的U-Boot是1.3.4版本,三星在U-Boot官方提供的1.3.4基礎上面進行了改進,比如增加SD卡啟動和NandFlash啟動相關代碼 等等。在移植新版本的U-Boot到開發闆的時候,我們需要看一下U-Boot代碼裡面是否已經含有了闆級代碼,如果已經有了,就不需要自己改動了,編譯以後就可以使用,而有的時候在較新的U-Boot代碼裡面,是不含有這些闆級支援包的,這個時候就需要增加自己的闆級包了。
3.闆級包的增加需要參考CPU官方提供的U-Boot代碼,因為我們移植的是最小功能的U-Boot,讓U-Boot能夠運作起來即可,是以隻需要抓最關鍵的代碼,比如系統時鐘的配置,DDR2記憶體的初始化代碼,調試序列槽的初始化等,這些代碼是需要參考U-Boot1.3.4的,不需要我們自己去寫每一行,但是需要我們知道U-Boot 能夠在S5PV210上面運作起來,必須做的工作。
--------------------------------------------------------------------------------------------------------------------------------------第三部分--------------------------------------------------------------------------------------------------------
下面開始切入主題:進行我們U-Boot的移植過程吧~
首先進行第一步,下載下傳工作:輸入U-Boot下載下傳的位址,找到自己要下載下傳的U-Boot版本,點選開始下載下傳,下載下傳完成之後開始解壓。
U-Boot下載下傳之後壓縮包的壓縮方式是.tar.bz2的,是以解壓指令為tar jzvf **.tar.bz2
而我們平時經常解壓的壓縮包為.tar.gz格式的,是以它的解壓指令為tar zxvf **.tar.gz。
這兩個解壓指令隻有一個參數的差别,容易搞混的友友們需要重點注意喽~!
解壓之後進入檔案夾,可以看到之前給大家介紹的目錄結構類似的檔案夾和文本檔案,然後就按照闆子的配置進行相應檔案的修改了~
在修改的過程中,用到最多的一個宏定義就是CONFIG_SPL_BUILD,這個宏定義的主要作用就是生成BL1檔案,提到BL1檔案肯定又會有朋友産生疑問,在這裡就這個BL1檔案給大家簡單的介紹一下:
BL1檔案是一段外部代碼,存放在SD卡或者nandflash上,大小為8K;
除了BL1檔案,還有BL0和BL2檔案。
BL0檔案是存放在CPU内部IROM中的一段固化代碼,CPU上點之後,首先去運作BL0檔案。
BL2檔案是完整的U-Boot代碼。
這三個檔案之間的關系就是:BL0運作時會将BL1拷貝到CPU的IRAM中,然後執行BL1;BL檔案執行起來之後會先進行記憶體的初始化,之後将BL2檔案拷貝到外部記憶體中,也就是我現在手中這個210 闆子的DDR2中。
移植過程最主要的就是代碼的修改與檔案的配置了,大家可以根據我所提供的這些内容進行代碼的完善與修改。
修改完成之後開始編譯工作,兩個指令:
make OK210_config
make
編譯的過程中會生成兩個重要的檔案,一個是BL1檔案,另一個就是uboot檔案。編譯完成之後将這些内容燒寫到SD卡中,燒寫的指令如下:
1.dd bs=512 seek=1 if=/dev/zero of=/dev/sdb count=2048
2.dd bs=512 iflag=dsync oflag=dsync if=spl/OK210-spl.bin of=/dev/sdb seek=1
3.dd bs=512 iflag=dsync oflag=dsync if=u-boot.bin of=/dev/sdb seek=49
在這裡值得說明幾點:
dd指令是linux下非常有用的一個指令,作用就是用指定大小的塊拷貝一個檔案,并在拷貝的同時進行指定的轉換;
指令中的sdb是SD卡的裝置名稱,在不同的電腦上可能名稱是不一樣的,是以大家在燒寫的過程中一定要注意這個裝置名稱;
燒寫到SD卡中,一定要了解一下SD卡的分區,下面是我自己畫的一張有關SD卡分區的圖,大家可以簡單了解一下它的分區情況:
Sdcard 分區介紹:
在這裡可以看到,SD卡一塊的大小為512B,第一塊為保留塊,緊接着的8K存放BL1,是以BL1燒寫的起始塊标号為1,這也就是第二條燒寫指令中seek=1的來源了;接下來存放環境變量,有的資料中将環境變量與BL1檔案總結為BL1檔案,不過這是的BL1檔案就不再是8K大小了,而是加上環境變量的大小共24K了,也就是48塊;之後存放BL2檔案,也就是uboot.bin,起始塊标号49。最後的部分是我們自己的拷貝空間了。
大概了解了這個分區之後,這個燒寫指令想必大家也了解的差不多了。然後輸入這些燒寫指令進行檔案燒寫,注意這裡的指令是在源碼的目錄檔案下輸入的,不然的話找不到對應的檔案。
燒寫完成,将SD卡插到開發闆上,設定闆子為SD卡啟動,然後打開超級終端,配置好之後将闆子上電,如果闆子正常啟動了,說明我們的移植工作順利完成了。如果沒有啟動起來,那麼就要檢查一下哪一步出現了問題,然後繼續開始回去檢視相應的U-Boot源碼。
----------------------------------------第四部分-------------------------------------
在這一部分,主要給大家介紹一下210的啟動方式。
首先了解一下s5pv210支援的啟動方式:
其中我們用的最多的是nandflash啟動和SD卡啟動。
在上圖中可以看出,第一啟動方式中先工作的是IROM,他做了一些初始化工作,之後就是啟動方式的選擇,通過設定撥碼開關的狀态來确定啟動方式。這裡以SD卡啟動為例,選擇了SD卡啟動,進入下一個流程:校驗和,也就是檢驗檔案傳輸過程中是否有資料傳輸錯誤,如果有的話第一啟動就失敗了,進入第二啟動;如果傳輸無誤,那麼第一啟動繼續,BL1開始工作,初始化記憶體,加載BL2到外部記憶體等等,之後BL2運作起來,初始化記憶體、CPU、序列槽等等,加載作業系統,最後作業系統運作起來。第一啟動方式啟動成功。
如果第一啟動方式啟動失敗,那麼進入第二啟動方式,來看一下第二啟動方式的啟動流程:
IROM的工作和第一啟動方式相同,第一啟動在檔案傳輸過程中出現錯誤之後進入第二啟動方式,如果校驗和檢驗無誤,那麼接下來就是BL1,BL2和作業系統依次運作起來,最終闆子啟動成功;如果啟動第二啟動方式之後檢查校驗和有誤,那麼第二啟動方式失敗,進入序列槽啟動,序列槽啟動如果還是白,就進入USB啟動,如果USB啟動還失敗的話,那麼啟動就失敗了。