基於AT91SAM9G20構建嵌入式Linux系統

來源:互聯網
上載者:User

 本文中使用的目標平台AT91SAM9G20是Atmel公司使用ARM926EJ-S處理器核心開發的一塊SoC嵌入式微處理器,主頻達到400MHz,具有Atmel 先進的外設DMA 和分布式儲存空間架構,連同6層匯流排矩陣,可實現儲存空間、外設和外部介面之間的多重資料同時傳送,而無需耗費CPU的刻度。與引腳相容的200 MHz AT91SAM9260相比,AT91SAM9G20提供多達4倍的快取和片上 SRAM 記憶體,並具有增強外接 NAND 快閃記憶體錯誤校正功能,以及更大的乙太網路 FIFO,能夠減少傳輸延遲。其外部匯流排介面(EBI)的時鐘頻率為133
MHz,用於片外儲存空間的高速資料傳送。這些特性使得開發人員可以將WindowsCE和Linux等作業系統移植到基於這塊微處理器的目標系統中。

       作業系統也是嵌入式系統的重要組成部分。當今的嵌入式作業系統各種各樣,有VxWorks、QNX、Palm OS,Windows CE、Linux, uClinux,ucos ii等,每種作業系統都有其與眾不同之處,本文移植的嵌入式作業系統為Linux。廣泛開放原始碼的Linux應用已經被移植到嵌入式的運行環境中,可以任意剪裁和修改後將其移植入自己的硬體平台上,因此使用Linux開發嵌入式作業系統,可以加快嵌入式系統的開發速度,縮短產品進入市場的時間。

       本文的工作主要包括Boot loader實現,Linux核心移植、檔案系統的實現三個部分。

       搭建交叉開發環境

       在移植作業系統之前,首先要在一台裝有Linux的PC機上搭建好開發環境,例如我們的宿主機為Ubuntu10.04,為獲得所有操作許可權,以root身份登入宿主機Linux系統。在 usr/local/目錄下建立arm路徑,下載交叉編譯工具arm-linux-gcc-4.3.2.tgz,將之複製到檔案夾/usr/local/arm/下,並將其解壓;最後需要修改環境變數,設定預設交叉編譯工具為arm-linux-gcc-4.3.2。利用Linux下編輯工具(如vim)開啟/root/.bashrc檔案,在檔案末尾添加如下代碼:

       if

       [ -d /usr/local/arm ] ;

       then PATH=/usr/local/arm/4.3.2/bin:"${PATH}"

       fi

       到此交叉編譯工具搭建完畢,為驗證交叉編譯工具是否搭建成功,可以在終端下輸入命令 arm-linux-gcc -v,搭建成功後會在終端下顯示arm-linux-gcc的版本。注意此處必須登出使用者,重新登入系統後設定才會生效。

       引導程式

       系統上電之後,需要一段程式來進行初始化:關閉看門狗、改變系統時鐘、初始化儲存控制器、將更多的代碼複製到記憶體中等,這段程式被稱為Boot loader。簡言之Boot loader就是在系統上電後開始執行,初始化硬體裝置、準備好軟體環境、最後叫用作業系統核心。Boot loader的實現非常依賴與具體的硬體,在嵌入式系統中硬體設定千差萬別,即使是相同的CPU,外設資源也不盡相同,因此需要根據特定的硬體進行移植。

       Boot Loader包含兩種不同的操作模式:啟動載入模式和下載模式。上電後,Boot loader從板子上的某個固態存放裝置上將作業系統載入到RAM中運行,整個過程沒有使用者的介入,一般用於最終產品。下載模式下則在開發過程中使用,開發人員可以使用各種命令,通過串口或網路等通訊手段從宿主機下載檔案(比如核心映像,檔案系統映像),將它們直接放入記憶體或是燒入flash類固態存放裝置中。

       為了在AT91SAM9G20上實現嵌入式作業系統運行,AT91SAM9G20採用了三.級引導方式,其Boot Loader程式由三部分組成,即RomBoot、Bootstrap和U-Boot,三.級引導程式的流程1所示。


圖1:三.級引導程式的流程圖

       第一級引導程式Romboot固化在AT9lSAM9G20內部,上電或複位後先運行這段引導代碼,其作用是將儲存於外部FLASH第二級引導程式Bootstrap載入到CPU內部的SRAM中執行。Bootstrap儲存在外部FLASH的前4KB空間,其功能包括初始化時鐘、SDRAM控制器以及DEBUG串口等硬體資源,並將第三 級引導程式U-Boot從FLASH載入到SDRAM執行。U-Boot將嵌入式Linux作業系統從FLASH引導和載入到SDRAM中,並將CPU的控制權交給Linux。

       本次移植使用的U-boot的版本為1.3.4,限於篇幅,本文不做詳細的介紹。

       核心的裁剪編譯

       1.準備工作

       從Linux官網下載linux核心源碼linux-2.6.30.tar.bz2,並從Atmel官網下載at91sam9g20的補丁檔案(2.6.30-at91.patch.gz 和2.6.30-at91-exp.3.tar.gz)。在宿主機Linux開發環境下,建立自己的工作目錄,例如工作目錄為home/work/,將上述三個檔案拷貝至工作目錄下,解壓Linux2.6.30,並將2.6.30-at91.patch.gz和2.6.30-at91-exp.3.tar.gz拷貝至Linux2.6.30根目錄下,同時解壓2.6.30-at91-exp.3.tar.gz。完成此部分工作如2所示。


圖2:準備工作完成

2.添加補丁檔案

進入上述linux-2.6.30根目錄,執行如下兩條命令:

zcat 2.6.30-at91.patch.gz | patch -p1

for p in 2.6.30-at91-exp.3/*; do patch -p1 < $p ; done

執行成功之後,即將從ATMEL官網下載的針對at91sam9g20的補丁檔案添加進linux-2.6.30核心中,包括驅動程式,核心設定檔等。

3.U-boot引導Linux核心啟動

a、機器碼的確定

通常,在u-boot和kernel中都會有一個機器碼(即:MACH_TYPE),只有這兩個機器碼一致時才能引導核心。首先,確定U-boot中的MACH_TYPE,在U-boot的include/asm-arm/mach-types.h檔案中針對不同的CPU定義了非常多的MACH_TYPE,可以找到下面這個定義:

#define MACH_TYPE_AT91SAM9G20EK_2MMC 2288

其次,確定kernel中的MACH_TYPE。在Linux2.6.30的arch/arm/tools/mach-types檔案中也針對不同的CPU定義了非常多的MACH_TYPE,也可以找到下面這個定義

at91sam9g20ek_2mmc MACH_AT91SAM9G20EK_2MMC AT91SAM9G20EK_2MMC    2288

只有這兩者定義一致,u-boot才能完成對核心的引導,否則就會出現mach的錯誤資訊。

b、添加引導地址

位於核心平台arm目錄kernel下的head.S檔案是用彙編程式碼完成的,它是核心最先執行的一個檔案。這一段彙編代碼的主要作用,是檢查cpu id,architecture number,初始化頁表、cpu、bbs等操作,並跳到start_kernel函數。

找到ENTRY(stext),添加如下代碼:

ENTRY(stext)

mov r0, #0

mov r1, #0x8f0

ldr r2, =0x20000100

其中r1存放是是architectureID(2288十六進位為0x8f0),r2存放 atags 指標。 Linux核心的啟動順序3所示。


圖3:Linux核心的啟動順序

4.配置和編譯

首先要配置編譯工具,開啟Linux的根目錄下的Makefile檔案,找到下面的代碼進行修改:

export KBUILD_BUILDHOST := $(SUBARCH)

ARCH     ?= arm

CROSS_COMPILE    ?= /usr/local/arm/4.3.2/bin/arm-linux-

制定平台為arm平台,交叉編譯工具為arm-linux-gcc-4.3.2;儲存之後進入linux-2.6.30根目錄,執行以下命令:

#make distclean

#make clean

此步驟刪除一些以前編譯產生的一些中間檔案、臨時檔案,以避免編譯出錯。最後執行命令

#make at91sam9g20ek_2mmc_defconfig

#make uImage

即根據at91sam9g20配置核心,並編譯產生核心映像檔案,其中make uImage是U-boot編譯產生的工具,在uboot的/tools目錄下尋找mkimage檔案,將其複製到系統/usr/local/bin目錄下,這樣就可以運行make uImage命令。編譯完成之後(大概需要十幾分鐘),便可以在arch/arm/boot/目錄下發現uImage檔案,就是我們需要的核心映像檔案,下載至工控板便可以運行。

5.修改和添加驅動程式

以上步驟產生的核心映像檔案是按照Atmel官網的配置進行裁剪修改的,由於實際硬體設定的不同,就要針對具體的硬體裝置修改相應的驅動程式,在Linux核心中增加驅動程式需要完成以下3項工作:

將編寫的原始碼複製到Linux核心原始碼的相應目錄中。在目錄的Kconfig檔案中增加新原始碼對應項目的編譯配置選項。在目錄的Makefile檔案中增加對新原始碼的編譯條件。

以添加nandflash驅動程式為例進行說明。at91sam9g20工控板的儲存晶片晶片採用三星的K9F2G08U0A實現,針對at91sam9g20編寫此晶片驅動,例如驅動檔案為9g20_nandflash.c,將此檔案添加至/linux2.6.30/driver/mtd/nand目錄下,並修改Kconfig和Makefile檔案。其中Makefile檔案添加

obj-$(CONFIG_MTD_NAND_ATMEL)     += 9g20_nandflash.o

Kconfig檔案中添加如下代碼:

config MTD_NAND_ATMEL

tristate "Support for SAM9G20 NAND Flash"

depends on ARCH_AT91

help

完成之後在linux2.6.30根目錄執行make menuconfig,選擇nandflash驅動程式。如下所示。

Device Drivers --->

<*> Memory Technology Device (MTD) support --->

<*> NAND Device Support --->

<*> Support for SAM9G20 NAND Flash

其中配置核心檔案,選中要配置的選項,此時按下“Y”鍵,將此選項編譯進核心,按下“M”鍵,將此選項編譯成核心模組,按下“N”鍵表示從核心中刪除此選項。

如需要添加分區資訊,則在board-sam9g20ek-2slot-mmc.c檔案中添加NAND快閃記憶體的分區表:

static struct mtd_partition __initdata ek_nand_partition[] = {

{

.name = "BootLoader",

.offset = 0,

.size = 0x00200000,

},//0分區

{

.name    = "Linux Kernel",

.offset    = 0x00200000,

.size    = 0x00200000,

},//2M

{

.name    = "Cramfs",

.offset    = 0x00400000,

.size    = 0x00A00000,

},//10M

{

.name    = "FS",

.offset    = 0x00E00000,

.size    = 0x0F200000,

},

};

儲存後,重新編譯核心,即可產生帶有nandflash驅動的核心映像檔案。

按照上述分區表進行分區,nandflash的資源分布4所示,我們可以看到引導程式所說明的Bootloader在快閃記憶體中的儲存情況,Linux核心以及下文要闡述的檔案系統在此工控板上的儲存情況。


圖4:NAND快閃記憶體的資源分布圖

檔案系統的實現

選擇檔案系統,要根據具體應用的需求,一般要考慮可靠性,健壯性和增強需求。如果是像工控這樣的不需經常更新控製程序的應用來說,選擇CARAMFS這樣的唯讀檔案系統已經足夠了,而且它還可以帶來的另外一個好處就是CRAMFS的壓縮率高達50%,可以大大節省我們的儲存空間。但是如果是像涉及到資料擷取這類需要儲存資料的應用來說,唯讀檔案系統就很難滿足應用系統的需求,我們可以選擇 JFFS 或者 YAFFS 這樣的可讀寫的檔案系統。不過在實際應用中,需要考慮的因素還應該更多。根據不同檔案系統的特點,結合本9g20工控板的應用場合,採用了cramfs+jffs2檔案系統。

檔案系統的製作步驟大致如下:

下載busybox進行編譯,產生Linux系統最常用的命令,這裡可以根據需求選擇常用的系統工具。本檔案系統採用busybox-1.14.2,使用交叉編譯工具為arm-linux-gcc-4.3.2,這裡需要注意的是編譯busybox和編譯linux核心的交叉編譯工具最好使用同一版本的編譯工具。

建立檔案系統所需要的檔案,如下所示:

mkdir /9g20_rootfs

cd /9g20_rootfs

mkdir bin dev etc home lib mnt proc sbin sys tmp usr var

同時將busybox產生的bin和sbin目錄拷貝至9g20_rootfs目錄下,並將編譯busybox所需的動態串連庫檔案,拷貝至9g20_rootfs /lib目錄下。

編寫必須的設定檔下,如etc目錄下的rcS、inittab、fstab等等檔案,並注意檔案的執行許可權。

下載cramfs製作工具cramfs-1.1.tar,編譯後將產生的可執行程式mkcramf拷貝至/usr/bin目錄下,即可執行mkcramfs 9g20_rootfs 9g20.cramfs,產生的9g20.cramfs檔案就是所需的檔案系統。

添加jffs2分區,在/etc/init.d/rcS檔案中添加如下命令:

#mount -t jffs2 /dev/mtdblock3 /home

即將mtdblock3以jffs2檔案系統方式掛載為home目錄,這樣/home目錄是可讀可寫,既解決了cramfs唯讀限制,同時系統檔案是唯讀,使用者程式和資料可讀可寫,有利於保護系統檔案,又減少了檔案系統的體積,特別適用於嵌入式系統。

將產生的核心映像和檔案系統映像下載至工控板後,可以看到移植完成後,系統正常啟動,經測試移植後的系統正常穩定運行。

本文小結

本文系統地闡述了以AT91SAM9G20的ARM9處理器為硬體平台的嵌入式Linux系統的構建過程,並以nandflash驅動為例闡述了Linux下驅動程式的編寫步驟,最後給出了檔案系統的解決方案。構建嵌入式Linux系統是個複雜的課題,需要對Linux作業系統核心有一定的瞭解,特別是Linux的啟動過程;驅動程式的編寫既要熟悉硬體知識,又要熟悉Linux核心資料結構;而且系統的即時性、安全性、穩定性、精簡化等方面都需要開發人員在設計中進一步考慮。經過系統測試,本文移植的Linux系統運行穩定,AT91SAM9G20的良好效能得以充分應用,為後續應用程式的開發提供了堅實的基礎。

作者:作者:袁莎莎,蔣健,陳煒

參考文獻

[1] Atmel Corporation.AT91SAM9G20 Preliminary,2009.

[2] [美]博韋,西斯特,陳莉君,張瓊聲,張宏偉譯.深入理解LINUX核心第三版[M].北京:中國電力出版社,2007.09.

[3] 韋東山.嵌入式Linux應用開發完全手冊[M].北京:人民郵電出版社,2008.08.

[4] 黃深喜,樊曉平,劉利方,楊勝躍.基於AT91SAM926X的嵌入式LINUX引導程式設計[J].微電腦應用,2009(30)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.