1 概述
1.1 Nios 簡介
Nios 是Altera 公司以RISC 為基礎的可配置、可裁減軟核處理器。它具有16 位指令集和16/32 位數據通路,通過將包括1 6 或3 2 位高性能處理器在內的多種應用模塊嵌入到通用FPGA/CPLD 內,實現完全可配置的嵌入式系統。其開發套件包括:具有必要外圍內核的Nios 處
理器、C/C++ 編譯器、Cygnus 的源級調試程序、Quartus編譯軟件、驗證工具和開發板。
Nios 軟核處理器主要特性包括:高效靈活的處理器模塊,可以通過軟件配置成16 位或32 位的中央處理單元(RISC 結構) ,并可選擇不同的內部存儲器大小, 其執行速度可達50MHz ;具有多種其它功能模塊的選擇(SDRAM 控制器、UART 控制器、PCI 接口模塊、LCD 接口模塊、MAC 接口模塊等多種功能模塊);具有完整、廉價、便捷的開發系統。所有開發( 包括設計、調試) 均通過軟件進行, 不再需要專門的硬件仿真器和編程器, 大大減少了開發設備的成本。
1.2 向Nios 移植uClinux 需要做的工作和步驟
(1)硬件需求
需要一個Altera 公司的開發包,或者是下面三種之一:APEX board,STRATIX board,CYCLONE board。本文選用的是CYCLONE board。
(2)軟件需求
下載一個版本的uClinux,并搭建一個Nios 的GNU C 編譯環境,準備好CDK4Nios 開發包。CDK4Nios開發包是Nios 的交叉開發包。
(3)bootloader
需要編寫或移植一個bootloader 到Altera Nios board上。本文就是要設計一個用于Nios 的U-boot bootloader。
利用QUARTUS 軟件為開發板定義默認參數, 然后在開發板上測試U-boot。
(4)uClinux 內核的編譯
將下載好的uClinux 源代碼解壓到/home 目錄下,會產生/home/uClinux-dist 目錄,進入該目錄,依次鍵入:
make menuconfig
make dep
make
在/home/uClinux-dist/image 目錄中產生image.rom,image.ram,romfs.img,它們分別是內核的映像及文件系統的映像文件。鍵入make menuconfig 時,會出現開發平臺及內核配置和文件系統應用程序的配置界面, 可以根據需要配置。
(5)uClinux 的根文件系統及其加載
uClinux 系統采用romfs 文件系統,這種文件系統相對于一般的ext2 文件系統要求更少的空間。romfs 文件系統不支持動態擦寫保存, 對于需要系統動態保存的數據,采用虛擬ram 盤的方法進行處理(ram 盤將采用ext2文件系統)。同時,uClinux 內核也支持各種文件系統,例如, 網絡文件系統, 在需要時可以進行mount 。
解決了上述問題以后,uClinux 便可以成功地移植到Nios 上。
1.3 U-boot 介紹
U-boot 是啟動引導程序的一種,是一種通用的Linuxbootloader。在做uClinux 移植時,碰到的個問題就是移植 bootloader或者自己編寫 bootloader程序。Linux內核啟動部分的代碼需要判斷從bootloader 傳遞過來的寄存器值。U-boot 對Linux 引導有特別的支持,如:
① SCC/FEC 以太網支持;
② BOOTP/TFTP 引導;
③ IP,MAC 預置能力和在線讀寫Flash、DOC、IDE、IIC、EEROM、RTC;
④ 支持串行口kernit,S-record 下載代碼;
⑤ 識別二進制、ELF32、pImage 格式的Image,對Linux引導有特別的支持;
⑥ 單任務軟件運行環境(hello.c);
⑦ 監控(minitor)命令集有讀寫I/O、內存、寄存器、外設測試功能等;
⑧ 腳本語言支持(類似BASH 腳本);
⑨ 支持watchDog, LCD logo,狀態指示功能等。
本文著重介紹uClinux 向Nios 軟核處理器移植過程中,U-boot 的設計和實現。
2 U-boot 的設計
2.1 bootloader 的設計思想
bootloader 的設計除了依賴于 CPU 的體系結構外,它實際上也依賴于具體的嵌入式板級設備的配置。也就是說, 對于兩塊不同的嵌入式板而言,即使它們是基于同一種 CPU 而構建的, 要想讓運行在一塊板子上的bootloader 程序也能運行在另一塊板子上,通常也都需要修改 bootloader 的源程序。從本質上講,它不屬于操作內核, 它是針對不同的CPU 體系結構的, 這一部分代碼不具有可移植性。在移植操作系統時,這部分代碼必須加以改寫。
bootloader 引導加載程序是系統加電后運行的段軟件代碼。通過這段小程序, 可以初始化硬件設備、建立內存空間的映射圖, 從而將系統的軟硬件環境帶到一個合適的狀態, 以便為終調用操作系統內核準備好正確的環境。 在嵌入式系統開發中,bootloader 還擔任了與主機端通信的任務, 它相當于一個“服務器”, 不斷監聽從主機端傳來的控制信息和數據信息, 完成相應的操作。它擔負著初始化硬件和引導操作系統的雙重責任,也是在特定硬件平臺上操作系統移植至關重要的一步。
2.2 Nios 內核的U-boot 設計方案
在主機上建立開發環境的具體步驟:
① 建立Nios 平臺內核的頭文件和連接;
② 建立實用程序集合;
③ 建立Nios 平臺C 編譯器;
④ 建立Nios 平臺的glibc 庫;
⑤ 建立Nios 平臺C++ 編譯器;
⑥ 建立應用程序的開發和測試。
所建立的開發環境結構圖如圖1 所示。
搭建完開發環境后,使用開發主機的并口為Nios 開發板寫入引導程序作為系統啟動和管理Flash 的bootloader,也就是U-boot。該工具能為Nios 平臺提供引導功能,并且能夠支持網絡通信,調試和簡單的Flash文件系統, 也是CPU 開機后執行的個程序。它的任務是將操作系統內核( 壓縮的或非壓縮的) 裝載到內核要求的地址中, 然后讓出控制權。
Nios 處理器允許操作系統改變內核時鐘,以方便內存對于時間的處理,所以U-boot 的個任務就是配置處理器的時鐘, 并進行內存存取設置。一旦內存可以使用, 就開始初始化相應的堆棧。內存初始化完成后,U -boot 能使處理器上的串口中斷處理,以允許開發板通過串口與開發環境通信。此后,U-boot 還必須完成三個基本工作:
禁用MMU(Memory Managment Unit);
寄存器(CPU 寄存器) r0 置零;
寄存器R1 置相應的Nios 體系結構代碼。
完成這些后,U-boot 的工作就完成了, 可以通過用戶命令或者系統自動執行下一步,U-boot 將跳至內存中內核代碼開始處, 開始啟動內核。流程圖如圖2 所示。
3 Nios 內核的U-boot 實現
為了達到將U-boot 移植到Nios 平臺上的目的,我們進行以下操作。
① 在makefile文件和make all script里增加一項設置選擇, 仿照已經存在的那些例子。
② 建立一個存放開發板代碼的目錄,增加所需要的文件。在這個目路里,至少有“makefile”,“nios.c”,“flash.c”“u-boot.lds”。
③ 為開發板建立一個新的設置文件:include /configs/nios.h。
④ 如果移植U-boot 到一個新的CPU ,還需要建立一個放置CPU 代碼的目錄。
⑤ 運行make nios_config。
⑥ 運行make,獲得一個U-boot.srec 的文件并安裝到目標系統。
⑦ 調試并解決可能產生的問題。
當然,在修改U-boot 代碼時,要特別注意和開發板及CPU 相關的部分,要設置成專門的Nios 配置。
CONFIG_Nios ——定義了所有Nios32 的板子。
CFG_Nios_CONSOLE —— console UART 的基地址。
CF G_GBL_DATA_OFFSET ——在Nios 移植中所用到全局變量的偏移量, 簡單來講是全局數據的地址。
CFG_Nios_TMRBASE ——計時器的基地址。
CFG_Nios_TMRIRQ ——分配給計時器的中斷請求。
下面介紹如何用GERMS 執行U-boot 。
在沒有將U-boot 編入Flash 之前,鍵入nios-run 命令來運行U-boot monitor,步驟如下。
打開一個Nios sdk shell。
把目錄轉換到含有U-boot.src 文件的目錄。
執行下列命令:
$ nios-run -r u-boot.srec
這時我們可以看到:
u-boot 1.0.0 pre (Jan 2004-07:36:40)
cpu nios-32 Rec3.18(03018)
RegfileSize:256
LO_LIMIT/HI_LINIT:2/14
Board :Altera Nios 1C20 Developemt Kit
In: Serial
Out: Serial
Err: Serial
==>
在下載完之后,GERMS monitor 將自動啟動Uboot。可以看到U-boot 命令符號"==>",看到后,退出nios-run。
啟動終端,應該被設置在115200,N,8,1 處運行。
開始用U-boot 了,試著從U-boot 符號那里執行help命令:==> help
將U-boot 放到Flash 存儲器里,在U-boot 的提示符下,進行擦除Flash 的一個區。
==> erase 40000 4ffff
把U- boot 代碼裝載到RAM :把一個二進制映像裝載到RAM 。
==> loadb 800000
把這個二進制映像從RAM 拷貝到Flash。
==>cp.b 800000 40000 10000
這樣,當通過標準的32 位設置后,開發板重置,Uboot自動啟動。若用安全模式下啟動U-boot,輸入下列的GERMS 命令:+g 40000。
結語
U-boot bootloader 是操作系統和硬件的樞紐,相對于操作系統內核來說, 它是一個硬件抽象層。它負責初始化硬件, 引導操作系統內核, 檢測各種參數給操作系統內核使用。一個功能完備的大型bootloader 的工作量,相當于一個小型的操作系統。嵌入式領域中, 操作系統移植的關鍵在于:bootloader 的移植和操作系統內核硬件相關部分移植。設計和實現一個好的U-boot 將大大提高操作系統移植的穩定性, 并大大加快操作系統移植的周期。