摘 要:為滿足嵌入式項目需要,在本文中對在以arm為核心硬件的物理平臺上,移植嵌入式linux系統以及在此系統基礎上,實現便捷有效的文件系統和設備驅動進行了研究。通過對linux內核、yaffs2文件系統內核以及多種設備驅動的代碼分析與移植,以及對linux系統原有觸控屏庫的改良,成功實現了一個穩定、高效、簡潔的嵌入式linux開發平臺的整體構建。
關鍵詞:嵌入式;linux;系統;驅動;移植
中圖分類號:TP311.11 文獻標識碼:A 文章編號:1674-7712 (2014) 10-0000-02
在教學科研中,日益凸顯對嵌入式軟硬件平臺的需求,而搭建一個優良的嵌入式平臺,是一件涉及到軟件硬件特性、嵌入式系統適用性以及項目目標實用性的復雜問題。在目前諸多的軟硬件平臺中,嵌入式linux由于其優良的系統特性、開放的核心代碼和眾多的技術支持,成為了呼聲最高的嵌入式系統平臺。作者在科研開發的過程中,因項目需要而開始搭建一個嵌入式linux平臺,在成功實現后將這一過程總結下來,可供其他項目在搭建類似平臺時的一個參考。總體過程分為三個部分,即對linux內核的移植、對yaffs文件系統的移植以及對優化后的觸控設備的移植。
一、移植linux內核
在本次項目中采用的是linux2.6.31的內核。linux2.6.31內核是2010年發布的版本,在9個實驗版本之后推出的一個穩定版。在這個版本中率先支持USB3.0,CUSE和OSS代理,一些內存管理機制得到了改進以提高桌面交互性,實現了支持Intel無線Multicomm 3200 WiFi設備,以及內存泄漏掃描器和Btrfs文件系統的增強,并且成功實現了對NFS4.1客戶端的初步支持,支持IEEE 802.15.4,Firewire上的IPv4及很多新驅動。總體來說這是一個穩定和資源豐富的新版本。
(一)基本配置
在源文件解壓縮后,首先修改源文件目錄下的Makefile文檔183行,指定系統硬件架構為arm,交叉編譯器為arm-linux。修改mach-smdk244.c的163行的時鐘,換為系統硬件平臺的12MHz。進入menuconfig后,要將system tape中支持S3C2440的選項都加載上,將kernel features中的EABI支持選上,因為本研究使用4.1.2版本的交叉編譯器,4.X.X版本以后的交叉編譯器要使用EABI。
(二)配置支持NandFlash與yaffs2文件系統
本研究采用的是256M的NandFlash,在arch目錄下的common-smdk.c文件中進行配置,修改第110行使系統支持256M大小的存儲單元,修改第140行調整讀寫匹配時間。修改driver目錄下Kconfig文件172行,使配置時出現NandFlash選項。進入menuconfig后,對Device Driver選項中的NandFlash相關項全部選為標準驅動模式。
打開yaffs2源碼目錄,利用yaffs2根目錄下自帶的path-ker.sh的shell文件,將其支持補丁打入linux目錄下。在進入menuconfig后,要對File systems和Native langudge support中關于yaffs2的選項全部配置上。
(三)相關硬件的驅動移植
1.LCD驅動的移植
本次研究中采用的是800X480的觸摸式LCD,因此要對LCD的驅動進行配置和移植。在linux內核源碼drivers目錄下s3c2410fb.c文件中,修改第365行的時鐘頻率設定。在arch目錄下mach-smdk2440.c中修改107行的static struct結構體,改變默認的LCD參數為系統實際配置的800X480顯示器相關參數。在drivers目錄下的Kconfig文件1942行加入LCD尺寸選擇項。在menuconfig中對Device Driver下的Graphics Support和Console display driver support中關于顯示器的選項進行配置,并在LCD size select中選擇本文采用的7 inch 800X480 LCD。
2.LCD觸屏驅動的移植
2.6.31版本的Linux內核中并沒有觸摸屏驅動,故需單獨提供觸屏驅動文件s3c2410_ts.c、s3c2440_adc.c和s3c2440adc.h。s3c2410_ts.c應放入driversinput目錄下,s3c2440_adc.c和s3c2440adc.h則放入char目錄,并同時修改這兩個目錄下的Kconfig和Makefile文件,加入對這三個文件的編譯。
3.網卡驅動的移植
本次研究中并未使用基于TCP/IP協議的有線或無線網絡,但是在開發過程中,需要板載系統與linux系統進行基于NFS服務器的數據交換,以實現部分大文件的共享,并有利于系統調試,故必須安裝網卡驅動。本次研究采用的是DM9000網卡芯片。首先在mach-smdk2440.c中添加dm9000的設備名,然后在arch目錄下的devs.c中進行定義,在devs.h中進行聲明。在drivers目錄下對網卡的源碼dm900.c進行修改,在43行添加系統支持頭文件,1019行指定注冊時的中斷觸發方式,1215行設置mac地址。在進入menuconfig中后,將Device Drivers項下網卡相關內容進行配置。
4.USb設備驅動的移植
Linux內核對于USB的支持很完善,只需要在menuconfig時將Device Drivers選項下的USB support相關內容配置完善即可。
5.串口2驅動的移植
linux下的通用串口驅動只支持串口0和串口1,串口2被配置成了紅外驅動,由于我們要使用串口2接GPS等模塊,就需要將串口2配置成通用串口驅動。修改arch目錄下的mach-smdk2440.c文件第100行的硬件地址,drivers下的samsung.c文件404行,加入s3c24xx_serial_startup函數中關于串口2的協議規則。
6.燒錄與下載linux內核鏡像
完成內核配置與硬件驅動的移植后,就可利用make zImage命令將linux內核燒制成zImage文件,然后利用uboot打開usb host,然后利用DNW將linux版本2.6.31內核鏡像下載至內存中,再燒寫至NAND flash。值得注意的是在進行mkzImage命令后,應用chmod語句將新產生的文件提高讀寫權限,以利于順利傳輸。
二、移植YAFFS文件系統
YAFFS(Yet Another Flash File System)是第一個專門為NAND Flash存儲器設計的嵌入式文件系統,適用于大容量的存儲設備。YAFFS 是基于日志的文件系統,提供磨損平衡和掉電恢復的健壯性。此外它還為大容量的Flash 芯片做了很好的調整,針對啟動時間和RAM的使用做了優化,適用于大容量的存儲設備。
在移植之前,首先在linux下創建root文件夾,在root內建立linux系統通用的各文件夾,如bin、usr、lib、home等,然后利用busybox1.15.2建立yaffs2文件系統。
(一)對busybox的編譯
首先對busybox的Mikefile文件進行修改,將交叉編譯器調整為arm-linux編譯器,確定編譯方式。在menuconfig中配置busybox setting,例如確定安裝路徑以及對掛載文件系統的支持。然后用make install命令生成rootfs文件夾,將其內容拷貝至root目錄。
(二)制作文件系統
1.創建文件系統的設備節點
在dev目錄下,利用mknod命令創建 console 和1兩個設備節點,對文件系統進行支持。根據yaffs2的設定,其參數應分別為c 5 1 和c 1 3 。值得注意的是,這兩個文件為特殊的設備節點型文件,在制作其他文件系統時,如果對root目錄進行拷貝,這兩個文件是無法復制的,并且無任何提示,此時必須用mknod命令重新創建。
2.添加文件
將busybox的examples下的etc以及本級的etc都復制到root目錄下下相應位置后,把passwd文件中的第一行中的bash修改為ash,因為文件系統的bin目錄下沒有bash這個命令,而是用ash代替bash,否則在用戶名密碼登錄的時候會出現錯誤。拷貝lib內的交叉編譯器的庫文件到root相應位置。
在inittab、profile、fstab和rec等初始化文件中做出修改,設置編譯路徑等參數。新建sysconfig文件夾,在里面新建HOSTNAME文件,使片上系統能找到登陸名稱,如作者設定為gf。
(三)完善文件系統
在root下創建mnt文件夾,為以后掛載NTF服務器做好準備,同時也可以掛載sd卡usb設備等。在初始化文件rcS文件中利用ifconfig語句,將eth0網絡設備的ip設為192.168.1.10或其他ip地址,為以后的網絡通信做好準備。為了在掛載NFS服務器時方便,在profile文件中利用alias語句,將mount -t nfs -o nolock命令等效為mntnfs,就可以在掛載時減少輸入字母的數量,方便工作。
(四)制作yaffs2鏡像
利用制作工具mkyaffs2image文件,將root制作成root.bin文件,再利用uboot和DNW燒寫入文件系統的地址單元,即實現了yaffs2的移植。與內核鏡像相同,在bin文件生成后,應用chmod語句將新產生的文件提高讀寫權限,否則無法傳輸。
三、移植tslib系統
在嵌入式平臺上,由于系統體積小且力求實現便攜化,已經越來越多的采用觸屏作為輸入設備。Linux系統本身帶有對觸屏的支持庫,但是在使用過程中發現去抖效果很差,鼠標定位也不準確,因此額外移植了tslib觸摸屏鼠標校正支持庫。移植后效果明顯改善,鼠標位置穩定且定位比較精準。
在移植tslib之前,先安裝GNU的m4工具以及autoconf2.64,因為系統自帶的autoconf2.57不支持tslib的autogen.sh里的宏定義,而安裝autoconf2.64必須要有m4工具。安裝完成后,建立一個cache文件,保證在configure過程中不出現由于檢查non1而導致的配置失敗。完成后進行configure,同時要在參數中注明主機與目標位arm-linux模式。配置完成后將ts的config文件ts.conf中加入input指令,開啟程序工作。然后將tslib目錄下的所有文件拷貝至文件系統local文件夾即本地用戶應用程序目錄下,而將ts_calibrate拷貝到文件系統usr的bin下,為開機運行創造條件。
為了方便系統調用tslib的庫文件,本次研究中修改了初始化文件rsC,增加了一個對qtconfig文件運行。而這個qtconfig文件須自行建立,以shell腳本的形式放置到用戶的應用程序目錄下即usr/bin內,主要對控制臺設備、framebuffer、觸摸屏設備、觸屏校正信息保存 tslib配置和tslib加載模塊的路徑等環境變量進行指定。只有qtconfig正常運行后,才能調用tslib的支持庫文件。
片上系統在運行時,開機調用了ts_calibrate程序,當點擊屏幕上的五個校正點時,會生成五個觸點的校正信息,并在etc目錄下生成pointercal文件儲存定位信息。我們在初始化腳本中可以設定對pointercal文件的檢查,當其存在時,則跳過ts_calibrate程序,直接進入系統。在本次研究中出現了這樣的一個問題,即初次開機后運行定位程序,卻無論如何無法準確定位五個參考點,不是點擊無效,就是點后數據完全錯誤,令筆者百思不得其解,甚至一度以為是觸控板出現了器件故障。后來經過很多的反復燒寫、檢查、核對和實驗,終于發現在linux系統運行后,會在串口上生成對console的確認信息,如鍵入enter后啟動網卡和登陸。我們必須在此操作前先完成對五個基準校正點的確認,再開啟console,否則會對tslib的運行造成嚴重影響,這也是數天的反復調試后得出的珍貴經驗。如出現由于某種原因導致的第一次校正錯誤,可利用rm命令移除etc目錄下的pointercal文件,這樣再次運行時就可以重新校正了。
參考文獻:
[1]Jonathan Corbet,AlessandrorubiniGreg KroahHartman.LINUX設備驅動程序[M].北京:中國電力出版社,2005:213-453.
[2]韋東山.嵌入式linux應用開發 完全手冊[M].北京:人民郵電出版社,2008:240-380.
[3]Jonathan Corbet,AlessandrorubiniGreg KroahHartman.LINUX設備驅動程序[M].北京:中國電力出版社,2005:213-453.
[4]W.Richard Stevens Stephen A.Rago.UNIX環境高級編程[M].北京:人民郵電出版社,2006:287-540.
[5]李強強.嵌入式Linux系統移植與裁剪技術研究[D].中國石油大學,2008.
[作者簡介]高峰(1980-),男,山東兗州人,防空兵學院,講師,碩士,研究方向:嵌入式軟件;馬世友(1981-),男,黑龍江湯原人,防空兵學院,講師,碩士,研究方向:嵌入式硬件;劉東維(1978-),男,山東鄒城人,防空兵學院,講師,碩士,研究方向:嵌入式設計。