天天看點

CONTEX-A8 uboot移植

在進行U-Boot移植之前,我們會用到一些有關S5PV210的知識,在這裡簡單的給大家介紹一下~

硬體平台:OK210開發闆

U-Boot:2011.06

  ---------------------------------第一部分-----------------------------------

  S5pv210是一個32位精簡指令集、低功耗、高性能的cortex-a8處理器,它屬于armv7架構。

CONTEX-A8 uboot移植

上邊的這張圖,顯示了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中。

CONTEX-A8 uboot移植

 移植過程最主要的就是代碼的修改與檔案的配置了,大家可以根據我所提供的這些内容進行代碼的完善與修改。

  修改完成之後開始編譯工作,兩個指令:

  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 分區介紹:

CONTEX-A8 uboot移植

在這裡可以看到,SD卡一塊的大小為512B,第一塊為保留塊,緊接着的8K存放BL1,是以BL1燒寫的起始塊标号為1,這也就是第二條燒寫指令中seek=1的來源了;接下來存放環境變量,有的資料中将環境變量與BL1檔案總結為BL1檔案,不過這是的BL1檔案就不再是8K大小了,而是加上環境變量的大小共24K了,也就是48塊;之後存放BL2檔案,也就是uboot.bin,起始塊标号49。最後的部分是我們自己的拷貝空間了。

  大概了解了這個分區之後,這個燒寫指令想必大家也了解的差不多了。然後輸入這些燒寫指令進行檔案燒寫,注意這裡的指令是在源碼的目錄檔案下輸入的,不然的話找不到對應的檔案。

  燒寫完成,将SD卡插到開發闆上,設定闆子為SD卡啟動,然後打開超級終端,配置好之後将闆子上電,如果闆子正常啟動了,說明我們的移植工作順利完成了。如果沒有啟動起來,那麼就要檢查一下哪一步出現了問題,然後繼續開始回去檢視相應的U-Boot源碼。

----------------------------------------第四部分-------------------------------------

  在這一部分,主要給大家介紹一下210的啟動方式。

  首先了解一下s5pv210支援的啟動方式:

CONTEX-A8 uboot移植

其中我們用的最多的是nandflash啟動和SD卡啟動。

CONTEX-A8 uboot移植
CONTEX-A8 uboot移植

在上圖中可以看出,第一啟動方式中先工作的是IROM,他做了一些初始化工作,之後就是啟動方式的選擇,通過設定撥碼開關的狀态來确定啟動方式。這裡以SD卡啟動為例,選擇了SD卡啟動,進入下一個流程:校驗和,也就是檢驗檔案傳輸過程中是否有資料傳輸錯誤,如果有的話第一啟動就失敗了,進入第二啟動;如果傳輸無誤,那麼第一啟動繼續,BL1開始工作,初始化記憶體,加載BL2到外部記憶體等等,之後BL2運作起來,初始化記憶體、CPU、序列槽等等,加載作業系統,最後作業系統運作起來。第一啟動方式啟動成功。

  如果第一啟動方式啟動失敗,那麼進入第二啟動方式,來看一下第二啟動方式的啟動流程:

CONTEX-A8 uboot移植

   IROM的工作和第一啟動方式相同,第一啟動在檔案傳輸過程中出現錯誤之後進入第二啟動方式,如果校驗和檢驗無誤,那麼接下來就是BL1,BL2和作業系統依次運作起來,最終闆子啟動成功;如果啟動第二啟動方式之後檢查校驗和有誤,那麼第二啟動方式失敗,進入序列槽啟動,序列槽啟動如果還是白,就進入USB啟動,如果USB啟動還失敗的話,那麼啟動就失敗了。

繼續閱讀