U-Boot在基於ADSP BF533的嵌入式Linux系統上的移植

來源:互聯網
上載者:User

原文地址::http://tech.ddvip.com/2008/07/121541159946496_2.html

 

1 引言

  Boot Loader(核心引導程式)是在作業系統核心運行之前啟動並執行一段自舉程式,用於初始化硬體裝置、改變處理器運行模式、重組中斷向量和建立記憶體空間映射圖,從而將系統的軟硬體帶到一個合適的狀態或者使用者定製的特定狀態,以便為最終載入作業系統核心準備好正確的環境[1]。

  嵌入式Linux系統常用的Boot Loader有arm-boot、redboot、U-Boot等。U-Boot (全稱Universal Boot Loader)是當前比較流行的遵循GPL條件的開放源碼項目。U-Boot具有源碼公開的特點,開發人員可根據自身需要進行裁減;支援多種處理器和嵌入式作業系統核心;具有多種裝置驅動源碼:支援種引導方式;具有功能強大且成熟、穩定等諸多優點,故在嵌入式系統開發過程中廣泛採用。U-Boot嚴重依賴於底層硬體,不同的CPU或嵌入式板極裝置需要不同的U-Boot,因此,在嵌入式系統中建立通用的U-Boot是非常困難的,故U-Boot需針對開發板量身定做。

  2 開發平台

  2.1 BF533簡介

  Blackfin系列DSP是ADI公司與Intel聯合開發推出的第一款高效能、低功耗第四代定點DSP產品,融合了Analog Devices/Intel公司的號結構(MSA)。它將一個32位RISC型指令集和雙16位乘法累加(MAC)訊號處理功能與通用型微控制器所具有的易用性組合在一起。這種組合使Blackfin處理器能夠在訊號處理和控制處理應用中發揮最佳的效能。且Blackfin處理器通過將工業標準介面與高效能的訊號處理核心相結合在一起,使用者可以快速設計出節省成本的解決方案,而且無需昂貴的外部組件。

  本開發系統採用BF533,BF533是主頻高達600 MHz、峰值處理能力為1.2 GMI/s的高效能Blackfin處理器。BF533核心包含2個16位MAC、2個40位ALU、4個8位視頻ALU以及1個40位移位器。

另外,BF533還包括1個UART口、

1個SPI口、2個串列口(SPORT)、

4個通用定時器(其中3個具有PWM功能)、

1個系統時鐘、看門狗定時器以及1個並行外設介面。

外部儲存空間控制器可與SDRAM、SRAM、Flash和ROM實現無縫串連[2]。

  2.2 系統硬體平台簡介

  本系統的開發板硬體系統1所示。

  目標板以Blackfin嵌入式處理器為核心,資料地址線複用到SDRAM、Flash、USB、Ethernet,並通過FPGA實現邏輯控制。此外,將UART連接埠轉換為RS232連接埠引出。

其中SDRAM的地址為0x00000000~0x02000000,Flash的地址為0x20000000~0x20300000。

  宿主機採用Window和Suse10.0雙作業系統,採用串列介面和乙太網路串連宿主機和目標板,程式先在宿主機上編譯,然後下載至目標板上運行,目標板的終端被重新導向到串列介面,由宿主機輸出。

  2.3 開發環境的建立

  2.3.1 在宿主機上設定終端

  大部分嵌入式系統在宿主機大多都採用kermit或minicom實現與目標板的通訊,本系統採用minicom。minicom是Linux下一個類似於Windows超級終端的友好串口通訊程式。在終端輸入bash#minicom-s進入minicom設定畫面,設定串口傳輸速率、有效資料位元、停止位以及同位位元分別為57 600、8 bit、1位停止位以及無同位位元等。

  2.3.2安裝交叉編譯器

  交叉編譯是在一個架構下編譯另外一個架構的目標檔案。要從http://blackfin.uclinux.org網站上下載Blackfin ToolChain,然後安裝並修改環境變數PATH,使其包含ToolChain的安裝目錄。

  3 U-Boot啟動兩階段

  U-Boot代碼一般分為stage1和stage2兩大部分。

stage1依賴於cpu體繫結構如裝置初始化代碼,常用組合語言編寫以達到短小精悍,提高系統運行效率的目的。它主要包括cpu/bf533目錄下的start.s。

stage2一般採用C語言編寫實現複雜功能,這樣代碼則具有更好的可讀性和可移植性,主要包括lib blackfin/board.c檔案和common/main.c檔案中main_loop函數。

  stagel從cpu入口函數cpu/bf533/start.s開始,通常包含以下步驟:

  (1)基本硬體的初始化,為隨後執行kernel準備好基本的硬體環境。

包括:屏蔽所有中斷,引導裝載程式的執行過程中不必執行任何中斷,中斷屏蔽可通過寫cpu的中斷屏蔽寄存器或狀態寄存器實現;設定cpu的速度和時鐘頻率,初始化pll;RAM初始化,初始化記憶體控制器的各個寄存器;初始化UART,向串口列印U-Boot的字元資訊;關閉cpu內部指令,資料cache。

 

        (2) 為載入U-Boot的stage2準備RAM空間,通常將stage2置於整個RAM空間的最頂層1 MB空間。

  (3)拷貝U-Boot的stage2到RAM。判斷是否是Flash運行,如果是就將stage2的代碼拷貝到TEXT BASE處。將stage2安排到RAM空間的最頂層1 MB是較推薦的方法。

  (4)設定堆棧指標sp為C語言代碼執行做好準備。

  (5)跳轉到stage2的C語言代碼進入點。

  stage2主要包括lib-blackfin/board.c中board_init_f、board_init_r函數以及common/main.C中main_loop函數。通常包含以下步驟:

  (1)初始化此階段需用的硬體裝置,由board_init_f和board_init_r函數實現。

  (2)記憶體映射檢測。

  (3)載入核心並為核心設定啟動參數。

  (4)調用核心。

  4 U-BOOt的移植

  4.1 U-Boot方法與要點

  移植U-Boot簡便的方法是從U-Boot支援的開發板中選擇一個與其目標板接近的開發板進行修改。需修改的是與硬體相關的部分,涉及到兩個層面:針對CPU的移植,由於U-Boot_1.1.3支援BF533,故只需做第二層面的移植:針對目標板硬體的移植。在移植前,需仔細閱讀U-Boot/readme檔案,該檔案對目錄結構和如何移植作了簡要介紹。從移植U-Boot的最小要求、U-Boot能夠正常啟動的角度出發,選擇BF533的STAMP板為模板,相關原始碼在/board/stamp目錄下,結合U-Boot的啟動流程,主要修改檔案如下:

  (1)與目標板相關的代碼部分:在board下建立mybf533目錄,無需從頭開始,參考與目標板相似的STAMP板在mybf533目錄下建立mybf533.c、mybf533.h、flash.c、config.mk、Makefie等檔案。需要修改/board/mybf533/config.mk:

  TFEXT_BASE用於設定程式編譯連結的起始地址即將U-Boot的stage2拷貝到SDRAM的TEXT_BASE處,即SDRAM最頂層一段儲存區。修改board/mybf533/Makefile:

  (2)與CPU相關的代碼部分:U-Boot_1.1.3/epu檔案中含有BF533的目錄,其中包含start.s、cpu.c、cpu.h、interrupt.c、init_sdram.s等。故不需要建立與cpu相關的檔案目錄。

  (3)與標頭檔相關的代碼:在include/configs建立mybf533.h,參考include/configs/stamp.h,如下:

  Flash的修改與具體型號和容量有關,修改過程中參考Flash擦除資料命令、特定寄存器的寫入地址以及扇區的大小和位置。

  與SDRAM相關設定:

  注意:最後一行要用Tab鍵開頭表示命令。其中blackfin表示CPU的種類.bf533是cpu bf533對應的代碼目錄,mybf533是目標板對應的目錄。這樣可使用make mybf533_config配置自身的開發板。

  其他修改視情況而定。如根據SDRAM大小修改cplb表,根據需要修改堆棧大小。如drivers/cfi_flash.c中flash_init()函數,cpu/bf533/ints.c中init_IRQ()函數等。

  修改完畢後就可以採用如以下命令編譯U-Boot:bash$>make clean,bash$>make mrproper,bash$>make mybf533_config,bash$>make。

  編譯完後U-Boot_1.1.3產生U-Boot的二進位檔案U-Boot.bin(U-Boot.bin只能用於更新)。執行bash$>bfin-uclinux-objcopy-I binary-Oihex U-Boot.bin,產生可在Windows下首次燒寫到Flash的十六進位檔案U-Boot.hex。

  4.2 U-Boot的燒寫

  第一次下載U-Boot到目標板或者當U-Boot不能正常啟動時。必須通過JTAG或者ADI ICE將U-Boot下載到目標板。在此可將ADI公司的模擬器與Visual DSP++環境相連,通過Visual DSP++,在TOOLS-->Flash Programmer下執行Flash驅動程式M25P64.dxe,選擇"Erase all"-->Load Flie燒寫U-Boot.hex檔案到Flash中。

  移植成功後,開啟終端minicom複位開發板,若串口能輸出正確的啟動資訊.則表明移植基本成功。啟動後,如果在設定的時間內,串口沒有接收到按鍵。U-Boot將自動載入作業系統核心和檔案系統。若設定時間內串口接收到按鍵,則U-Boot停止自動載入,進入命令列,可看到U-Boot的提示符"mybf533>",查看Flash資訊,調試或手動載入核心。

  產生新的U-Boot.bin檔案後。可通過Ethernet或者串口更新U-Boot。因為網路的傳輸速度遠比串口快,故一般選擇網路傳輸。將新產生的U-Boot.bin拷貝到宿主機根目錄下的tftpboot目錄(前提是已經建立tftp sever),在目標板出現U-Boot提示符後。按任意鍵進入下載模式:

  mybf533>tftp 0x1000000 U-Boot.bin

  0x1000000為SDRAM預設的空間,用於U-Boot的升級、調試。當需要升級或者修改U-Boot,可將新的U-Boot從SDRAM燒寫到。Flash,覆蓋原來的U-Boot,以減少燒寫Flash的次數。在燒寫以前最好測試一下所下載的U-Boot能否正常運行:

  如果不正確,應重複執行Erase all和Copy命令,直到正確為止。至此,U-Boot移植的步驟已基本完成。

  5 結束語

  U-Boot是一個功能強大的Boot loader。前期移植工作是嵌入式系統開發的首要環節。但其移植不可避免的存在一些難以預料的問題。嵌入式開發人員應該在瞭解U-Boot的工作機理、移植條件後,根據目標板和具體情況靈活裁減U-Boot以提高作業系統移植的穩定性,縮短移植周期,降低產品成本。

  本文結合U-Boot的運行機理以及U-Boot移植的基本要求,研究了U-Boot在基於BF533的嵌入式系統上的移植。本文的移植是在不改變U-Boot架構前提下,對嵌入式目標板和CPU相關代碼進行修改,實現了成功移植且移植後的U-Boot能夠在目標板上穩定運行,為後續開發奠定了良好的基礎。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.