基于PXA255的ARM Linux操作系統移植
關鍵字:ARM Linux;移植;PXA255;CSB226;驅動程序
1. 引言
ARM處理器是當今應用最為廣泛的處理器芯片,它功耗小、成本低、性能優越,在消費電子類產品中占據主導地位。Linux操作系統近年來在嵌入式領域中發展很快,由于其強大的性能和開源免費的特點,越來越受到嵌入式系統開發商的青睞,信息家電、網絡設備、手持終端等都是嵌入式Linux應用的廣大市場。
在嵌入式開發中,把操作系統移植到開發板是進行嵌入式應用開發的前提和基礎。ARM Linux是針對ARM體系結構的嵌入式Linux操作系統。本文主要闡述了將ARM Linux系統移植到基于PXA255處理器的開發板CSB226上的方法和關鍵技術。
2. 軟硬件平臺環境
2.1. 硬件平臺
(1)PXA255處理器
Intel PXA255是基于XScale微架構的一款嵌入式應用處理器,它在XScale結構的基礎上集成了眾多的外設接口,如:PCMCIA控制器、LCD控制器、多媒體通信口等,是專為高性能、低功耗的便攜式手持設備而開發的。CSB226是基于PXA255處理器而設計的一款開發板,本文的移植工作就是在此開發板上進行的。CSB226還配置有許多外設,包括:64MB SDRAM內存、32MB Flash、CS8900A以太網控制器、CF接口等。CSB226開發板系統結構框圖[2]如圖1所示。
圖1 CSB226開發板系統結構框圖
(2)硬件環境搭建
嵌入式開發通常采用宿主機―目標機的主從開發模式[3]。宿主機指開發主機,由一臺通用PC機或工作站構成;目標機即指嵌入式設備,在本文中是CSB226開發板。硬件的連線圖如圖2所示,開發板和宿主機之間通過串口、以太網或JTAG口等進行通信,采用“交叉”開發方式。本文采用硬件仿真工具BDI2000進行軟件的調試,仿真器一端通過JTAG口與目標機相連,另一端用網線與宿主機相連。
圖2 主機和目標機的連線圖
2.2. 軟件環境
本文開發主機采用RedHat9.0操作系統。首先需要對開發主機和目標機做一些設置,然后搭建交叉編譯和調試環境,具體步驟如下:
在開發主機上需要做以下設置:(1)啟動NFS服務,為目標機使用NFS文件系統做準備;(2)安裝TFTP服務器,為目標機從主機上下載文件提供服務;(3)啟動Telnet服務;(4)安裝Minicom工具,它是Linux環境下的超級終端工具,用它與目標機進行串口通信。另外,目標機上需要設置IP地址,與開發主機設置在同一網段。
對于交叉編譯環境,使用最廣泛的ARM Linux交叉工具鏈為arm-linux-toolchain,由bin、include、lib三部分組成。調試環境的搭建使用GNU/GDB調試工具,安裝后生成ARM平臺的交叉調試工具arm-linux-gdb。
3. 基于PXA255的ARM Linux移植關鍵技術
3.1. 內核定制
Linux內核和文件系統是嵌入式Linux的兩個核心部分。首先進行內核的編譯,在開發主機上配置編譯ARM Linux內核,生成一個針對CSB226平臺的Linux內核映像zImage。
本文使用2.4.19版本的標準內核,編譯內核的步驟如下:(1)準備Linux內核源代碼linux-2.4.19.tar和平臺相關的系列補丁:patch-2.4.19-rmk7.gz、diff-2.4.19-rmk7-pxa2.gz、linux-2.4.19-rmk7-pxa2-ptx14.diff。(2)解壓源碼包并按順序打上幾個補丁,再對內核源碼的配置文件作適當的修改,然后用make dep,make zImage命令進行編譯,如果編譯成功會在Linux源碼arch/arm/boot目錄下生成內核映像文件zImage。
在內核成功編譯之前,關鍵是對內核源碼做適當的修改,以適應特定的開發平臺。本文中對源碼的修改有如下幾點:(1)將Makefile文件中的編譯器改為交叉編譯器arm-linux-gcc,體系結構改為ARM。(2)本文中使用NFS方式掛載文件系統,因此,需要在CSB226的默認配制文件linux/arch/arm/def-configs/csb226中設置配置命令行的屬性:CONFIG_CMDLINE ="root=/dev/nfs rw nfsroot=10.0.0.1:/home/busybox ip=10.0.0.2 mem=64M console=tty0 console=ttyS0,38400",其中“root=/dev/nfs”指定設備文件,“10.0.0.1:/home/busybox”是文件系統所在開發主機的IP地址和目錄位置,10.0.0.2是目標機的IP地址。主機端和目標機的串口通信波特率要一致,本項目中是38400。(3)在源碼linux/arch/arm/tools/目錄下的mach-types文件中添加CSB226的宏定義和機器號,CSB226的機器號是216,這個整數是唯一的,在啟動初始化的時候會把它賦給微處理器的R1寄存器。(4)用make menuconfig命令對默認配置做一些調整,比如添加外設、網絡協議和文件格式等選項。
成功生成映像文件zImage后,就可以下載到目標機運行了,但只有這個內核還無法與系統交互,還需要一個文件系統。
3.2. 文件系統
(1)嵌入式文件系統制作
本文采用Busybox工具包組建嵌入式文件系統。直接配置編譯Busybox就可以創建/bin、/sbin、/usr等目錄,其中包含了大部分常用的命令,但Busybox并不提供與登錄相關的命令如:login、getty、passwd等,這需要用Tinylogin軟件包生成。/lib目錄的動態庫文件可以用Glibc生成。/dev目錄下是系統所用的設備節點,只需要根據當前平臺對外設的支持情況逐個地添加即可。/etc目錄是系統配置文件和子目錄,比如啟動配置、網絡配置等,需要針對特定應用啟動相應的服務和進程。
(2)文件系統的掛載
創建好文件系統的目錄結構后,還需要將目錄制作成某種格式的文件系統,掛載到Linux內核下使用。常用的掛載方式有Ramdisk、JFFS2、NFS,其中NFS(Network File System)是網絡文件系統,它的優點是可以從主機上直接修改文件系統,方便開發。本文使用NFS的掛載方式,將根文件系統是放在開發主機上,開發主機提供網絡共享服務,目標機在啟動時通過NFS方式掛載根文件系統。
3.3. 設備驅動移植
將Linux內核移植到CSB226開發板上后,還需要移植常用外設的驅動程序,如:LCD液晶屏、鼠標、鍵盤、CF卡等。下面重點闡述LCD液晶屏和CF卡的移植過程。
(1)LCD液晶屏的驅動移植
Linux中的Framebuffer幀緩沖驅動分為三層[4],中間層及上層是設備無關的軟件層,底層是與硬件相關的幀緩沖驅動,因此,LCD驅動移植主要是驅動幀緩沖硬件設備,在本文中對應于CSB226平臺上的LCD控制器和其外接的TFT LCD顯示器。
基于PXA255微處理器的不同平臺的差異主要在于外接的LCD顯示屏硬件的差異,因此對于不同平臺的幀緩沖驅動程序的差別主要是在LCD控制寄存器中顯示屏規格參數的設置上有不同。LCD寄存器中的初始規格參數是在頭文件drivers/video/pxafb.h的宏定義中設置的,因此對于不同的硬件平臺只要更改硬件的規格參數即可。這些參數是在初始化函數pxafb_init()中進行配置的。
(2)CF卡的驅動移植
CF(Compact Flash)接口是一種標準的擴展接口,主要用于擴展存儲空間,如本文使用的128M CF存儲卡,也可以外接其他設備,如CF接口的modem、無線網卡等。
在Linux系統下,由于CF卡與PCMCIA設備控制器兼容,通常把CF卡當作PC Card設備進行驅動和管理。PCMCIA的插槽驅動和PC卡驅動與硬件直接相關,是驅動移植中需要重新實現的部分。CF存儲卡的驅動可以直接使用標準的ATA/IDE設備驅動ide-cs模塊,因此在CSB226平臺上驅動CF存儲卡,只需要編寫PCMCIA控制器的驅動。
PXA225片上的PCMCIA控制器驅動的初始化函數為pxa_pcmcia_driver_init(),它調用底層PCMCIA接口函數初始化具體平臺上的插槽接口設備。這些底層函數是板級驅動與插槽驅動之間的標準接口,定義在結構體struct pcmcia_low_level中。CF卡驅動移植的主要工作就是實現pcmcia_low_level結構體中底層平臺相關的5個接口函數。pcmcia_low_level數據結構如下:
struct pcmcia_low_level {
int (*init)(struct pcmcia_init *);
int (*shutdown)(void);
int (*socket_state)(struct pcmcia_state_array *);
int (*get_irq_info)(struct pcmcia_irq_info *);
int (*configure_socket)(unsigned int, socket_state_t *);
};
l init函數,主要完成三個工作:執行平臺相關的初始化任務;設置所需要中斷信號的方向和邊緣觸發方式;注冊設備發現中斷與對應的中斷處理函數。
l shutdown函數,在卸載驅動時使用,用來釋放所申請的資源。
l socket_state函數,設置插槽的初始化狀態信息,完成對輸入參數所包含的數據結構struct pcmcia_state賦值,需要根據實際插槽的狀態信息正確設置此數據結構。
l get_irq_info函數,用來獲得每個插槽接口設備上的Ready中斷信號。
l configure_socket函數,由上層驅動調用,用來動態改變插槽的狀態,比如工作電壓VCC、可編程電壓VPP等。
將PCMCIA驅動程序成功編譯進內核后,還需要使用卡管理工具cardmgr監測CF卡設備,當CF存儲卡插入到CSB226開發板的插槽時,cardmgr會發現該設備并完成設備的加載。
4. 應用實例
在CSB226開發板上成功移植了ARM Linux后,可以進行多種應用開發,如:電子地圖查詢系統,娛樂游戲機等。本文在CSB226開發板上插入一塊基于Prism2芯片組的CF接口的無線網卡,由于已經成功驅動了CF接口,所以只需要將無線接入點程序Host AP編譯到ARM Linux內核中,再使用網橋工具將CSB226開發板自身的10MBit以太網和無線網絡橋接起來,這個開發板就可以作為一臺無線接入點工作了。
5. 結論
Linux操作系統在嵌入式設備中應用越來越廣泛。本文針對基于PXA255處理器的開發板進行了系統移植,闡述了移植中的關鍵技術,如:內核的修改、文件系統建立、設備驅動的移植,最后在開發板上實現了無線接入點。本文的移植過程對于其他類型微處理器上Linux的移植也具有參考價值。
本文作者創新點:基于CSB226開發板進行了ARM Linux操作系統的移植,對LCD和CF卡設備驅動的平臺相關部分進行了重寫。最后在開發板上實現了無線接入點的應用。
參考文獻:
[1] 毛德操, 胡希明. 嵌入式系統采用公開源代碼和StrongARM/XScale處理器[M]. 杭州: 浙江大學出版社, 2003. p. 61-63.
[2] CSB226 Block Diagram. http://www.cogcomp.com/datasheets/Visio-CSB226_disti. pdf, 2004.
[3] 許先斌, 熊慧君, 李淵, 楊芬. 基于ARM9的嵌入式Linux開發流程的研究[J]. 微計算機信息. 2006,11:87-90.
[4] JonathanCorbet, GregKroah-Hartman, AlessandroRubini. Linux Device Driver[M]. 第三版.O'Reilly Media,Inc. 2005.
評論