羅金選 袁 著 張 益
(電子科技大學 成都 611731)
嵌入式系統的構架從下到上,一般分為硬件、bootloader程序,嵌入式linux設備驅動程序、嵌入式linux內核、linux系統調用接口、根文件系統、應用程序,其本質上依然是計算機系統,但相對于傳統通用的PC機來說,是軟硬件可以自由裁剪,在功能、可靠性、成本、體積、能耗方面有更加嚴格要求的專用計算機系統。為了適應某彈藥項目中各個節點在高速飛行的情況下,硬件上必須輕捷穩定,軟件上必須完全支持該模塊利用某復雜協議進行可靠通信和無線音視頻數據傳輸的要求,自主設計了以S3C2440 ARM為主控制器,以linux2.6為操作系統的嵌入式無線通信模塊,以下是該模塊從下到上設計過程中每個步驟的調試情況和最終測試結果。
該無線通信模塊的硬件框架主要包括一個S3C2440 ARM主控制器、兩片32M的SDRAM組成的64M內存、一片2M的 NorFlash,一片512M的NandFlash,以及一個晶振、一個電源模塊、一個HJtag調試接口及一個用于選擇啟動方式的開關,也即一個ARM嵌入式系統可以運行的最基本條件。另外還包括一些外圍電路,主要有:4個USB接口,其中一個充當從設備的接口,用于在bootloader的引導下從宿主機下載內核和文件系統,另外三個充當主設備接口,用于連接USB外部設備;3個TTL電平的9孔串口通過電平轉換之后分別連接著一個無線數據傳輸模塊和一個GPS模塊,還有一個用于在調試的時候和宿主機通信;一個以太網接口用于在調式階段從宿主機上通過NFS協議掛載文件系統,和在研發階段利用TFTP或者NFS協議從宿主機上下載內核和文件系統;一個圖像采集模塊用于采集實時圖像,一個帶觸摸屏的LCD用于顯示采集過來的圖像和操作界面,一個VGA轉接板接口可以用于接PC機顯示屏,一個音頻接口用于聲音采集,一個蜂鳴器用于調試發聲。無線通信模塊的總體框架如圖1所示,實物如圖2所示。


嵌入式產品在研發階段,bootloader除 了要引導操作系統之外,還有一個重要的原因就是必須在bootloader的引導下才能將linux內核和文件系統從宿主機下載到目標機的內存,然后再由bootloader將linux內核和文件系統從內存復制到Flash(相當于PC機的硬盤)中永久保存,在下一次系統啟動的時候又要由它將Flash中的linux內核讀到RAM中去執行,因此沒有bootloader的存在,就無法進行后面的工作,linux內核也就永遠沒辦法啟動起來,它的作用就像PC機中的BIOS,簡單的說,bootloader就是系統復位之后在操作系統內核運行之前運行的一小段程序,通過這一小段程序,初始化硬件設備,建立內存空間的映射圖,將系統的軟硬件環境帶到一個合適的狀態,最終引導操作系統。目前比較流行的bootloader主要有德國DENX軟件工程中心開發的U-boot和韓國三星公司開發的VIVI。而U-boot是一個比較統通用的bootloader,支持很多不同體系架構的處理器,如:ARM,POWERPC,X86,MIPS,XSale等,它的啟動過程通常分兩個階段,總體啟動流程圖如圖3所示。

圖3 U-boot啟動流程圖
移植第一階段代碼的主要根據是ARM的最小系統即根據CPU的體系結構和SDRAM,FLASH芯片的型號不同來設置,屬于芯片級移植,主要是修cpu/arm920t/start.S文件,用匯編語言編寫,具體所做的事情主要有:設置CPU進入svc模式,關閉看門狗,屏蔽所有中斷,設置CPU的速度,時鐘頻率,關閉MMU和cache,初始化SDRAM控制器,設置堆棧,清空bss數據段,至此:整個系統SDRAM存儲空間映射情況如圖4所示,已經為第二階段準備好一些基本的硬件環境,然后初始化Flash控制器,再從Flash中拷貝第二階段代碼到RAM空間。

圖4 U-boot內存空間映射圖
第二階段屬于板級移植,電路板不同,代碼就不同,當U-boot的 start.S運行到"-start-armboot:.word start-armboot"時,就會調用 lib-arm/board.c中的start-armboot函數,至此U-boot進入第二階段,這一階段的代碼主要是建立起和宿主機的通信,并從宿主機上將linux內核和文件系統下載到目標機上,具體要做的事情主要有開發板的相關配置:時鐘初始化,環境變量初始化,串口控制臺初始化,配置可用的RAM,NorFlash初始化,NandFlash再次初始化,網卡初始化等,usb等功能的實現。初始化完成后就可以建立起和宿主機之間的通信,然后將linux內核文件系統下載到目標機上,并寫入Flash中永久保存。從宿主機下載內核和文件系統可以采用tftp或者nfs協議下載,也可以通過USB接口下載。以下是實現tftp和nfs協議的U-boot成功運行之后的的啟動界面,如圖5所示。

圖5 U-boot的啟動界面
linux2.6操作系統幾乎支持市面上所有的嵌入式處理器,具有很好的可移植性,但是從官方網站下載的linux內核是不能在即定的硬件平臺上運行的,必須根據CPU的體系結構,和電路板的設計對linux內核內與硬件相關的一部分代碼做相應的修改,然后利用已經搭建好的交叉編譯環境編譯新的Linux內核,再下載到板子上運行。Linux內核移植步驟如下:
第一步:進入內核根目錄修改Makefile文件為


第四步:修改NandFlash分區,這里只創建四個分區,四個分區空間分配結構如圖6所示。

圖6 NandFlash空間分配結果圖

第五步:執行make menuconfig命令配置內核,linux的配置界面如圖7所示,配置完成之后,執行make zImage命令編譯內核得到內核鏡像文件。要配置的選項主要有Sysytem Type--->

接下來需要制作根文件系統,yaffs2文件系統是根據NandFlash的存取特點,將文件組織成固定大小的數據段,對文件系統上所有的內容都統一當作文件來處理,每個文件都有一個頁面專門存放文件頭,所以yaffs2文件系統是專門為嵌入式Nand-Flash而設計的一種日志型文件系統,適用于大容量的存儲設備,因不支持數據壓縮功能,所以速度快,掛載時間短,對內存占用少,同時yaffs2自帶NAND芯片驅動,提供嵌入式系統直接訪問文件系統的API,這樣用戶既可以使用linux中的MTD與VFS訪問文件系統,也可以直接對文件系統操作,yaffs2文件系統的制作過程如下:
第一步:先使用命令#./patch-ker.sh c/home/my2440/linux2.6/為內核打上yaffs2補丁。
第二步:配置內核,使其支持yaffs2文件系統,配置完成之后重新編譯內核,配置界面如圖7所示。

圖7 linux支持yaffs2的配置界面
第三步:首先在busybox根目錄下修改Makefile文件如下:
CROSS-COMPILE=arm-linux
ARCH=arm,然后配置編譯busybox生成文件系統所需要的應用程序。
第四步:新建一個 root-2.6目錄,把編譯busybox生成的應用程序的可執行文件復制到該目錄下,然后用mkdir命令創建文件系統所需要的目錄:mkdir dev etc home lib mnt opt proc tmp var www,并制作好相關的配置文件。
第五步:用mkyaffs2image-128工具制作好根文件系統的鏡像得到 root-2.6.img文件:makyaffs2image root-2.6/root-2.6.img。圖8是下載文件系統和內核鏡像到板子上linux成功掛載文件系統成功啟動之后的界面。

圖8 linux內核成功啟動之后的界面
到此為止,硬件平臺可以運行起來了,但是各種外設因為還沒有驅動的支持還不能使用。接下來就是為各個外部設備的制做好驅動程序(見圖7),屏蔽底層硬件細節,為上層應程序提供所有操作底層硬件設備的接口函數,使得原來在通用PC機上開發的應用程序不需要做實質性的修改就可以移植該平臺上來,在通信模塊的開發過程中涉及了嵌入式linux僅有的三大設備驅動,但從linux2.6開始引入了platform虛擬總線機制,使得這三大完全不同類型的設備驅動都可以使用platform進行統一管理和注冊,platform機制和傳統設備驅動開發機制相比,一個明顯的優勢在于將設備和驅動分開管理,提高了驅動和資源的獨立性,因而增強了設備驅動程序的可移植性和安全性。Platfrom機制本身并不復雜,由兩部分組成:platform-device和platform-driver。用platform開發底層驅動的大致流程為:定義platform-device->注冊platform-device->定義platform-driver- > 注冊platform-driver。
下面以platform按鍵驅動為例說明平臺上設備驅動開發的整個過程:
第一步:定義和注冊按鍵設備,在 arch/arm/plat-s3c24xx/devs.c中添加按鍵驅動平臺設備的定義:

};中所有接口函數,然后在static int my-keysprobe(struct platform-device*dev)函數中用register-chrdev()函數注冊keys-ops結構體;編寫platform驅動struct platform-driver my-buttons-drv={

第三步:在下面注冊或者下載 platform設備驅動



圖9 驅動編譯進內核界面
當硬件平臺,bootloader,linux內核和驅動都做好之后,那么一個集軟硬件于一身的完整的嵌入式系統平臺就基本搭建起來了,使用arm-linux-gcc重新編譯某協議程序,并下載到該模塊中,運行結果見圖10。

圖10 某通信協議運行結果
項目驗收的結果表明利用該通信模塊進行無線通信,相對先前以通用CPU為主控制器和商用linux為操作系統的軟硬件平臺來說,功能一摸一樣,但硬件集成化程度有了很大的提高,體積和重量大大減小,成本大幅度降低,開發周期縮短,調試時間充足,出錯機會減少,因而更安全可靠,更符合安裝在飛行器上的要求。
[1]周立功等.ARM嵌入式系統基礎教程(二)[M].北京.北京航空航天大學出版社,2005.
[2]周立功.ARM嵌入式系統實驗教程(二)[M].北京:北京航空航天大學出版社,2005.
[3] 陳莉君,馮銳,牛欣源譯.孫玉芳審.BOVET D P.,MARCOCESAT.深入理解linux內核(第二版)[M].北京:中國電力出版社,2004.
[4]俞永昌.linux設備驅動開發技術及應用[M].北京:人民郵電出版社,2008.