版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
7.1Linux的歷史和現(xiàn)狀7.2協(xié)同開發(fā)模式7.3基于Edukit-Ш開發(fā)板的開發(fā)環(huán)境介紹7.4嵌入式系統(tǒng)移植 7.5觸摸屏驅(qū)動(dòng)程序設(shè)計(jì)本章小結(jié)
7.1Linux的歷史和現(xiàn)狀
Linux是一種在網(wǎng)絡(luò)上產(chǎn)生的操作系統(tǒng),來自于芬蘭學(xué)生LinusTorvalds的業(yè)余愛好。在網(wǎng)絡(luò)上,Linux的開發(fā)成為行業(yè)熱衷的項(xiàng)目,使得Linux在短期內(nèi)就成為了一個(gè)穩(wěn)定、成熟的操作系統(tǒng)。重要的是,Linux的開發(fā)都是在GPL(GNUPublicLicense)的版本控制之下,因此Linux內(nèi)核的所有源代碼都是采取開放源代碼的方式。這使得利用Linux作為我們開發(fā)嵌入式系統(tǒng)成為可能。
Linux內(nèi)核的開發(fā)是由LinusTorvalds領(lǐng)導(dǎo)的內(nèi)核開發(fā)小組進(jìn)行的。世界各地的軟件人員將自己對(duì)Linux內(nèi)核需要做的改動(dòng)交給Linus小組,由這個(gè)小組進(jìn)行統(tǒng)一控制,隨時(shí)對(duì)內(nèi)核進(jìn)行更新升級(jí)。整個(gè)開發(fā)的過程遵循CVS版本控制,保證開發(fā)的質(zhì)量。目前在站點(diǎn)/上進(jìn)行內(nèi)核的升級(jí),當(dāng)前最新的內(nèi)核是Linux2.6。將Linux作為一個(gè)嵌入式操作系統(tǒng)具有許多的優(yōu)點(diǎn):
(1)系統(tǒng)穩(wěn)定,功能強(qiáng)大,支持多種硬件平臺(tái),應(yīng)用軟件多,簡(jiǎn)單易用。
Linux在許多方面與UNIX類似,但是它是一個(gè)完全獨(dú)立的操作系統(tǒng),可以穩(wěn)定地運(yùn)行在許多種體系結(jié)構(gòu)的處理器上。Linux又可以說是一個(gè)很小的系統(tǒng),啟動(dòng)只需要500KB的目標(biāo)代碼,完全可以實(shí)現(xiàn)只包括Linux內(nèi)核和根文件系統(tǒng)的最簡(jiǎn)單的計(jì)算機(jī),也可以利用Linux實(shí)現(xiàn)從網(wǎng)絡(luò)啟動(dòng),實(shí)現(xiàn)網(wǎng)絡(luò)無盤圖形工作站。
Linux的系統(tǒng)界面和編程接口與傳統(tǒng)的UNIX類似,大量在UNIX下的程序員可以很方便地從UNIX環(huán)境轉(zhuǎn)移到Linux環(huán)境下。而不像從UNIX環(huán)境轉(zhuǎn)移到Windows開發(fā)環(huán)境那樣復(fù)雜。在Linux平臺(tái)上的應(yīng)用軟件也不斷得到擴(kuò)充。許多著名的商業(yè)軟件都有了基于Linux平臺(tái)的版本:Applix公司和Star公司提供了多種字處理、電子表格、圖形處理的應(yīng)用軟件;CorelWordPerfect8、AdabasD和Oracle8數(shù)據(jù)庫、NetscapeNavigator6.0網(wǎng)絡(luò)瀏覽器、Apache網(wǎng)絡(luò)服務(wù)器、AdobeAcrobatReader等Linux下的應(yīng)用程序都已經(jīng)紛紛推出。目前,各種基于Linux的服務(wù)器得到了廣泛的應(yīng)用。Linux已經(jīng)成為Windows強(qiáng)有力的競(jìng)爭(zhēng)者。
(2)使用成本低。幾乎所有的商業(yè)用操作系統(tǒng),如Microsoft公司的Windows系列,都需要支付相當(dāng)數(shù)量的費(fèi)用,在其下的應(yīng)用軟件也需要大量的支出來獲得。但是Linux是免費(fèi)軟件,只要遵守GPL(GNUGeneralPublicLicense)的規(guī)定,就可以免費(fèi)獲得拷貝。Linux下有同樣遵循GPL規(guī)定的C、C++、Java等一系列的軟件工具開發(fā)包,從功能角度來看并不亞于商用開發(fā)包,同時(shí)可以極大地降低開發(fā)成本。
(3)文檔完善。
Linux有非常多的文檔支持,從為初學(xué)者準(zhǔn)備的各種教程到非常詳細(xì)的聯(lián)機(jī)幫助文檔。Linux是互聯(lián)網(wǎng)充分發(fā)展的產(chǎn)物,許多關(guān)于Linux的文檔都可以在Internet上找到和下載。LinuxDocumentProject是為Linux提供系統(tǒng)化的文檔支持的項(xiàng)目,在世界上許多程序員和用戶的幫助下,它已經(jīng)收集了非常詳細(xì)的系統(tǒng)文檔和使用文檔。而且,各種關(guān)于Linux的書籍和雜志正如雨后春筍般出現(xiàn),大量的英文資料也正在翻譯成中文,方便使用者。
(4)強(qiáng)大的網(wǎng)絡(luò)功能。
Linux操作系統(tǒng)最突出的是網(wǎng)絡(luò)部分,基本上所有的網(wǎng)絡(luò)協(xié)議和網(wǎng)絡(luò)接口都可以在Linux上找到,Linux內(nèi)核比標(biāo)準(zhǔn)的UNIX更加高效地處理網(wǎng)絡(luò)協(xié)議,系統(tǒng)的網(wǎng)絡(luò)吞吐性能非常好,這也是為什么Linux在網(wǎng)絡(luò)服務(wù)器市場(chǎng)上占據(jù)越來越大市場(chǎng)份額的一個(gè)原因。
(5)支持XWindows系統(tǒng)。
XWindows是一個(gè)在大多數(shù)UNIX工作站上使用的圖形用戶界面,它是一種與平臺(tái)無關(guān)的客戶/服務(wù)器模型,可以讓用戶在一臺(tái)機(jī)器上調(diào)用另一臺(tái)機(jī)器的XWindows庫,打開另一臺(tái)機(jī)器上的窗口,而并不需要考慮這兩臺(tái)機(jī)器本身的操作系統(tǒng)類型。正是這種特性使得UNIX和Linux系統(tǒng)上的用戶和應(yīng)用程序非常自然地通過網(wǎng)絡(luò)連接在一起。本章介紹的嵌入式系統(tǒng)開發(fā)過程中還是采用傳統(tǒng)的宿主機(jī)和目標(biāo)機(jī)開發(fā)方式。但是稍做調(diào)整,即可使開發(fā)效率得到提高,后面將提到調(diào)整的細(xì)節(jié)。對(duì)于宿主機(jī)來說,首先要建立交叉編譯環(huán)境。交叉編譯通俗地講就是在一種平臺(tái)上編譯出能運(yùn)行在體系結(jié)構(gòu)不同的另一種平臺(tái)上的程序,如在PC平臺(tái)上編譯出能運(yùn)行在ARM平臺(tái)上的程序,編譯得到的程序在x86CPU平臺(tái)上是不能運(yùn)行的,必須放到ARMCPU平臺(tái)上才能運(yùn)行。這種方法在異平臺(tái)移植和嵌入式開發(fā)時(shí)非常有用。用來編譯跨平臺(tái)程序的編譯器就叫交叉編譯器。在裁減和定制Linux內(nèi)核用于嵌入式系統(tǒng)之前,由于一般嵌入式開發(fā)系統(tǒng)存儲(chǔ)性能有限,通常都要在性能優(yōu)越的PC上建立一個(gè)用于目標(biāo)機(jī)的交叉編譯工具鏈,用該交叉編譯工具鏈在PC上編譯目標(biāo)機(jī)上要運(yùn)行的程序。交叉編譯工具鏈?zhǔn)且粋€(gè)由編譯器、連接器和解釋器組成的綜合開發(fā)環(huán)境,交叉編譯工具鏈主要由binutils、gcc和glibc三個(gè)部分組成?;跍p小libc庫大小的考慮,也可以用別的c庫來代替glibc,例如uClibc、dietlibc。建立交叉編譯工具鏈?zhǔn)菑?fù)雜的過程,網(wǎng)上有一些編譯好的可用的交叉編譯工具鏈可以下載,但有必要學(xué)習(xí)自己制作一個(gè)交叉編譯工具鏈。本章7.3節(jié)中將用Crosstool工具構(gòu)建交叉工具鏈。嵌入式系統(tǒng)的目標(biāo)機(jī)選用Edukit-Ⅲ型ARM系統(tǒng),對(duì)于此開發(fā)系統(tǒng)的詳細(xì)硬件配置將在本章7.3節(jié)列出。7.2協(xié)同開發(fā)模式
對(duì)于Linux開發(fā)環(huán)境通常有以下兩種開發(fā)模式:
(1)?Windows操作系統(tǒng)+Cygwin工具。
(2)?Windows操作系統(tǒng)+VMware工具+Linux操作系統(tǒng)。對(duì)于這兩種方式來說,都是采用一臺(tái)PC機(jī)來實(shí)現(xiàn),但是存在的缺點(diǎn)是,當(dāng)PC機(jī)性能不高時(shí),開發(fā)效率很低。采用多機(jī)協(xié)同開發(fā)模式,有利于研發(fā)效率的提高。如圖7-1所示,首先可以使用一臺(tái)Linux主機(jī)作為開發(fā)機(jī),另外一臺(tái)Windows主機(jī)作為工作機(jī)。在Linux主機(jī)上配置交叉編譯環(huán)境完成開發(fā)工作,Windows主機(jī)負(fù)責(zé)和目標(biāo)機(jī)的串口通信和對(duì)映像的燒寫。開發(fā)機(jī)和工作機(jī)的通信可以依靠SSH遠(yuǎn)程控制,當(dāng)然也可以獨(dú)立在開發(fā)機(jī)上完成開發(fā)后,將映像拷貝到工作機(jī)上進(jìn)行燒寫。圖7-1簡(jiǎn)單開發(fā)模式對(duì)于一個(gè)復(fù)雜的項(xiàng)目來說,可能需要幾個(gè)開發(fā)人員的協(xié)同工作才能完成,出于成本和協(xié)同性考慮,充分利用Linux操作系統(tǒng)多用戶、多任務(wù)的特點(diǎn)和其有效的權(quán)限管理機(jī)制,借助成熟的SSH登錄工具程序,采用協(xié)同開發(fā)模式,如圖7-2所示。圖7-2協(xié)同開發(fā)模式協(xié)同開發(fā)模式具有以下特點(diǎn):
(1)將整個(gè)項(xiàng)目劃分成幾個(gè)獨(dú)立的子塊,在Linux開發(fā)服務(wù)器上建立完善的交叉編譯環(huán)境,并建立相應(yīng)的用戶。用戶通過SSH工具登錄到Linux開發(fā)服務(wù)器上,遠(yuǎn)程管理開發(fā)。這樣首先節(jié)約了硬件設(shè)備,對(duì)成本有了一個(gè)有效的控制,另外只需配置一臺(tái)Linux開發(fā)服務(wù)器。
(2)
對(duì)項(xiàng)目的分配控制,可以通過Linux的權(quán)限管理來實(shí)現(xiàn)。首先由項(xiàng)目主管建立相應(yīng)的公共目錄,再由不同的開發(fā)人員通過不同的用戶建立自己的工作目錄,并設(shè)置其訪問權(quán)限。下面通過具體的項(xiàng)目實(shí)例來解釋。嵌入式Linux系統(tǒng)移植:要求基于Edukit-Ⅲ型嵌入式開發(fā)板完成啟動(dòng)程序VIVI、Linux2.6內(nèi)核、根文件系統(tǒng)的編譯生成和建立,并完成燒寫測(cè)試。開發(fā)人員4名,對(duì)于Linux用戶來說,redhat、mike、redhat、arm;redhat和mike屬于一個(gè)用戶組。對(duì)于這個(gè)項(xiàng)目的工作空間控制來說,可由以下幾個(gè)步驟來實(shí)現(xiàn):
(1)項(xiàng)目主管以超級(jí)管理員身份登錄,建立項(xiàng)目的公共目錄。進(jìn)入?/tmp目錄,建立ts-project項(xiàng)目工作目錄。
[root@localhost~]#cd/tmp
[root@localhosttmp]#mkdirts-project改變目錄權(quán)限,使得普通用戶擁有對(duì)ts-project目錄的全權(quán)限。
[root@localhosttmp]#chmod777ts-project在ts-project目錄下建立公共目錄。改變目錄權(quán)限。
[root@localhosttmp]#cdts-project/
[root@localhostts-project]#mkdirbuild-toolsdocimagestoolsbebug
[root@localhostts-project]#chmod777build-toolsdocimagestoolsbebug
(2)?redhat登錄,在ts-project項(xiàng)目工作目錄建立自己的工作目錄bootldr,假設(shè)mike用戶和redhat共同完成VIVI,則設(shè)置其組用戶對(duì)文件有寫權(quán)限。
[root@localhostts-project]#suredhat
[redhat@localhostts-project]$mkdirbootldr
[arm@localhostts-project]$ls-l
drwxrwxr-x2redhatredhat409605-2909:56bootldr
(3)?hongru用戶登錄后也建立自己的工作目錄kernel。
[redhat@localhostts-project]$suhongru口令:
[hongru@localhostts-project]$mkdirkernel
(4)?arm用戶登錄,建立自己的工作目錄rootfs,假設(shè)根文件系統(tǒng)的制作工作量較小,所以只需arm用戶自己來完成。改變目錄權(quán)限,只對(duì)arm用戶提供寫權(quán)限。
[hongru@localhostts-project]$suarm口令:
[arm@localhostts-project]$mkdirrootfs
[arm@localhostts-project]$chmod755rootfs
(5)測(cè)試權(quán)限機(jī)制。以arm用戶身份登錄后,實(shí)驗(yàn)向bootloader目錄下寫入數(shù)據(jù)。
[arm@localhostts-project]$ls-l總計(jì)64
drwxrwxrwx2root root 409605-2909:55bebug
drwxrwxr-x2redhat redhat 409605-2909:56bootldr
drwxrwxrwx2root root 409605-2909:55build-tools……另外,通過/tmp/ts-project的截圖可以清晰地看出相應(yīng)的權(quán)限。如圖7-3所示。對(duì)于普通用戶arm來說,build-toolsdocimagestoolsbebug是公共目錄,可以方便地向其中寫入數(shù)據(jù),而對(duì)于rootfs,是自己的工作目錄;但是對(duì)于bootldr和kernel目錄只擁有讀的權(quán)限,沒有寫權(quán)限。所以arm的操作不會(huì)對(duì)其他用戶的工作造成影響。圖7-3arm用戶的權(quán)限分配7.3基于Edukit-Ⅲ開發(fā)板的開發(fā)環(huán)境介紹
EmbestEdukit-Ⅲ開發(fā)板是本系統(tǒng)的硬件平臺(tái),它是英蓓特公司開發(fā)的一款全功能ARM開發(fā)板,基于Samsung公司的S3C2410處理器(ARM920T),資源豐富。硬件系統(tǒng)包含了嵌入式系統(tǒng)開發(fā)應(yīng)用所需的大部分設(shè)備,如串口、以太網(wǎng)口、USB口、音頻輸出、LCD及TSP觸摸屏、小鍵盤、固態(tài)硬盤、大容量的Flash和SDRAM等等。7.3.1交叉編譯工具鏈的創(chuàng)建本節(jié)實(shí)現(xiàn)Linux交叉編譯環(huán)境的創(chuàng)建。首先來建立用于編譯VIVI的交叉編譯器版本—2.95.3??梢詮木W(wǎng)上下載,下載地址如下:
.uk/pub/armlinux/toolchain/cross-2.95.3.tar.bz2下載后放在/home/mike目錄下。解壓后可以放在/usr/local/arm目錄下。步驟如下:
[root@localhostmike]#mkdir/usr/local/arm/
[root@localhostmike]#cd/usr/local/arm/
[root@localhostarm]#tar-xjvf/home/mike/cross-2.95.3.tar.bz2這樣,這個(gè)版本的交叉編譯工具就安裝好了。下面查看里面的工具集:
[root@localhostarm]#ls2.95.3
[root@localhostarm]#cd2.95.3/bin/
[root@localhostbin]#pwd/usr/local/arm/2.95.3/bin
[root@localhostbin]#lsarm-linux-addr2line arm-linux-gasparm-linux-protoize cpparm-linux-ar arm-linux-gcc arm-linux-ranlib gcjharm-linux-as arm-linux-gcj arm-linux-readelf gcovarm-linux-c++ arm-linux-ld arm-linux-size jcf-dumparm-linux-c++filt arm-linux-nm arm-linux-strings jv-scanarm-linux-g++ arm-linux-objcopy arm-linux-striparm-linux-g77 arm-linux-objdump arm-linux-unprotoize上面只是用已經(jīng)生成好的交叉編譯工具鏈,下面使用Crosstool工具構(gòu)建交叉工具鏈。
Crosstool是一組腳本工具集,可構(gòu)建和測(cè)試不同版本的gcc和glibc,用于那些支持glibc的體系結(jié)構(gòu)。它也是一個(gè)開源項(xiàng)目,下載地址是/crosstool。用Crosstool構(gòu)建交叉工具鏈要比上述的分步編譯容易得多,并且也方便許多。用Crosstool工具構(gòu)建所需資源如表7-1所示。表7-1所需資源
1.準(zhǔn)備資源文件從網(wǎng)上下載所需資源文件linux-2.6.10.tar.gz、binutils-2.15.tar.bz2、glibc-2.3.2.tar.gz、glibc-linuxthreads-2.3.2.tar.gz、linux-libc-headers-
.tar.bz2和gcc-3.3.6.tar.gz。然后將這些工具包文件放在新建的/home/mike/downloads目錄下,最后在/home/mike目錄下解壓crosstool-0.42.tar.gz,命令如下:
[root@localhostmike]#pwd/home/mike
[root@localhostmike]#tar-xzvfcrosstool-0.42.tar.gz
2.建立編譯腳本接著需要建立自己的編譯腳本,起名為arm.sh。為了簡(jiǎn)化編寫arm.sh,尋找一個(gè)最接近的腳本文件demo-arm.sh作為模板,然后將該腳本的內(nèi)容復(fù)制到arm.sh,修改arm.sh腳本,具體操作如下:
[root@localhostcrosstool-0.42]#cpdemo-arm.sharm.sh
[root@localhostcrosstool-0.42]#viarm.sh修改后的arm.sh腳本內(nèi)容如下:
#!/bin/sh
set-ex
TARBALLS_DIR=/home/mike/downloads #定義工具鏈源碼所存放的位置
RESULT_TOP=/opt/crosstool #定義工具鏈的安裝目錄
exportTARBALLS_DIRRESULT_TOP
GCC_LANGUAGES="c,c++" #定義支持C,C++語言
exportGCC_LANGUAGES
#創(chuàng)建/opt/crosstool目錄
mkdir-p$RESULT_TOP
eval'catarm.datgcc-3.3.6-glibc-2.3.2.dat'shall.sh--notest
echoDone.
3.建立配置文件在arm.sh腳本文件中需要注意arm.dat和gcc-3.3.6-glibc-2.3.2.dat兩個(gè)文件,這兩個(gè)文件是作為Crosstool的編譯配置文件。其中arm.dat文件主要用于定義配置文件、定義生成編譯工具鏈的名稱以及定義編譯選項(xiàng)等,內(nèi)容如下:
KERNELCONFIG='pwd'/arm.config #內(nèi)核的配置
TARGET=arm-linux-#編譯生成的工具鏈名稱
TARGET_CFLAGS="-O"#編譯選項(xiàng)
gcc-3.3.6-glibc-2.3.2.dat文件主要定義編譯過程中所需要的庫以及它定義的版本,如果在編譯過程中發(fā)現(xiàn)有些庫不存在時(shí),Crosstool會(huì)自動(dòng)在相關(guān)網(wǎng)站上下載,該工具在這點(diǎn)上相對(duì)比較智能,也非常有用,文件內(nèi)容如下:
BINUTILS_DIR=binutils-2.15
GCC_DIR=gcc-3.3.6
GLIBC_DIR=glibc-2.3.2
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2
LINUX_DIR=linux-2.6.10
LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-
4.執(zhí)行腳本將Crosstool的腳本文件和配置文件準(zhǔn)備好之后,開始執(zhí)行arm.sh腳本來編譯交叉編譯工具。具體執(zhí)行命令如下:
[root@localhostcrosstool-0.42]#./arm.sh經(jīng)過數(shù)小時(shí)的漫長編譯之后,會(huì)在/opt/crosstool目錄下生成新的交叉編譯工具,其中包括以下內(nèi)容:
arm-linux-
addr2line m-linux-g++ arm-linux-ld arm-linux-size
arm-linux-ar arm-linux-gcc arm-linux-nm arm-linux-strings
arm-linux-as arm-linux-gcc-3.3.6 arm-linux-objcopy arm-linux-strip
arm-linux-c++ arm-linux-gccbug arm-linux-objdump fix-embedded-paths
arm-linux-c++filt arm-linux-gcov arm-linux-ranlib
arm-linux-cpp arm-linux-gprof arm-linux-readelf以上操作的常用工具如表7-2所示。表7-2常用工具7.3.2Linux宿主機(jī)環(huán)境設(shè)置及項(xiàng)目空間建立在交叉編譯環(huán)境安裝之后,將生成的編譯工具鏈路徑添加到環(huán)境變量PATH上。添加的方法是在系統(tǒng)/etc/bashrc文件的最后添加下面一行,如圖7-4所示。
exportPATH=/opt/crosstool/gcc-3.3.6-glibc-2.3.2/arm-linux/bin:$PATH圖7-4用Vi編輯器在bashrc文件中添加環(huán)境變量設(shè)置完環(huán)境變量也就意味著交叉編譯工具鏈已經(jīng)構(gòu)建完成。下面測(cè)試剛剛建立的工具鏈。通過一個(gè)簡(jiǎn)單的程序測(cè)試剛剛建立的交叉編譯工具鏈,看是否能夠正常工作。寫一個(gè)最簡(jiǎn)單的hello.c源文件,內(nèi)容如下:#include<stdio.h>
intmain()
{
printf("Hello,world!\n");
return0;
}通過以下命令進(jìn)行編譯,編譯后生成名為hello的可執(zhí)行文件,通過file命令可以查看文件的類型。當(dāng)顯示以下信息時(shí)表明交叉工具鏈正常安裝了,通過編譯生成了ARM體系可執(zhí)行的文件。注意,通過該交叉編譯鏈編譯的可執(zhí)行文件只能在ARM體系下執(zhí)行,不能在基于x86的普通PC上執(zhí)行。
#arm-linux-gcc–ohellohello.c
#filehello
hello:ELF32-bitLSBexecutable,ARM,version1(ARM),forGNU/Linux2.4.3,
dynamicallylinked(usessharedlibs),notstripped通過上面的代碼可以發(fā)現(xiàn)hello可執(zhí)行文件是一個(gè)基于ARM的程序。在進(jìn)行目標(biāo)板開發(fā)及定制軟件的過程中,將會(huì)需要在一個(gè)綜合的、容易使用的目錄結(jié)構(gòu)里組織各種軟件包和項(xiàng)目組件。表7-3列出了目錄安排方式。表7-3目錄安排方式項(xiàng)目工作空間將存放在/home/arm/ts-project目錄下,具體建立代碼如下:
[root@localhostarm]#mkdirts-project
[root@localhostarm]#cdts-project
[root@localhostts-project]#mkdirbootldrkernelrootfsdocimagesdebugbuild-toolstools
[root@localhostts-project]#tree
|--bootldr
|--build-tools
|--debug
|--doc需要的源碼包如下:
[root@localhostts-project]#lsbuild-tools/
busybox-1.5.1.tar.gztinylogin-1.4.tar.gz
cramfs-1.1.tar.gzvivi-20030929.tar.bz2
linux-2.6.10.tar.gzvivi_s3c2410_nand_basic.patch
linux-.tar.bz27.3.3Windows工作機(jī)環(huán)境設(shè)置
Linux主機(jī)的相關(guān)環(huán)境設(shè)置好后,可以對(duì)Windows工作機(jī)的環(huán)境開始設(shè)置。Windows主機(jī)完成的工作主要是與Linux宿主機(jī)通過SSH的遠(yuǎn)程控制,和對(duì)目標(biāo)板的燒寫,以彌補(bǔ)Linux宿主機(jī)上缺少的完善燒寫工具。另外還要負(fù)責(zé)和目標(biāo)板的串口通信。
1.SSH登錄工具設(shè)置本系統(tǒng)使用SSHSecureShellClient對(duì)Linux主機(jī)進(jìn)行SSH遠(yuǎn)程控制,SSHSecureShellClient的使用界面如圖7-5所示。圖7-5SSHSecureShellClient使用界面使用步驟:點(diǎn)擊“QuickConnect”,出現(xiàn)連接配置界面,在“HostName”中輸入Linux主機(jī)IP,“UserName”中輸入登錄用戶名,點(diǎn)擊“Connect”后如果能夠連接到主機(jī),會(huì)提示輸入密碼,輸入密碼后就相當(dāng)于進(jìn)入Linux的終端界面了。當(dāng)進(jìn)行開發(fā)的時(shí)候,經(jīng)常需要將一些文件在Linux主機(jī)和Windows主機(jī)間傳遞,SSHSecureShellClient提供了一個(gè)簡(jiǎn)單易用的工具SSHSecureFileTransferClient,鏈接后就可以直觀地進(jìn)行相關(guān)操作,使用界面如圖7-6所示。圖7-6SSHSecureFileTransferClient使用界面
2.燒寫工具設(shè)置目標(biāo)板的Flash燒入程序,首先要設(shè)置好Flash燒寫器的配置。本系統(tǒng)使用EmbestonlineFlashProgrammerforARM,首先點(diǎn)擊Settings菜單中的Configure…來配置用于燒寫的EmbestJTAG仿真器參數(shù)。點(diǎn)擊File菜單中的“Open”打開配置文件,使用開發(fā)板光盤中LinuxFlashFirmware文件夾下的EduKit2410&am29lv160db.cfg;選擇Program和Flash頁修改要燒寫的文件及對(duì)應(yīng)的Flash地址。
3.串口通信工具設(shè)置本系統(tǒng)使用SecureCRT5.1串口終端實(shí)現(xiàn)串口通信。串口通信設(shè)置如圖7-7所示。圖7-7SecureCRT5.1串口通信設(shè)置7.4嵌入式系統(tǒng)移植本節(jié)要完成的工作是Linux2.6系統(tǒng)移植。在實(shí)際的開發(fā)過程中,系統(tǒng)移植是個(gè)很重要的步驟,如果沒有一個(gè)好的操作系統(tǒng)環(huán)境,就不能移植相應(yīng)的驅(qū)動(dòng)程序和應(yīng)用程序。一般系統(tǒng)移植都是開發(fā)板廠商提供的,對(duì)于本系統(tǒng)使用的EmbestEdukit-Ⅲ開發(fā)板,英蓓特公司提供了Linux2.4內(nèi)核的相應(yīng)系統(tǒng)環(huán)境,在此基礎(chǔ)上,以主流Linux2.6內(nèi)核為例,我們實(shí)現(xiàn)了Linux2.6系統(tǒng)移植,包括相應(yīng)的驅(qū)動(dòng)程序和應(yīng)用程序。7.4.1系統(tǒng)移植概述系統(tǒng)移植的重要地位體現(xiàn)在兩個(gè)方面:嵌入式系統(tǒng)組成和嵌入式軟件開發(fā)流程。嵌入式系統(tǒng)一般由硬件平臺(tái)和軟件平臺(tái)兩部分組成,如圖7-8所示。其中硬件平臺(tái)由嵌入式微處理器和外圍硬件設(shè)備組成,而軟件平臺(tái)由嵌入式操作系統(tǒng)和應(yīng)用軟件組成。圖7-8嵌入式系統(tǒng)的一般架構(gòu)隨著芯片技術(shù)的不斷發(fā)展,嵌入式處理器的主頻也越來越高,通常主頻都在40MHz以上,有的甚至高達(dá)500MHz。多處理器、多核處理器平臺(tái)也逐漸應(yīng)用在嵌入式領(lǐng)域,不過現(xiàn)在大量使用的還是32位單處理器組成的平臺(tái)。一個(gè)典型的硬件平臺(tái)如圖7-9所示。圖7-9嵌入式硬件平臺(tái)基本組成嵌入式軟件平臺(tái)主要由嵌入式操作系統(tǒng)與應(yīng)用軟件組成。目前流行的嵌入式操作系統(tǒng)可以分為兩類,一類是從運(yùn)行在個(gè)人電腦上的操作系統(tǒng)向下移植到嵌入式系統(tǒng)中形成的嵌入式操作系統(tǒng),如微軟公司的WindowsCE,SUN公司的Java系統(tǒng),朗訊科技公司的Inferno,嵌入式Linux等。這類系統(tǒng)經(jīng)過個(gè)人電腦或高性能計(jì)算機(jī)等產(chǎn)品的長期運(yùn)行考驗(yàn),技術(shù)日趨成熟,其相關(guān)的標(biāo)準(zhǔn)和軟件開發(fā)方式已被用戶普遍接受,同時(shí)積累了豐富的開發(fā)工具和應(yīng)用軟件資源。另一類是實(shí)時(shí)操作系統(tǒng),如WindRiver公司的VxWorks、ISI的pSOS,QNX系統(tǒng)軟件公司的QNX、ATI的Nucleus,中國科學(xué)院凱思集團(tuán)的Hopen嵌入式操作系統(tǒng)等,這類產(chǎn)品在操作系統(tǒng)的結(jié)構(gòu)和實(shí)現(xiàn)上都針對(duì)所面向的應(yīng)用領(lǐng)域,對(duì)實(shí)時(shí)性和高可靠性等進(jìn)行了精巧的設(shè)計(jì),而且提供了獨(dú)立而完備的系統(tǒng)開發(fā)和測(cè)試工具,較多地應(yīng)用在軍用產(chǎn)品和工業(yè)控制等領(lǐng)域中。目前常見的嵌入式系統(tǒng)有Linux、μCLinux、WindowsCE、PalmOS、Symbian、eCos、μCOS-Ⅱ、VxWorks、pSOS、Nucleus、ThreadX、Rtems、QNX、INTEGRITY、OSE、CExecutive等。應(yīng)用程序運(yùn)行在嵌入式操作系統(tǒng)之上,一般情況下應(yīng)用程序和操作系統(tǒng)是分開的。當(dāng)處理器上帶有MMU時(shí),它可以從硬件上將應(yīng)用程序和操作系統(tǒng)分開編譯和管理,Linux、WindowsCE就是這種分離機(jī)制。這樣做的好處就是系統(tǒng)安全性更高,可維護(hù)性更強(qiáng),更有利于各功能模塊的劃分。很多情況下在沒有MMU的處理器時(shí),如ARM7TDMI,經(jīng)常將應(yīng)用程序和操作系統(tǒng)編譯在一起運(yùn)行,對(duì)于開發(fā)人員來說,操作系統(tǒng)更像一個(gè)函數(shù)庫。
ARMLinux系統(tǒng)軟件開發(fā)流程不同于傳統(tǒng)的PC機(jī)上的軟件,在開發(fā)嵌入式系統(tǒng)時(shí),常常把所有的軟件模塊最終都生成一個(gè)單一的文件(image),即映像文件。它的一般布局如圖7-10所示。圖7-10典型嵌入式系統(tǒng)軟件?image的邏輯布局其中最底層是BootLoader(啟動(dòng)加載程序),接著是嵌入式操作系統(tǒng)內(nèi)核(如Linux內(nèi)核),內(nèi)核之上就是設(shè)備驅(qū)動(dòng),然后就是根文件系統(tǒng)和應(yīng)用程序。這里只是給出一般情況下映像文件的邏輯組成,通常還有DSP等其他程序。由以上論述可以看出,在嵌入式系統(tǒng)組成中,系統(tǒng)移植的內(nèi)核操作系統(tǒng)環(huán)境是軟件平臺(tái)重要的內(nèi)容;而在ARMLinux系統(tǒng)軟件開發(fā)流程中,系統(tǒng)移植占據(jù)啟動(dòng)加載程序、嵌入式操作系統(tǒng)內(nèi)核、根文件系統(tǒng)這三個(gè)方面。引導(dǎo)加載程序是系統(tǒng)加電后運(yùn)行的第一段代碼。通過這段小程序,初始化必要的硬件設(shè)備,創(chuàng)建內(nèi)核需要的一些信息并將這些信息通過相關(guān)機(jī)制傳遞給內(nèi)核,從而將系統(tǒng)的軟、硬件環(huán)境帶到一個(gè)合適的狀態(tài),最終調(diào)用操作系統(tǒng)內(nèi)核,真正起到引導(dǎo)和加載內(nèi)核的作用。本系統(tǒng)中使用韓國MIZI公司的VIVI,它是專門用于ARM的一種BootLoader。內(nèi)核是所有嵌入式Linux系統(tǒng)的核心軟件,內(nèi)核移植是一個(gè)比較復(fù)雜的任務(wù),當(dāng)然也是開發(fā)中一個(gè)重要的過程。內(nèi)核移植一般包括內(nèi)核配置,內(nèi)核編譯和內(nèi)核下載三大部分。根文件系統(tǒng)是Linux/UNIX系統(tǒng)啟動(dòng)的一個(gè)重要組成部分,也是操作系統(tǒng)正常工作時(shí)的必要部分。在啟動(dòng)時(shí)內(nèi)核需要根文件系統(tǒng)來掛載。一個(gè)完整的根文件系統(tǒng)包括鏈接庫、設(shè)備文件、配置文件、應(yīng)用程序幾個(gè)重要組成部分。7.4.2基于Edukit-Ⅲ開發(fā)板的BootLoader實(shí)現(xiàn)
1.BootLoader概述引導(dǎo)加載程序是系統(tǒng)加電后運(yùn)行的第一段代碼。PC中的引導(dǎo)程序一般由BIOS和位于MBR的操作系統(tǒng)BootLoader(例如GRUB)一起組成。然而在嵌入式系統(tǒng)中,通常沒有像BIOS那樣的固件程序,因此整個(gè)系統(tǒng)的加載啟動(dòng)任務(wù)就完全由BootLoader來完成。在嵌入式Linux中,引導(dǎo)加載程序即等效為BootLoader。簡(jiǎn)單地說,BootLoader就是在操作系統(tǒng)內(nèi)核運(yùn)行前執(zhí)行的程序。初始化必要的硬件設(shè)備,創(chuàng)建內(nèi)核需要的一些信息并將這些信息通過相關(guān)機(jī)制傳遞給內(nèi)核,從而將系統(tǒng)的軟硬件環(huán)境帶到一個(gè)合適的狀態(tài),最終調(diào)用操作系統(tǒng)內(nèi)核,真正起到引導(dǎo)和加載內(nèi)核的作用。
BootLoader是依賴于硬件實(shí)現(xiàn)的,在嵌入式系統(tǒng)中。不同體系結(jié)構(gòu)需求的BootLoader不同。除了體系結(jié)構(gòu),BootLoader還依賴于具體的嵌入式板級(jí)設(shè)備的配置。也就是說,對(duì)于兩塊不同的嵌入式板而言,即使它們基于相同的CPU構(gòu)建,運(yùn)行在其中一塊電路板上的BootLoader,未必能夠運(yùn)行在另一塊電路開發(fā)板上。
Bootloader的啟動(dòng)過程可以是單階段的,也可以是多階段的。大多數(shù)單階段的BootLoader應(yīng)用于簡(jiǎn)單的系統(tǒng),比如沒有操作系統(tǒng)的系統(tǒng)。通常多階段的BootLoader能提供更為復(fù)雜的功能以及更好的可移植性。從固態(tài)存儲(chǔ)設(shè)備上啟動(dòng)的BootLoader大多數(shù)是兩階段的啟動(dòng)過程,也就是啟動(dòng)過程可以分為stage1和stage2兩部分。依賴于CPU體系結(jié)構(gòu)的代碼,比如設(shè)備初始化代碼等,通常都放在stage1中,而且通常都用匯編語言來實(shí)現(xiàn),以達(dá)到短小精悍的目的。而stage2則通常用C語言來實(shí)現(xiàn),這樣可以實(shí)現(xiàn)更復(fù)雜的功能,而且代碼會(huì)具有更好的可讀性和可移植性。大多數(shù)BootLoader都包含兩種不同的操作模式:?jiǎn)?dòng)加載(Bootloading)模式和下載(Downloading)模式,這種區(qū)別僅對(duì)于開發(fā)人員才有意義。但從最終用戶的角度看,BootLoader的作用就是用來加載操作系統(tǒng),而并不存在所謂的啟動(dòng)加載模式與下載工作模式的區(qū)別。
(1)啟動(dòng)加載模式:這種模式也稱為自主(Autonomous)模式,即BootLoader從目標(biāo)機(jī)上的某個(gè)固態(tài)存儲(chǔ)設(shè)備上將操作系統(tǒng)加載到RAM中運(yùn)行,整個(gè)過程沒有用戶的介入。這種模式是BootLoader的正常工作模式。因此在嵌入式產(chǎn)品發(fā)布的時(shí)候,BootLoader顯然必須工作在這種模式下。
(2)下載模式:在這種模式下,目標(biāo)機(jī)上的BootLoader將通過串口連接或網(wǎng)絡(luò)連接等通信手段從主機(jī)上下載文件,比如下載應(yīng)用程序、數(shù)據(jù)文件、內(nèi)核映像等。從主機(jī)下載的文件通常首先被BootLoader保存到目標(biāo)機(jī)的RAM中,然后再被BootLoader寫到目標(biāo)機(jī)上的固態(tài)存儲(chǔ)設(shè)備中,BootLoader的這種模式通常在系統(tǒng)更新時(shí)使用。工作于這種模式下的BootLoader通常會(huì)向它的終端用戶提供一個(gè)簡(jiǎn)單的命令行接口,如U-Boot、Blob、VIVI等。
VIVI是由韓國MIZI公司開發(fā)的專門用于ARM產(chǎn)品線的一種BootLoader。因?yàn)閂IVI目前只支持使用串口和主機(jī)通信,所以必須使用一條串口電纜來連接目標(biāo)板和主機(jī)。VIVI一般有如下作用:
(1)把內(nèi)核從Flash復(fù)制到RAM,然后啟動(dòng)它。
(2)初始化硬件。
(3)下載程序并寫入Flash。
(4)檢測(cè)目標(biāo)板。
vivi.tar.bz2源代碼包解壓后的目錄結(jié)構(gòu)如下所示:
[root@localhostvivi]#tree-L1
|--COPYING
|--CVS
|--Documentation
|--Makefile
|--Rules.make
|--arch|
--drivers|--include|--init|--lib|--scripts|--test`--util10directories,3files其中VIVI主要目錄內(nèi)容分析如下:
CV—存放CVS工具相關(guān)的文件。
Documentation—存放一些使用VIVI的幫助文檔。
arch—存放一些平臺(tái)相關(guān)的代碼文件。
drivers—存放VIVI相關(guān)的驅(qū)動(dòng)代碼。
include—存放所有VIVI源碼的頭文件。
init—存放VIVI初始化代碼。
lib—存放VIVI實(shí)現(xiàn)的庫函數(shù)文件。
scripts—存放VIVI腳本配置文件。
test—存放一些測(cè)試代碼文件。
util—存放一些NandFlash燒寫image相關(guān)的工具實(shí)現(xiàn)代碼。
2.VIVI的移植生成
VIVI運(yùn)行過程分析:作為BootLoader,其運(yùn)行過程分成兩個(gè)階段。第一階段的代碼在vivi\arch\s3c2410\head.s中定義,大小不超過10KB。它包括從系統(tǒng)上電后在0x00000000地址開始執(zhí)行的部分。這部分代碼運(yùn)行在Flash中,它包括對(duì)S3C2410的一些寄存器、時(shí)鐘等的初始化并跳轉(zhuǎn)到第二階段執(zhí)行。第二階段的代碼在vivi\init\main.c中,主要進(jìn)行一些開發(fā)板初始化、內(nèi)存映射和內(nèi)存管理單元初始化等工作,最后會(huì)跳轉(zhuǎn)到boot_or_vivi()函數(shù)中,接收命令并進(jìn)行處理。需要注意的是在Flash中執(zhí)行完內(nèi)存映射后,會(huì)將VIVI代碼拷貝到SDRAM中執(zhí)行。如圖7-11所示,給出了VIVI詳細(xì)的運(yùn)行過程。圖7-11VIVI的運(yùn)行過程大多數(shù)BootLoader都分為stage1和stage2兩部分,stage2的代碼通常用C語言來實(shí)現(xiàn),以便于實(shí)現(xiàn)更復(fù)雜的功能并取得更好的代碼可讀性和可移植性。但是與普通C語言應(yīng)用程序不同的是,在編譯和鏈接BootLoader程序時(shí),不能使用glibc庫中的函數(shù)。因此,從那里跳轉(zhuǎn)進(jìn)main()函數(shù),而把main()函數(shù)的起始地址作為整個(gè)stage2執(zhí)行映像的入口點(diǎn)也存在兩個(gè)缺點(diǎn):無法通過main()函數(shù)傳遞函數(shù)參數(shù)且無法處理main()函數(shù)返回的情況。一種較為巧妙的方法是利用彈簧床的概念,也就是用匯編語言寫一段trampoline小程序,并將這段程序作為stage2可執(zhí)行映像的執(zhí)行入口點(diǎn),然后在trampoline匯編小程序中用CPU跳轉(zhuǎn)指令跳入main()函數(shù)中去執(zhí)行。當(dāng)main()函數(shù)返回時(shí),CPU執(zhí)行路徑再次回到trampoline程序。簡(jiǎn)言之,這種方法的思想就是:用這段trampoline小程序來作為main()函數(shù)的外部包裹。
VIVI中的trampoline程序如下:
@getreadtocallCfunctions
ldr
sp,DW_STACK_START
@setupstackpointer
mov
fp,#0
@nopreviousframe,sofp=0
mov
a2,#0
@setargvtoNULL
bl
main
@callmain
mov
pc,#FLASH_BASE
@otherwise,reboot;正常情況下,程序能夠正常執(zhí)行完畢,但是如果出錯(cuò)了,就回到最后一條語句重新啟動(dòng)系統(tǒng)。
(1)?VIVI的移植。為了使移植工作更加快捷,本書選擇VIVI-20030929版本。它不僅提供對(duì)ARM-920T內(nèi)核的支持,而且直接提供了對(duì)于S3C2410X的板級(jí)支持,這使移植工作量相對(duì)減少。
(2)?VIVI中與軟件相關(guān)的修改。VIVI作為Linux系統(tǒng)的啟動(dòng)代碼,在編譯配置時(shí)需要用到函數(shù)庫,包括交叉編譯器庫和頭文件,交叉編譯開關(guān)選項(xiàng)設(shè)置,還包括Linux內(nèi)核代碼中的庫和頭文件。所以,通常需要修改VIVI工程管理文件Makefile。
(3)?VIVI中與硬件相關(guān)的初始化。與具體運(yùn)行在處理器平臺(tái)上相關(guān)的文件都存放在VIVI/arch/目錄下,本系統(tǒng)使用S3C2410X處理器,對(duì)應(yīng)的目錄為s3c2410。其中head.s文件是VIVI啟動(dòng)配置代碼,加電復(fù)位運(yùn)行的代碼就是從這里開始的。由于該文件中對(duì)處理器的配置均通過調(diào)用外部定義常數(shù)或宏來實(shí)現(xiàn),所以針對(duì)不同的平臺(tái),只要是S3C2410X處理器,幾乎不用修改,只要修改外部定義的初始值即可。這部分初始值都在vivi/include/platform/smdk2410.h文件中定義,包括處理器時(shí)鐘、存儲(chǔ)器初始化、通用I/O口初始化以及VIVI初始配置等。
(4)對(duì)不同F(xiàn)lash啟動(dòng)的修改。VIVI能從NorFlash或NandFlash啟動(dòng),因此啟動(dòng)程序以及Linux內(nèi)核及根文件系統(tǒng),甚至還包括圖形用戶界面等就需要存放在NorFlash或NandFlash中。這樣,作為啟動(dòng)程序的VIVI還需要根據(jù)實(shí)際情況來修改存放這些代碼的分區(qū)。本系統(tǒng)采用32MBNandFlash,需要由VIVI進(jìn)行分區(qū)才能運(yùn)行Linux。分區(qū)指定的偏移地址就是代碼應(yīng)該存放并執(zhí)行的地址。內(nèi)核啟動(dòng)參數(shù)設(shè)置,經(jīng)過修改后,S3C2410X開發(fā)板能從NandFlash中啟動(dòng)運(yùn)行Linux,也能從NorFlash中啟動(dòng),所以相應(yīng)地也要修改啟動(dòng)命令。修改并實(shí)現(xiàn)Flash驅(qū)動(dòng),移植VIVI的最后一步是實(shí)現(xiàn)Flash驅(qū)動(dòng),開發(fā)者需要根據(jù)自己系統(tǒng)中具體Flash芯片的型號(hào)及配置,修改驅(qū)動(dòng)程序,使Flash設(shè)備能夠在嵌入式系統(tǒng)中正常工作。如果使用的是驅(qū)動(dòng)尚未支持的Flash芯片,只需仿照其他型號(hào),將Flash型號(hào)加入該驅(qū)動(dòng)程序即可。修改Flash驅(qū)動(dòng)的關(guān)鍵一步是對(duì)flash.c文件的修改。flash.c是讀、寫和刪除Flash設(shè)備的源代碼文件。由于不同開發(fā)板中Flash存儲(chǔ)器的種類各不相同,所以修改flash.c時(shí)需參考相應(yīng)的Flash芯片手冊(cè)。它包括如下幾個(gè)函數(shù):
unsignedlongflash-init(void),F(xiàn)lash初始化;
voidflash-print-info(flash-info-t*info),打印Flash信息;
intflash-erase(flash-info-t*info,ints-first,ints-last),F(xiàn)lash擦除;
volatilestaticintwrite-hword(flash-info-t*info,ulongdest,ulongdata),F(xiàn)lash寫入;
intwrite-buff(flash-info-t*info,uchar*src,ulongaddr,ulongcnt),從內(nèi)存復(fù)制數(shù)據(jù)。本系統(tǒng)使用一個(gè)移植到Edukit-Ⅲ的patch(s3c2410從NandFlash啟動(dòng)),然后修改NandFlash分區(qū)信息,最后修改啟動(dòng)參數(shù)就改造好了VIVI源代碼。具體的移植步驟如下:
(1)進(jìn)入/home/arm/bootldr工作目錄,將VIVI解壓到此空間。
[root@localhostts-project]#cdbootldr/
[root@localhostbootldr]#tar–xjvf/home/arm/ts-project/build-tools/vivi-20030929.tar.bz2
(2)進(jìn)入VIVI目錄,打上s3c2410從Nandflash上啟動(dòng)的補(bǔ)丁,并添加VIVI中與軟件相關(guān)的修改。
[root@localhostbootldr]#cdvivi
[root@localhostvivi]#patch-p1</home/arm/ts-project/build-tools/vivi_s3c2410_nand_basic.patch修改Makefile文件:
[root@localhostvivi]#viMakefile修改內(nèi)容如下:
ARCH:=arm
CROSS_COMPILE=/usr/local/arm/2.95.3/bin/arm-linux-
ARM_GCC_LIBS=/usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3
(3)修改arch/s3c2410/smdk.c文件,修改NandFlash分區(qū)信息和啟動(dòng)參數(shù)。
[root@localhostvivi]#viarch/s3c2410/smdk.c添加分區(qū)信息:
#ifdefCONFIG_S3C2410_NAND_BOOT
mtd_partition_tdefault_mtd_partitions[]={{name: "vivi",offset: 0,size: 0x00020000,flag: 0},{name: "param",offset: 0x00020000,size: 0x00010000,flag: 0},{name: "kernel",offset: 0x00030000,size: 0x002d0000,flag: 0},{name: "root",offset: 0x00300000,size: 0x01d00000,flag: MF_BONFS}};添加啟動(dòng)參數(shù):charlinux_cmd[]="noinitrdroot=/dev/mtdblock3init=/linuxrcconsole=ttySAC0";
(4)根據(jù)開發(fā)板需要進(jìn)行適當(dāng)?shù)呐渲?。啟?dòng)配置選項(xiàng)使用如下代碼:
[root@localhostvivi]#makemenuconfig配置界面如圖7-12所示。圖7-12VIVI配置界面配置文件選用smdk2410開發(fā)板的默認(rèn)配置文件,如圖7-13所示。圖7-13添加VIVI配置文件
(5)配置完成后保存退出,然后就可以用make命令來編譯生成VIVI了。
[root@localhostvivi]#make生成VIVI后,將其拷貝到images目錄。
[root@localhostvivi]#ls
archCVSdriversinitMakefilescriptsutilvivi-elf
COPYINGDocumentationincludelibRules.maketestvivivivi.map
[root@localhostvivi]#cpvivi/home/arm/ts-project/images/7.4.3嵌入式Linux內(nèi)核移植內(nèi)核是所有嵌入式Linux系統(tǒng)的核心軟件。內(nèi)核移植一般包括內(nèi)核配置、內(nèi)核編譯和內(nèi)核下載三大部分。下面將具體介紹內(nèi)核移植的每一個(gè)步驟。首先準(zhǔn)備Linux2.6.10內(nèi)核源文件:
[root@localhostts-project]#cdkernel/
[root@localhostkernel]#tar-xzvf/home/arm/ts-project/build-tools/linux-2.6.10.tar.gz
1.內(nèi)核配置
1)修改Makefile通過修改Makefile指明要用的編譯器為arm-linux-交叉編譯器,使用的體系為ARM。具體操作如下:
[root@localhostkernel]#cdlinux-2.6.10/
[root@localhostlinux-2.6.10]#viMakefile修改內(nèi)容如圖7-14所示。圖7-14修改Makefile的交叉編譯器變量其中修改的兩行內(nèi)容如下:
ARCH=arm
CROSS_COMPILE=arm-linux-其中,ARCH=arm說明目標(biāo)是ARM體系結(jié)構(gòu),默認(rèn)的ARCH是指宿主機(jī)的體系,如:i386;CROSS_COMPILE=arm-linux-說明使用的交叉編譯器前綴為arm-linux。
2)設(shè)置NandFlash分區(qū)由于系統(tǒng)使用的目標(biāo)板使用的是32MBNandFlash作為Flash存儲(chǔ)器,所以首先要建立一個(gè)NandFlash分區(qū)表,該分區(qū)表用來定義開發(fā)板空間劃分,以及定義各分區(qū)存放的起始地址以及大小等。該部分的實(shí)現(xiàn)在arch/arm/mach-s3c2410/devs.c源文件中,修改如下://添加相應(yīng)的頭文件#include<linux/mtd/partitions.h>#include<linux/mtd/nand.h>#include<asm/arch/nand.h>//新建32MB的NandFlash分區(qū)表staticstructmtd_partitionpartition_info[]={{name: "vivi",size: 0x00020000,offset: 0x0,},{
name: "param",size: 0x00010000,offset: 0x00020000, },{name: "kernel",size: 0x002D0000,offset: 0x00030000, },{name: "root",size: 0x01D00000,offset: 0x00300000, }};//定義一個(gè)NandFlash分區(qū)數(shù)據(jù)結(jié)構(gòu)staticstructs3c2410_nand_setnandset={nr_partitions:4, //定義分區(qū)數(shù)
partitions:partition_info, //定義分區(qū)表};上述代碼的作用是建立一個(gè)32MB的NandFlash分區(qū)表,將其分成4個(gè)分區(qū)。其中name代表分區(qū)名稱,size代表分區(qū)大小,offset代表分區(qū)在Flash中的起始地址。同時(shí)后面定義NandFlash的分區(qū)數(shù)據(jù)結(jié)構(gòu)。下一步建立內(nèi)核對(duì)NandFlash芯片的支持,同時(shí)加入對(duì)NandFlash芯片的支持代碼到NandFlash的驅(qū)動(dòng)程序。Arch/arm/mach-s3c2410/devs.c中的具體代碼實(shí)現(xiàn)如下://建立NandFlash的芯片支持?jǐn)?shù)據(jù)結(jié)構(gòu)staticstructs3c2410_platform_nandsuperlpplatform={tacls:0,twrph0:30,twrph1:0,sets:&nandset,nr_sets:1,};//修改s3c_device_nand結(jié)構(gòu)體增加對(duì)superlpplatform設(shè)備的支持structplatform_devices3c_device_nand={ .name ="s3c2410-nand", .id =-1,.num_resources =ARRAY_SIZE(s3c_nand_resource),.resource =s3c_nand_resource,//添加如下內(nèi)容用來支持NandFlash芯片
.dev={.platform_data=&superlpplatform}};上述代碼的主要作用是完成內(nèi)核對(duì)NandFlash芯片驅(qū)動(dòng)的支持,需要注意tacls、twrph0和twrph1三個(gè)參數(shù)控制的是NandFlash信號(hào)線CLE/ALE與寫控制信號(hào)nWF的時(shí)序關(guān)系。設(shè)置的值為tacls=0、twrph0=30、twrph1=0。含義為tacls=1個(gè)HCLK時(shí)鐘,twrph0=31個(gè)HCLK時(shí)鐘,twrph1=1個(gè)HCLK時(shí)鐘。Sets定義的是支持的分區(qū)集,nr_sets定義分區(qū)集數(shù)。最后修改s3c_device_nand結(jié)構(gòu)體增加對(duì)NandFlash設(shè)備驅(qū)動(dòng)的支持。name為設(shè)備名稱,id為有效設(shè)備編號(hào),如果只有一個(gè)定義為?-1,多個(gè)則從0開始計(jì)算,num_resources定義有幾個(gè)NandFlash芯片資源,resource定義NandFlash芯片資源的首地址。添加內(nèi)核啟動(dòng)時(shí)對(duì)NandFlash分區(qū)表的初始化配置,所以還需要修改arch/arm/mach-s3c2410/mach-smdk2410.c源文件,修改內(nèi)容如下:
//增加對(duì)NandFlash設(shè)備的支持
staticstructplatform_device*smdk2410_devices[]__initdata={&s3c_device_usb,&s3c_device_lcd,&s3c_device_wdt,&s3c_device_i2c,&s3c_device_iis,&s3c_device_nand, //添加此行來初始化新增的NandFlash分區(qū)};下面一個(gè)問題就是要禁止FlashECC校驗(yàn),由于通常使用的BootLoader通過軟件已經(jīng)產(chǎn)生ECC校驗(yàn)碼,這與內(nèi)核ECC校驗(yàn)碼不一致,所以要選擇禁止內(nèi)核ECC校驗(yàn)。完成這個(gè)步驟需要修改的文件是drivers/mtd/nand/s3c2410.c,具體操作如下:
//修改s3c2410的NandFlash芯片初始化函數(shù)
staticvoids3c2410_nand_init_chip(structs3c2410_nand_info*info,
structs3c2410_nand_mtd*nmtd,structs3c2410_nand_set*set){
if(hardware_ecc){chip->correct_data=s3c2410_nand_correct_data;
chip->enable_hwecc=s3c2410_nand_enable_hwecc;chip->calculate_ecc=
s3c2410_nand_calculate_ecc;
chip->eccmode=NAND_ECC_HW3_512;chip->autooob=&nand_hw_eccoob;}else{chip->eccmode=NAND_ECC_NONE;//修改賦值
}}到此已經(jīng)完成了新內(nèi)核對(duì)NandFlash分區(qū)的支持,下面選擇內(nèi)核的主要配置選項(xiàng)。
2.配置內(nèi)核選項(xiàng)配置內(nèi)核選項(xiàng)是移植內(nèi)核過程中很重要的一步,也是非常復(fù)雜的一步。本系統(tǒng)的開發(fā)板接近Linux內(nèi)核中提供的smdk2410開發(fā)板,所以可以參考smdk2410開發(fā)板的配置文件,將其復(fù)制到內(nèi)核代碼根目錄下,然后開始配置內(nèi)核,操作如下:
[root@localhostlinux-2.6.10]#cp
arch/arm/configs/smdk2410_defconfig.config
[root@localhostlinux-2.6.10]#makemenuconfig
Linux提供了四種主要的配置內(nèi)核的辦法。使用最廣泛的配置內(nèi)核方式為makemenuconfig,顯示一個(gè)基于文本的圖形化終端配置菜單,如果一個(gè)?.config存在,它將使用該文件設(shè)置那些默認(rèn)的值。圖7-15顯示了makemenuconfig的配置界面。圖7-15內(nèi)核配置界面由于是基于smdk2410開發(fā)板的配置選項(xiàng),所以需要在此開發(fā)板的基礎(chǔ)上修改部分配置選項(xiàng)來配置本系統(tǒng)的內(nèi)核。增刪的內(nèi)核配置選項(xiàng)如下:
Loadablemodulesuport--->
[*]Enableloadablemodulesuport #該選項(xiàng)的目的是使內(nèi)核支持可加載模塊,需要使用
insmod、rmmod等工具,所以必須選擇;
[*]Moduleunloading #卸載模塊選項(xiàng);
[*]Automatickernelmoduleloading #內(nèi)核在任務(wù)中要使用一些被編譯為模塊的驅(qū)動(dòng)或特性時(shí),先使用modprobe命令來加載它,然后該選項(xiàng)自動(dòng)調(diào)用modprobe加載需要的模塊,所以該選項(xiàng)一定要選擇。
SystemType--->
[*]S3C2410DMAsuport #該選項(xiàng)用來支持s3c2410DMA特性;
Generalsetup--->Defaultkernelcommandstring:
noinitrdroot=/dev/mtdblock3init=/linuxrc
console=ttySAC0,115200
mtdblock3代表第四個(gè)Flash分區(qū),為root分區(qū);console=ttySAC0,115200使kernel啟動(dòng)期間的信息全部輸出到串口0上,波特率為115200;Linux2.6內(nèi)核對(duì)串口的命名改為ttySAC0。
[*]NWFPEmathemulation #支持NWFPE浮點(diǎn)庫;#MTD子系統(tǒng)的配置DeviceDrivers--->MemoryTechnologyDevices(MTD)--->............................................[*]MTDpartitioningsupport[*]Commandlinepartitiontableparsing............................................[*]RAM/ROM/Flashchipdrivers-->……………<*>DetectflashchipbyCommonFlashInterface(CFI)prob<*>Detectnon-CFIAMD/JEDEC-compatibleflashchip<*>SupportforIntel/Sharpflashchip<*>SupportforAMD/Fujitsuflashchip<*>SupportforROMchipinbusmapping……………NAND
FlashDeviceDrivers--->................................<*>NANDDeviceSupport<*>NANDFlashsupportfoeS3C2410/S3C2440Soc……Characterdevices--->.............................[*]Non-standardserialportsupport[*]S3C2410RTCDriverFilesystems---><>Secondextendedfssupport #去除ext2支持Pseudofilesystems--->[*]/procfilesystemsupport[*]Virtualmemoryfilesystemsupport(formershmfs)[*]/devfilesystemsupport(OBSOLETE)[*]Automaticallymountatboot(NEW)Miscellaneousfilesystems--->............................<*>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025西藏昌都瀾滄江投資有限責(zé)任公司招聘1人考試重點(diǎn)題庫及答案解析
- 房屋買斷權(quán)協(xié)議書
- 廢品轉(zhuǎn)讓協(xié)議書
- 工廠投資合同范本
- 床子出租協(xié)議書
- 學(xué)生拜師協(xié)議書
- 延期留用協(xié)議書
- 小店股權(quán)協(xié)議書
- 誤傷同伴的協(xié)議書
- 項(xiàng)目打印機(jī)合同范本
- 《蘇教版六年級(jí)》數(shù)學(xué)上冊(cè)期末總復(fù)習(xí)課件
- 光纜海底故障診斷-深度研究
- 2024年天津高考英語第二次高考真題(原卷版)
- 降低臥床患者便秘品管圈課件
- 工程測(cè)量水準(zhǔn)儀課件
- 公司委托法人收款到個(gè)人賬戶范本
- 《楓丹白露宮苑景觀分析》課件
- 中國石油大學(xué)(華東)自動(dòng)控制課程設(shè)計(jì) 雙容水箱系統(tǒng)的建模、仿真于控制-2
- 潘謝礦區(qū)西淝河、泥河、濟(jì)河、港河水體下安全開采可行性論證報(bào)告
- 創(chuàng)業(yè)人生(上海大學(xué))【超星爾雅學(xué)習(xí)通】章節(jié)答案
- GB/T 4957-2003非磁性基體金屬上非導(dǎo)電覆蓋層覆蓋層厚度測(cè)量渦流法
評(píng)論
0/150
提交評(píng)論