




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
《嵌入式與多核技術》課程設計報告題目:LED驅動的移植班級:通信本二學號:13405039姓名:周文敏同組人員:謝爽、彭義龍、葉盛、郭恒指導教師:年月日摘要目前,LED(LightEmittingDiode)的應用技術已經非常成熟,與LED相關的產品也走進了人們的日常生活中。在LED的使用早期,其主要用于指示,如交通信號燈和儀表的指示燈,但是在當前,基于嵌入式的LED驅動移植顯示屏和LED裝飾燈已經非常的普遍,故LED的應用已經進入到了一個新的領域。因此,針對不同應用的LED驅動也應運而生,一款功能豐富且操作簡單實用LED驅動對LED控制器的推廣尤為重要。在本課題中采用了ARM+Linux的嵌入式開發模式,控制器中使用的處理器是基于ARM920T核的S3C2440芯片,并以Linux2.6.30的操作系統作為軟件平臺。詳細的分析了DMX512舞臺燈光控制協議,最終,設計和完成了本文的嵌入式LED控制系統。本文首先從應用層、操作系統層和硬件層三個層面對嵌入式Linux系統的結構進行的簡要的分析。其次,對本課題中使用的DMX512控制協議進行了詳細的分析,然后設計了基于DMX512協議的LED控制器的系統框架,并給出了控制器各功能模塊的功能定義。其中將控制器系統劃分成了六個模塊單元:LED燈串部分、手動控制部分、LCD狀態顯示部分、SD卡數據讀寫部分、PC端在線調試部分和控制器軟件部分。最后,分別對各功能模塊涉及到的硬件電路和設備驅動進行了詳細分析和實現,并結合各功能模塊的實現完成LED控制器軟件系統的整體設計。在控制器的各個功能模塊設計過程中,采用了模塊化的設計方式,根據模塊的功能定義,設計了模塊的輸入和輸出接口,并結合控制器選用的硬件平臺,具體的實現了模塊的內部結構。控制器的軟件部分在系統的應用層實現,根據控制器的處理過程進行了詳細的劃分,并采用了多線程的編程模式,完成了控制器的軟件處理流程。同時,在應用層的程序開發屏蔽了底層硬件的實現細節,使系統具有較好的兼容性與擴展性1、緒論1.1課題研究背景和意義在過去的一百多年中,照明光源經歷了三個重要的階段:白熾燈、熒光燈、高強度氣體放電燈(HID),如今在照明界具有廣闊發展前景的LED光源被稱為第四代光源。LED作為新興的一種光源,具有壽命長、發光效率高、功耗低、啟動時間短、顯色指數高、工作溫度低、結構牢固、不怕震動、方向性好、工作電壓低、無紫外輻射、重量輕等顯著特點,是世界上最有發展潛力的新一代光源。而且LED光源可實現無汞化生產,對環境保護同樣具有重要意義。用半導體LED作為光源的固態照明燈,將會逐漸取代傳統的照明燈而進入各種應用領域LED關鍵應用技術受到LED控制驅動和產品的機電一體化設計問題的制約,而基于嵌入式的LED驅動移植,提高了LED產品的附加值和智能化水平。由于LED驅動移植提升LED燈的優良特性,使它在汽車站,機場,餐廳等公共場所得到廣泛應用,另一方面以LED為載體的LIFI將會進一步推動通信行業和互聯網業的發展。1.2.ARM和嵌入式的系統概述ARM是Advanced
RISC
Machines的縮寫,它既可以認為是一個公司的名字,也可以認為是對一類微處理器的統稱,還可以認為是一種技術的名字。ARM公司自己并不介入芯片的生產銷售,而是以IP核(知識產權核)的形式向各大半導體制造商出售技術授權,由于其設計的芯片核具有性能強、功耗低、成本低等顯著優點,因此獲得眾多的半導體廠商的大力支持,在32位嵌入式領域獲得了巨大的成功。目前,ARM微處理器已經深入到工業控制、無線通信、網絡應用、消費電子、成像和安全產品等各個領域采用RISC構架的ARM微處理器具有如下特性:(1)采用RISC構架的ARM微處理器具有如下特性(2)支持Thumb(16位)/ARM(32位)雙指令集,可以很好的兼容8/16位器件(3)帶有指令cache和數據cache,大量使用寄存器,指令執行速度更快(4)大多數的數據操作都在寄存器中完成(5)尋址方式靈活簡單,執行效率高(6)指令長度固定。隨著ARM公司發布了最新的Cortex-M/A構架的ARM核,ARM處理器的性能被提高到一個新的高度,同時功耗仍然保持較低的水平。后PC時代的到來,ARM處理器的應用范圍將會更加的廣泛電子工程師協會對嵌入式系統的定義為:嵌入式系統為控制、監視、輔助設備、機器或工廠運作的裝置。但是在多數網站和書籍中關于嵌入式系統的定義是:嵌入式系統是以應用為中心,以計算機技術為基礎,采用可裁剪軟硬件,適用于對功能、可靠性、成本、體積、功耗等有嚴格要求的專用計算機系統。嵌入式系統一般由4部分組成:嵌入式微處理器、外圍硬件設備、嵌入式操作系統和用戶應用程序,其體系結構如圖1.2所示。其中硬件平臺外圍硬件設備、嵌入式操作系統和用戶應用程序,其體系結構如圖1.2所示。其中硬件平臺統與通用操作系統的功能類似,為用戶應用程序屏蔽硬件底層的具體細節,提供一個透明的操作空間;用戶應用程序位于操作系統之上。嵌入式系嵌入式系統用戶應用程序嵌入式操作系統(如linux)軟件平臺嵌入式操作系統(如linux)軟件平臺微控制器的硬件平臺微控制器的硬件平臺圖1.2
嵌入式系統體系結構圖嵌入式系統是計算機技術、半導體技術、電子技術和各個行業具體應用相結合的產物,因此決定了它必將是一個技術密集,資金密集,廣泛應用,不斷創新的知識集成系統。與通用型的計算機系統相比,嵌入式系統具有以下軟硬件特性:(1)硬件特性
嵌入式系統通常是面向特定應用的,與通用型PC的硬件系統相比,它的硬件系統具有嵌入以下特性:a.
體積小、集成度高嵌入式系統采用“量體裁衣”的方式去除冗余,力爭采用最小的系統完成目標的功能,特別是在一些低功耗設備中更是如此b.面向特定的應用的設計通用PC機的硬件結構基本是一樣的,而具體的嵌入式系統硬件一般只適用某一個特定的應用,針對另一個應用一般需要重新設計硬件c.
低功耗、可靠性高。嵌入式系統的電磁兼容性比較好,抗干擾能力比較強,能在惡劣的環境下使用,即使死機也必須能在很短的時間重新啟動。總之,嵌入式系統的硬件必須高效率的設計,力爭在價格、功能、體積、功耗和性能上更具有競爭力(2)軟件特性
嵌入式系統的軟件是實現嵌入式系統功能的關鍵,它具有以下特性:a.軟件開發與硬件設計緊密相關。由于嵌入式軟件的開發是特定于具體的硬件平臺的,它往往牽扯到一些軟硬結合的部分,這就要求開發人員必須具備一定的硬件知識。b.嵌入式軟件要高質量、高可靠性,對軟件的大小有嚴格的要求。
由于嵌入式系統的硬件資源有限,內存空間非常寶貴,在嵌入式軟件開發的過程中必須時刻考慮軟件實際的運行效率,同時選用高質量的編譯工具。在實時的系統中,嵌入式軟件必須嚴格的處理各種異步發生的任務,這對程序的算法設計提出了很高的要求。此外,嵌入式軟件應具有足夠的異常處理能力和自恢復能力1.3
操作系統選擇隨著系統越來越大、程序功能越來越復雜,使用操作系統很有必要。當前,嵌入式領域可以選擇的操作系統有很多,且各具特點,應用場合也不同,因此選擇一個滿足需要、易于移植和擴展的操作系統是嵌入式系統開發需要考慮和解決的問題(1)VxWorksVxWorks是美國WindRiver公司開發的嵌入式實時操作系統,具有可裁剪的微內核結構、高效率的任務管理、靈活的進程通信機制、微秒級的中斷處理,廣泛的應用于對實時性要求較高的領域中,如航天、通信、軍事等。但是VxWorks支持的硬件平臺較少,源代碼不公開,開發和維護比較困難,授權費用較高。(2)WindowsCEWindowsCE是微軟專門為嵌入式設備開發的32位,多任務、多線程的操作系統。它支持多種架構的CPU,硬件支持良好,系統可靈活裁剪;應用程序開發、調試流程與PC機上Windows程序流程類似;但WindowsCE源代碼不開放,開發人員無法進行深度的定制;硬件資源需求大,授權費用較高。uC/OS-IIuC/OS-II是Micrium開發的實時操作系統內核,可用于8位、16位和32位處理器。它的結構可裁剪,對硬件資源需求較少,源代碼公開,實時性高,可擴展性強。但uC/OS-II僅是一個內核,它僅僅實現了任務調度、任務管理、內存管理和任務間的通信和同步等基本功能,其他額外的功能如網絡、文件系統等都要自己開發,或者購買軟件包來完成,對一個大的系統需要開發人員完成的工作太多、開發難度大嵌入式LinuxLinux是一個源代碼開放的類UNIX操作系統,使用時無需交納授權費用。內核可隨意裁剪、幾乎支持所有的32位、64位CPU;內核對硬件的支持十分完備,幾乎可以找到所有的硬件設備驅動;豐富的網絡支持;極高的穩定性;大量的開發工具、眾多的技術資料。嵌入式Linux幾乎繼承了Linux的全部優點被廣泛的應用于嵌入式產品開發。隨著Linux對硬件的支持不斷增加、體系結構日趨完善,嵌入式Linux系統的開發難度也在不斷降低。對以上幾種嵌入式操作系統的特點進行分析,綜合考慮后本設計選用嵌入式Linux系統。根據本設計的具體需要對Linux進行裁剪、移植,并針對硬件外設開發驅動程序。1.4圖形用戶界面開發平臺選擇圖形用戶界面(GUI)用于提高人機交互友好性和易操作性,極大的方便了非專業人士的使用,可以通過窗口、菜單等方便的操作計算機(包括嵌入式產品)。不同于PC系統,嵌入式系統對GUI系統有特殊的要求,如資源消耗少、性能強、可靠性高、可移植性強等。在嵌入式Linux操作平臺上,有各種各樣的GUI系統,目前最常用的有:MicroWindows、Qt/Embedded、MiniGUI、OpenGUI等。它們在接口函數、體系結構、功能特性等方面都各有特點。MicroWindows底層圖形接口直接使用Linux提供的幀緩沖機制來進行圖形顯示,不需要其它圖形系統的支持,使用C語言實現,采用了C/S體系結構,可移植性強。MicroWindows支持兩種API:類Win32
API和Nano-APIs,這些API兼容Win32和XWindow系統,方便從其它系統移植程序。但如今MicroWindows項目處于停滯狀態,圖形引擎的部分算法效率低下且無硬件加速能力,代碼質量參差不齊。(2)MiniGUI
使用現有成熟的圖形引擎,采用兼容WinCE的API,程序兼容性好,提供完備的多窗口和消息傳遞機制,占用資源少,穩定可靠,支持多種軟硬件平臺,可伸縮性強,擁有豐富的控件資源。但MiniGUI控件功能不夠豐富,使用C語言編寫,用戶擴展不方便,對于復雜的應用程序開發難度大OpenGUI基于一個使用匯編語言實現的X86圖形內核,運行速度很快。高層提供了C/C++編程接口,消息驅動API,功能強大,使用方便。在Linux上基于幀緩沖機制實現繪圖,穩定可靠。但OpenGUI圖形內核使用匯編語言實現,可移植性較差。Qt/Embedded
基于幀緩沖機制、面向嵌入式體統的Qt版本。界面美觀、色彩配比好,使用與Qt/Windows和Qt/X11一致的API,許多基于Qt的應用程序可以非常方便的移植到嵌入式系統;程序界面可以自由定制,結構分層,具有良好的可移植性,大量可用類庫,方便開發,程序本地化也很容易。使用Qt
Creator集成開發環境開發基于Qt/Embedded的應用程序十分簡便,但是應用程序占用的資源比較大。對比以上GUI系統,Qt/Embedded具有可視化界面開發工具,程序界面開發比較簡單,使得開發人員專注于應用程序功能的實現;同時Qt/Embedded有大量的官方和第三方提供的類庫,在這些類庫基礎上開發大大降低了開發難度和縮短了開發周期,因此本設計中選取Qt/Embedded為本系統的圖形用戶界面開發平臺。二、構建嵌入式Linux系統
2.1
構建嵌入式Linux系統概述從軟件角度可以將整個嵌入式Linux系統分為引導加載程序(BootLoader)、Linux內核、文件系統和用戶應用程序四個部分,其組成框圖如圖3.1所示嵌入式系嵌入式系統用戶應用程序文件系統文件系統Linux內核Linux內核引導加載程序引導加載程序圖3.1
嵌入式Linux系統組成框圖(1)引導加載程序引導加載程序就是系統上電后運行的第一段軟件代碼。通過這段小程序,可以初始化硬件設備、建立內存空間的映射圖,從而將系統的軟硬件環境帶到了一個合適的狀態,以便為最終調用Linux內核準備好正確的環境。Linxu內核Linux內核是Linux操作系統的靈魂,它負責系統軟硬件資源的管理,對上提供軟件編程接口屏蔽底層硬件細節,對下提供對硬件的抽象管理,此處的Linux內核是特定于嵌入式硬件的定制內核。文件系統文件系統內包含了Linux系統可以正常運行所需要的應用程序和庫等用戶應用程序
用戶應用程序指的是面向特定應用的程序,包括圖形界面應用程序和非圖形界面應用程序,它們都存儲在文件系統中。構建嵌入式Linux系統就是在系統硬件平臺上移植BootLoader、Linux內核和嵌入式Linux文件系統,整個過程大致可以分為五個步驟:建立開發環境,即交叉編譯環境。構建BootLoader。BootLoader是系統上電后運行的第一段軟件代碼,為加載操作系統和應用程序初始化軟硬件環境。構建Bootoader就是對BootLoader配置、移植和編譯,以滿足特定的硬件設備的需求。構建嵌入式Linux內核。嵌入式Linux內核是根據開發平臺資源對標準Linux內核配置、裁剪得來的。本系統采用的是Linux2.6版本的內核,根據開發平臺的硬件和具體應用的需求對內核加以裁剪和修改,以適應本系統軟硬件的特定需求。(4)構建嵌入式Linux文件系統。構建文件系統就是根據系統存儲設備介質、具體的應用需求等,選擇合適的文件系統格式,創建需要的目錄,實現系統命令,并往目錄中添加必需的配置文件、庫等。燒寫、調試系統。如果調試出錯,則需要重新配置,返回上述步驟(2)。2.2
建立開發環境嵌入式程序的開發過程與普通的PC程序的開發是有區別的,主要表現在程序的編輯、編譯與程序的運行不在同一硬件設備上,通常前者運行在嵌入式設備上,后者運行在PC機上;同時,嵌入式系統自身的軟硬件資源不足以用來開發軟件,所以需要使用交叉開發模式:在PC主機上編輯、編譯出針對嵌入式開發平臺的可執行程序,然后在目標平臺上運行、驗證程序。交叉開發模式如圖3.2所示。主機目標機JTAG運行程序編輯程序JTAG運行程序編輯程序編譯程序串口串口操作Bootloader/Linux操作Bootloader/Linux傳輸文件/NFS網絡傳輸文件/NFS網絡其他連接方式其他連接方式圖3.2
交叉開發模式建立基于ARM的嵌入式Linux開發環境主要包含以下兩個方面:(1)在開發主機上安裝發行版的Linux操作系統
許多個人、組織和企業開發了基于GNU/Linux內核的Linux發行版操作系統,如RedHat、Ubuntu和Fedora等,任何一種都可以用來開發。可以選擇在實際硬件上安裝,也可以選擇在虛擬機上安裝。為了方便使用Windows下我們已經熟悉的工具,本設計中使用Virtual
Box虛擬機來安裝Fedora9系統,并配置防火墻和其它的一些基本服務如tftp服務、samba服務、nfs服務等安裝交叉編譯工具鏈程序的編譯是在PC上進行的,如果使用宿主機Linux系統中默認安裝的gcc編譯工具來編譯程序,得到的二進制程序是for
X86的,而不是for
ARM的,它是不能在ARM平臺上運行,因此要使用交叉編譯工具鏈—它自己本身運行在X86平臺上,但它編譯出來的程序則運行在ARM平臺上。交叉編譯工具鏈由交叉編譯器(arm-linux-gcc)、供ARM平臺使用的C庫(glibc或uClibc)以及輔助的二進制工具binutils(包括arm-linux-readelf、arm-linux-objcopy等)組成。交叉編譯工具鏈可以自己制作,也可以使用網上別人制作好的,比如YAGARTO制作的交叉編譯器。這里我使用YAGARTO制作好了的工具鏈arm-2009q1-10-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2這是一個免費軟件,可以從網上下載。將下載好的工具鏈的壓縮包拷貝至Linux系統中,在該目錄下執行如下命令:tarvxzfarm-2009q1-10-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2-C/usr/local/toolchain這樣交叉編譯工具鏈就被解壓到/usr/local/toolchain/目錄下。在/etc/.bashrc文件中添加交叉編譯工具鏈的路徑信息,這樣交叉編譯工具鏈就安裝好了。2.3
構建BootLoader2.3.1
BootLoader概述簡單的說,BootLoader就是操作體統內核運行之前運行的一段小程序,它在系統上電時開始執行,初始化硬件設備、建立內存空間的映射圖,從而將系統的軟硬件環境帶到一個合適的狀態,為最終調用操作系統內核準備好環境由于BootLoader的實現依賴于CPU體系結構和具體的嵌入式外設的配置,所以大多數的BootLoader都分為stage1和stage2兩部分。依賴于CPU體系結構相關的代碼,例如設備初始化代碼等,通常放在stage1中,而且通常都是使用匯編語言實現,以達到短小精悍的目的。而與具體的嵌入式外設的配置相關的代碼通常放在stage2中,而且通常用C語言來實現,這樣不僅可以實現更復雜的功能,而且代碼會有更好的可讀性和可移植性。
(1)BootLoader的stage1完成的主要任務(以執行的先后順序)a.基本的硬件設備初始化。
b.復制stage2代碼到RAM中c.設置好堆棧指針SP。d.跳轉到stage2的C入口點。(2)BootLoader的stage2完成的主要任務(以執行的先后順序a.初始化本階段要使用到的硬件設備。b.加載內核鏡像。c.設置內核啟動參數。d.調用內核。
BootLoader的種類很多,比如X86上的LILO、GRUB等,
ARM上的U-Boot、Vivi等。它們各具特點。本設計中使用的是S3C2440芯片,U-Boot和Vivi是兩個不錯的選擇。Vivi是Mizi公司為三星公司的ARM構架CPU專門設計的,基本上可以直接使用,需要修改的地方很少,命令簡單方便,不過只支持串口下載,速度太慢。U-Boot支持大多數CPU,可以燒寫Yaffs、JFFS2等文件系統映像,支持串口下載、網絡下載,USB功能,并提供了豐富的命令,相較于Vivi,它的移植和使用更加的復雜,但是調試程序更為方便,所以本設計選用U-Boot。2.3.2
U-Boot修改和編譯U-Boot一直沒有添加對S3C2440的支持,移植一般都是采用U-Boot中的sbc2410或者smdk2410文件作為藍本來進行移植,所要做的就是針對S3C2440和S3C2410的不同,以及U-Boot支持的開發板硬件外設和本系統硬件外設的不同作相應的修改,并添加新的功能。大致的過程如下:(1)修改主目錄Makefile,添加如下內容:my2440_config
:
unconfig
//指定本設計硬件配置選項
@$(MKCONFIG)
$(@:_config=)
arm
arm920t
my2440
NULL
s3c24x0
修改Makefile,指定交叉編譯器:
CROSS_COMPILE
=
arm-linux-
//指定交叉編譯器(2)在board文件夾下創建my2440目錄及文件。在/board目錄中建立開發板my2440的目錄,并復制smdk2410目錄中的文件到此目錄,做適當修改,目的是以smdk2410為藍本,加快移植進度。cdboardmkdir-pmy2440cp-arfsamsung/smdk2410/*my2440/cdmy2440/mvsmdk2410.cmy2440.c修改my2440目錄下的Makefile文件:COBJS:=my2440.oflash.o(3)在include/configs/中建立開發板配置文件。以smdk2410的配置為藍本:cpinclude/configs/smdk2410.hinclude/configs/my2440.h(4)修改第一階段相關的代碼。①修改CPU頻率設置代碼。S3C2440和S3C2410的PLL的參數設置不一樣,在數據手冊中可以查到,將FCLK設為405MHz,分頻比為FCLK:HCLK:PCLK=1:4:8。修改cpu/arm920t/start.S中部分代碼如下:/*FCLK:HCLK:PCLK=1:4:8*/ldrr0,=CLKDIVNmovr1,#5strr1,[r0]//設置分屏比mrcp15,0,r1,c1,c0,0orrr1,r1,#0xc0000000mcrp15,0,r1,c1,c0,0//同步movr1,#CLK_CTL_BASEmovr2,#MDIV_405addr2,r2,#PSDIV_405strr2,[r1,#0x04]//設置FCLK頻率②修改SDRAM初始化參數。為了匹配本設計的存儲器配置,需要修改lowlevel_init.S文件。這個與SDRAM的參數有關,可以從芯片手冊查到,修改代碼如下:#defineREFCNT0459改為:#defineREFCNT1012(5)修改第二階段相關代碼。主要修改board/my2440/my2440.c文件。這個文件中的函數負責板級初始化的任務,修改的地方主要包括:屏蔽已不使用的NAND控制器初始化代碼、添加網卡芯片(DM9000)的初始化函數。(6)完善目標板外設驅動。這部分要修改的內容主要包括:NANDFLASH相關的代碼修改、添加對Yaffs2格式文件系統映像文件燒寫功能的支持、修改網絡相關代碼、添加USB設備驅動支持、添加SD卡讀取功能,修改代碼很多不再一一貼出。(7)修正配置文件。①添加CONFIG_S3C2440條件定義。對于S3C2440,很多代碼是使用S3C2410的,所以要在所有條件編譯中有CONFIG_S3C2410的地方添加CONFIG_S3C2440,這樣這些代碼才會被編譯進來。②修改配置文件include/configs/my2440.h。這部分要修改的內容包括:去除CS8900網卡的宏定義,添加DM9000的宏定義;使能對JFFS2、FAT文件系統的支持;使能USB、SD卡功能;(8)編譯。makecleanmakemy2440_configmake編譯完成后就生成可以燒寫到NANDFLASH的映像文件u-boot.bin。2.3.3U-Boot命令菜單的實現系統的開發過程中經常要通過U-Boot中的一些命令來往開發板FLASH上燒寫內核映像和文件系統映像,以便對內核和文件系統進行測試。每次都手工輸入不僅很容易出錯而且效率不高,所以本設計在開發的過程中實現了U-Boot的命令菜單。開發人員只要輸入字母選擇相應的菜單就可以讓U-Boot完成復雜的命令,從而極大的方便了嵌入式開發。U-Boot正常啟動后,會調用main_loop(void)函數,進入main_loop()之后,如果在規定的時間(配置文件中宏定義CONFIG_BOOTDELAY的值)內,沒有檢查到任何按鍵事件的發生,就會去加載操作系統,并啟動系統,比如把Linux內核壓縮鏡像從NANDFLASH中讀到SDRAM,然后執行它。如果在CONFIG_BOOTDELAY時間內,用戶按下鍵盤上的任意一個按鍵,U-Boot就會進入與用戶交互的狀態。如果用戶在配置文件中定義了CONFIG_SYS_HUSH_PARSER,就會通過parse_file_outer()函數,去接收并解析用戶命令,否則進入一個for(;;)循環中,通過readline(CONFIG_SYS_PROMPT)函數來接收用戶命令,然后調用run_command(cmd,flag)去解析并執行命令。這個命令菜單其實也是一個U-Boot中的命令,U-Boot啟動時,如果進入下載模式,就先運行這個命令。命令的執行內容就是通過串口打印出一個菜單,等待輸入數字,再執行相應的動作。命令菜單實現過程大致如下:(1)在common目錄下新建一個名為cmd_menu.c的文件,同時修改同目錄下Makefile文件,加入編譯選項。修改common目錄下Makefile文件添加如下內容:COBJS-$(CONFIG_CMD_MENU)+=cmd_menu.o(2)編寫cmd_menu.c的具體內容。①定義一個U-Boot的命令U_BOOT_CMD(menu,3,0,do_menu,"menu-displayamenu,toselecttheitemstodosomething\n","-displayamenu,toselecttheitemstodosomething");②編寫do_menu函數。intdo_menu(cmd_tbl_t*cmdtp,intflag,intargc,char*argv[]){menu_shell();return0;}③實現menu_shell()函數。menu_shell()函數主要的功能是通過串口打印命令菜單,然后等待用戶的輸入,根據用戶的輸入傳遞不同的參數給run_command來實現不同的操作。傳遞給ran_command的參數其實就是用戶在命令行模式下實現相同功能時輸入的命令的字符串的組合,流程圖如3.3所示。開始結束打印命令菜單是否有輸入數據?根據輸入數據傳遞不同參數給cmd_buf否是執行run_command(cmd_buf,0)函數圖3.3menu_shell流程圖(3)在U-Boot中調用menu命令。在main.c文件中main_loop函數中的abortboot(bootdelay)結束的位置面加入:#ifdefCONFIG_CMD_MENUrun_command("menu",0);#endif在include/configs/my2440.h加入如下代碼:#defineCONFIG_CMD_MENU1重新編譯U-Boot即可生成帶有命令菜單的u-boot.bin映像文件。2.4構建嵌入式Linux內核2.4.1Linux2.6內核簡介Linux內核的最初版本在1991年發布,是LinusTorvalds為他的386開發的一個類Minix的操作系統。此后借助于互聯網,經過全世界計算機愛好者的共同努力,如今已經成為世界上使用最多的一種類UNIX操作系統。2003年12月Linux2.6版本發布,在Linux2.4的基礎上作了極大的改進:a.支持更多的硬件平臺,從小規模的嵌入式設備到服務器級別的系統。b.使用新的調度器算法,進程的切換的效率更高。c.內核服務可以被搶占,使得用戶操作實時的響應更高。d.大幅度的修改I/O子系統,使得各種工作負荷下都有很好的響應性。e.對模塊子系統和文件系統進行了大量的改進。f.合并了uClinux的功能,以支持沒有內存管理單元(MMU)的CPU。2.4.2Linux2.6內核結構分析(1)Linux2.6內核源碼目錄結構[30-34]內核源碼可以從下載,ARM體系結構的內核源碼補丁可從.uk/developer獲得。內核源代碼其各目錄的功能,如下表3.1所示。表3.1Linux內核源碼頂層目錄說明目錄名描述arch包含和硬件體系結構相關的代碼,對于每種架構的CPU占一個相應的目錄,如arch/i386/、arch/arm/等。block塊設備驅動程序的通用函數。crypto常用加密和散列算法(如AES、SHA等),還有一些壓縮和CRC校驗算法。Documentation內核幫助文檔。drivers所有的設備驅動程序,每一類驅動程序對應一個子目錄,如char、block、net等。fs內核支持的各種文件系統,每一個子目錄對應一種文件系統,如fs/jffs2/、fs/ext2、fs/ext3等。include內核頭文件,與平臺無關的頭文件被放置在include/linux子目錄下,體系結構相關的頭文件放置在include/asm-xxx目錄下,還有各種驅動或功能部件的頭文件。init內核初始化代碼。ipc進程間通信相關的代碼。kernel內核的最核心部分,包括進程調度、定時器等,而和平臺處理器相關的一部分代碼放在arch/xxx/kernel目錄下。lib內核用到的一些庫函數代碼,與平臺處理器相關的庫函數代碼位于arch/xxx/lib/目錄下。mm體系結構無關的內存管理代碼,和平臺處理器相關的一部分代碼放在arch/xxx/mm目錄下。net網絡支持相關代碼,實現了各種常見的網絡協議,如TCP/IP、IPX等。scripts在配置內核時用到,存放了配置內核的一些腳本文件。security不同的Linux安全模式的代碼。sound音頻設備的驅動程序及其他聲音相關的代碼。usr實現了用于打包和壓縮的cpio等。對Linux內核的移植,主要是對體系結構相關的代碼進行修改,其它體系結構無關的代碼是通用的不用修改,對于本設計要修改的代碼大部分在arch/arm/目錄下。(2)Linux內核的組成部分Linux內核由進程管理(SCHED)、內存管理(MM)、進程間通信(IPC)、虛擬文件系統(VFS)和網絡接口(NET)5個子系統組成,如圖3.4所示。圖3.4Linux內核組成與關系①進程管理進程管理位于整個Linux內核的中心位置,內核中其它的子系統的工作都依賴它,因為每個子系統都需要掛起或恢復過程。進程管理控制多個進程對CPU的訪問,使得多個進程能在CPU中宏觀并行,微觀串行地執行。②內存管理內存管理的主要作用是控制多個進程安全的共享整個內存區域。當處理器支持MMU時,Linux內存管理完成進程虛擬地址到物理地址的轉換。③虛擬文件系統如圖3.5所示,虛擬文件系統(VFS)隱藏了各種文件系統的具體細節,為用戶空間的應用程序提供了統一的編程接口,提供了對數十種不同的文件系統的支持。VFS獨立于具體的文件系統,是對各種文件系統的一個抽象,方便了應用程序的編寫。應用程序虛擬文件系統VFSMinixExt2FAT設備文件用戶空間內核空間圖3.5Linux文件系統④進程間通信Linux支持進程間多種通信機制,如消息隊列、信號量、管道、共享內存等,這些機制可以協助多個進程、多資源的互斥訪問、進程間的同步和消息的傳遞。⑤網絡接口網絡接口實現了對各種網絡協議的存取和各種網絡硬件設備的支持。整個網絡接口子系統可分為網絡協議和網絡驅動程序兩部分。網絡協議部分實現網絡傳輸協議。網絡設備驅動程序負責與硬件設備通訊,為硬件設備提供相應的設備驅動程序。2.4.3Linux2.6內核移植本設計中的硬件核心電路和SMDK2440基本是一樣的,而linux2.6.32內核對于SMDK2440的支持已經十分豐富,所以大部分關鍵的移植基本很簡單,只需要根據目標平臺的差異作調整就可以了。移植過程大致如下[35][36]:(1)指定目標平臺和交叉編譯工具解壓Linux-.tar.bz2內核代碼壓縮包,進入內核代碼根目錄,修改根目錄下的Makefile:ARCH?=arm//指定目標平臺CROSS_COMPILE?=arm-linux-//指定交叉編譯工具(2)缺省配置內核內核配置選項有幾百個,配置者不可能一一手工配置,因此本設計在SMDK2440開發板配置的基礎之上進行修改,可以先輸入makes3c2410_defconfig,使用缺省的SMDK2440的內核配置文件。配置內核有四種方式:makeconfig(基于文本的傳統的配置界面,十分的繁瑣不推薦使用)、makemenuconfig(基于ncurses的配置界面)、makexconfig(基于QT的配置界面)、makegconfig(基于GTK+的配置界面)。本設計使用的是基于ncurses的配置界面。使用makemenuconfig進入圖形配置界面,如圖3.6所示,瀏覽基本配置。圖3.6內核配置主界面單擊SystemType-S3C2440Machines,如圖3.7所示。其中SMDK2440和SMDK2440withS3C2440CPUmodule已被選擇,表明編譯出來的內核將支持由S3C2440組成的開發板。此時編譯出的內核映像文件在本設計的硬件上是無法使用的,因為兩個目標平臺的硬件是有差別的。圖3.7S3C2440Machines配置(3)修改系統的時鐘頻率SMDK2440目標板上的晶振的頻率是16.9344Mhz,而本設計硬件上使用的是一個12MHz的晶振,所以要修改內核源碼中晶振的頻率。將arch/arm/mach-s3c2440/mach-smdk2440.c的第180行的s3c24xx_init_closks(16934400)改為s3c24xx_init_closks(12000000);(4)修改NANDFLASH分區表Linux已經自帶了大部分NANDFLASH驅動,在drivers/mtd/nand/nand_ids.c文件中,可以查看所支持的各種NANDFLASH類型。SMDK2440內核配置文件中的NANDFLASH分區表和本設計在移植U-Boot時劃分的分區表是不一致。如果不修改的話,Linux系統會因為無法掛載文件系統而無法啟動。修改arch/arm/plat-24xx/common-smdk.c文件,將109~150行改為如下所示。這樣一來,整個NANDFLASH被劃分為4個分區。第一個分區大小384KB,存放U-Boot;第二個分區大小128KB,存放參數;第三個分區大小5MB,存放Linux內核;第四個分區大小為剩余的NANDFLASH空間,存放根文件系統。staticstructmtd_partitionsmdk_default_nand_part[]={[0]={.name="U-Boot",.size=0x00060000,.offset=0,},[1]={.name="param",.offset=0x00060000,.size=0x00020000,},[2]={.name="Kernel",.offset=0x00080000,.size=SZ_5M,},[3]={.name="Rootfilesystem",.offset=0x00560000,.size=1024*1024*1024,},};(5)打上yaffs2補丁Yaffs是專門為嵌入式設備開發的一種文件系統,十分適合使用NANDFLASH作為存儲器的嵌入式設備。Linux源代碼中并不包含Yaffs文件系統代碼,所以要給內核打補丁使之支持Yaffs文件系統。yaffs1僅支持小頁(512byte/page)的NANDFLASH,yaffs2支持大頁的NANDFLASH。本設計中使用的NANDFLASH是大頁的所以要給內核打上yaffs2文件系統補丁。從http://www.aleph1.co.uk/gitweb?p=yaffs2.git;a=summary可以下載到最新版本的yaffs2源代碼。下載完成后使用tar命令解壓壓縮包,然后進入yaffs2源代碼目錄執行,并在終端中運行:cdyaffs2./patch-ker.shc/linux/kernel/linux-這樣就為Linux內核打上了yaffs2補丁。此時進入內核源代碼中fs/目錄內,可以看到已經多了一個yaffs2目錄。(6)配置并裁剪內核經過以上幾步的移植,現在編譯出的內核映像已經可以正常工作了,但是現在內核中一些功能并不是本設計需要的,同時本設計所需要的一些功能內核還不包含,所以要對Linux杭州電子科技大學碩士學位論文26內核配置、裁剪以適應本設計的具體的需要。表3.2是輸入makemenuconfig后,出現在內核配置主菜單界面上的選項說明。表3.2內核配置主界面選項說明選項名說明Codematurityleveloptions選中則使開發中的或者未完成的代碼出現在配置選項中,這樣就可以顯示更多的配置選項Generalsetup常規雜項設置Blocklayer塊設備層:用于設置塊設備的一些具體參數(比如對大容量塊設備的支持,設置塊設備的調度器等)。一般使用默認值就可以了。SystemType系統類型:選擇CPU構架、開發板類型等開發板相關的配置選項BussupportPCMCIA/CardBus總線的支持,不用設置KernelFeature用于設置內核的一些參數,比如是否支持內核搶占,是否支持動態修改系統時鐘等Bootoptions用于設置內核的啟動參數:比如設置默認的命令行參數等,一般不需要修改Floatingpointemulation浮點運算仿真功能,目前Linux不支持硬件浮點運算,所以要選擇一個浮點運算仿真器,一般選擇NWFPEmathemulation選項Userspacebinaryformats可執行文件格式,一般選擇ELF格式Powermanagementoptions電源管理選項Networking網絡協議選項:一般都選擇Networkingsupport選項以支持網絡功能,選擇Packetsocket選項,以支持rawsocket接口功能,選擇TCP/IPnetworking選項以支持TCP/IP網絡協議。通常在選擇Networkingsupport選項后使用默認配置DeviceDrivers設備驅動程序:幾乎包含Linux所有的驅動程序Filesystems文件系統Profilingsupport對系統的活動進行分析,僅供內核開發者使用Kernelhacking調試內核時的各種選項Securityoptions安全選項,一般使用默認選項Cryptographicoptions加密選項Libraryroutines庫子程序:例如CRC32檢驗函數、zlib壓縮函數等。不包含在內核源代碼中的第三方內核模塊可能需要這些庫,可以全不選,若內核中其他部分依賴它,會自動選上在配置界面上對Linux進行配置時,對于[]選項可以按下Y鍵或者使用空格鍵,使括號中出現*號,這個選項就會編譯進內核,N鍵或者使用空格鍵使括號中為空白,這個選項就不會被編譯;對于<>選項除了可以像[]選項那樣來配置,也可以使用M鍵或者空格鍵,使這個選型編譯為模塊(該選項的功能模塊并不會編譯進入內核鏡像,但是會單獨形成一個擴展名為.ko的文件。該文件就被稱為模塊,模塊可以在操作系統啟動后通過“insmod模塊文件名”將其加載進內核),以減小內核大小。通過makemenuconfig對內核進行配置和裁剪,使得最終的內核盡量小,并實現支持如下功能:(1)NANDFLASH驅動;(2)對ELF格式的應用程序的支持;(3)串口驅動;(4)ramdisk(將內存當做硬盤使用);(5)模塊的動態加載和動態卸載(6)SD卡驅動;(7)USB鍵盤、鼠標驅動;(8)支持將目錄掛載到內存(將內存當做目錄使用);(9)能夠識別U盤、SD卡的FAT分區和NTFS分區上的中英文文件;(10)看門狗驅動;(11)DM9000驅動;(12)TCP/IP協議棧;(13)NFS客戶端的支持;(14)NFS文件系統;(15)Yaffs2文件系統。(16)內核映像文件uImage內核配置、裁剪完成后,執行makezImage命令,會在內核源碼的arch/arm/boot/目錄下生成名為zImage的映像文件。uImage是在原來的zImage映象文件的前面加上一個0x40H字節的頭,記錄參數所指定的信息,這樣U-Boot才能識別這個映像文件是針對哪個CPU體系結構的,哪個OS的,哪種類型,內存加載的位置,內存入口點的位置以及映像名是什么。使用在移植U-Boot的時候生成的mkimage二進制文件來制作uImage內核映像文件。進入zImage所在目錄,并在終端中運行:mkimage-Aarm-Olinux-Tkernel-Cnone-a30008000-e30008000-nlinux--d./zImage./uImage這樣就生成了U-Boot可以使用的內核映像文件uImage。2.5構建嵌入式Linux文件系統2.5.1嵌入式文件系統概述由于嵌入式系統軟硬件資源與傳統的PC機有很大的不同,所以嵌入式系統對文件系統有著特定的要求[23]:在對文件進行頻繁的操作(例如新建、刪除、復制)下可以保持較高的讀寫性能和較低的碎片化。在保持數據的完整性的情況下,盡量減少對系統資源的消耗。大部分嵌入式系統使用FLASH作為存儲介質,但是FLASH的擦除次數是有限的,所以為了延長FLASH的使用壽命,文件系統應盡量減少對FLASH的寫入操作,同時寫入操作應盡量均勻分布在整個FLASH上。嵌入式Linux中常用的幾種文件系統特點如表3.3所示。表2.3入式Linux常用文件系統文件系統特點RomFS可以存放在ROM空間,也可以存放在系統的RAM中;RomFS是只讀的文件系統,所以系統同時需要支持虛擬盤(RAMDISK)來存放臨時文件和數據文件,掉電后數據丟失;RomFS相對簡單、占用空間較少。CRAMFSCRAMFS中數據被壓縮,屬于只讀文件系統,不能在閃存中修改;CRAMFS會把數據傳送到RAM,用戶從RAM中讀取,修改后的數據保存在RAM中,一旦掉電修改過的數據全部丟失;提供了更好的閃存管理方式;啟動時間隨FLASH容量增長;FLASH容量越大日志占用RAM較大。由于本設計中使用NANDFLASH作為存儲設備,從以上幾種文件系統的特點分析可以看出Yaffs比較適合本系統,因此本設計中采用Yaffs文件系統,前面移植Linux內核時已經添加了對Yaffs2文件系統的支持。2.5.2Linux文件系統目錄結構為了防止Linux系統文件放置混亂,人們定義了文件系統層次結構標準(FHS)。FHS規定了Linux操作系統中的主要目錄及目錄存放的內容,雖然它并不是一個強制的標準,但是大多數的Linux發行版本都遵循。FHS標準目錄結構如表3.4所示[23]。表2.4FHS標準目錄結構目錄名存放內容/bin必備的用戶命令,例如ls、cp等/sbin必備的系統管理員命令,例如ifconfig、reboot等/dev該目錄存放設備文件和其他特殊文件,例如mtdblock0、tty0等/etc存放系統配置文件,包括啟動文件,例如inittab等/lib存放共享庫和可加載模塊,例如C鏈接庫、內核模塊/home普通用戶的主目錄,包括供服務賬號使用的主目錄,如FTP等/rootroot用戶的主目錄/usr/bin非必備的用戶程序,例如find、du等/usr/sbin非必備的管理員程序,例如chroot、inetd等/usr/lib應用程序安裝的庫文件,應用程序運行時會調用/var存放可變數據,例如日志文件/proc用于提供內核與進程信息的虛擬文件系統proc文件系統的掛載點/sys用于提供內核與設備信息的虛擬文件系統sysfs文件系統的掛載點/mnt用于臨時掛載某個文件系統的掛載點/tmp存放臨時文件,通常是臨時文件,重啟后將自動消除2.5.3嵌入式Linux文件系統制作制作嵌入式Linux文件系統就是要建立表3.4中的目錄,并在其中填充相應的目錄內容,其過程大體包括[35][36]:(1)建立文件系統所需要的目錄建立一個名為rootfs的目錄:mkdirrootfs進入/linux/rootfs目錄,并創建以下目錄:cdrootfsmkdirbinetcdevhomelibmntoptprocrootsbinsystmpusrvarjffs2允許在閃存中直接進行修改;日志文件系統;數據壓縮方式和CRAMFS一樣;數據可存放在全部的閃存區域中,數據的寫入和刪除分布較均勻;提供了更好的崩潰、掉電安全保護。Yaffs專門為NANDFLASH設計的日志文件系統,提供磨損平衡和掉電恢復;適合大容量的NANDFLASH;相對jffs2文件系統同等容量的FLASH,Yaffs需要的RAM空間要小很多;(2)編譯、安裝Busybox在/bin、/sbin、/usr/bin、/usr/sbin目錄下存放的主要是一些常用命令的二進制文件。如果自己編寫或者移植這幾百個常用的命令源程序不僅非常困難,而且占用的的空間很大。Busybox是一個遵循GPLv2協議的開源項目,它將眾多的UNIX命令進行優化,集成進一個很小的可執行文件中。雖然Busybox中各種命令提供的選項較桌面Linux相應命令少,但是可以滿足嵌入式系統中的應用。①從/downloads/下載busybox-1.18.3.tar.bz2這個壓縮包,將源碼放到Linux的根目錄中,解壓:tarjvfBusybox-1.18.3.tar.bz2②進入源碼目錄,修改Makefile文件CROSS_COMPILE?=arm-linnux-ARCH?=ARM③配置BusyBoxBusyBox的配置的方式和Linux內核的配置方式基本相同,執行makemenuconfig進入busybox的圖形配置界面,如圖3.8所示。圖3.8Busybox配置界面配置選項中的大部分內容都保持默認就可以了,只需配置Busybox中對dev下設備類型的支持和默認安裝目錄。LinuxSystemUtilities>[*]Support/etc/mdev.conf[*]Supportcommandexecutionatdeviceaddition/removalInstallationOptions>(./_install)Busyboxinstallationprefix配置完成后,選擇<EXIT>按回車鍵,提示是否保存配置,選擇<Yes>,按回車,將配置保存為.config文件。④編譯安裝make&&makeinstall完成以后會在busybox主目錄下生成_install目錄,里面包含三個目錄和一個文件:/bin、/sbin、/usr、linuxrc。把這些文件全部復制到建立好的rootfs目錄下。(3)建立動態鏈接庫因為動態鏈接的應用程序的運行需要使用C庫函數,所以光有應用程序(命令)是不行的,必須制作ARM可以使用的C庫,并將其放置于根文件系統的lib目錄內。C庫可以自己交叉編譯C庫源碼來生成,也可以使用交叉編譯工具鏈中包含的C庫。本設計中使用交叉編譯工具鏈中的C庫,只需要復制到根文件系統下lib目錄就可以了。交叉工具鏈中的C庫文件總大小為29MB,應用程序并不需要所有的庫函數,所以可以復制需要的就可以了,這樣可以節省系統中寶貴的存儲空間。(4)建立/etc目錄下的配置文件etc目錄下存放的是系統程序的主配置文件,需要哪些配置文件取決于要運行哪些系統程序。即使是最小的系統也一定會運行1號用戶進程init,所以至少要編寫init的主要配置文件inittab,該配置文件決定了init進程要啟動哪些子進程以及如何啟動這些子進程。①建立/etc/mdev.conf文件,內容為空。②拷貝主機etc目錄下的passwd、group、shadow文件到etc目錄下。③修改etc/inittab文件,內容如下:#etc/inittab::sysinit:/etc/init.d/rcSconsole::askfirst:-/bin/sh::ctrlaltdel:/sbin/reboot::shutdown:/bin/umount-a–r④修改etc/fstab文件,該文件中定義了文件系統的信息,利用它來對系統啟動時mount-a命令行為控制,內容如下:#devicemount-pointtypeoptiondumpfsckorderproc/procprocdefaults00tmpfs/tmptmpfsdefaults00sysfs/syssysfsdefaults00mdev/devramfsdefaults00⑤修改etc/init.d/rcS文件,該文件列出了系統啟動時要執行的命令,內容如下:#!/bin/sh杭州電子科技大學碩士學位論文31PATH=/sbin:/bin:/usr/sbin:/usr/binrunlevel=Sprevlevel=Numask022exportPATHrunlevelprevlevelmount-aecho/sbin/mdev>/proc/sys/kernel/hotplugmdev-s/bin/hostname-F/etc/sysconfig/HOSTNAME新建etc/sysconfig目錄,在里面新建一個名為HOSTNAME的文件,編輯文件的內容為zhf2440。⑥修改etc/profile文件,內容如下:#Ashprofile#vim:syntax=sh#Nocorefilebydefaults#ulimit-S-c0>/dev/null2>&1USER="id-un"LOGNAME=$USERPS1='[\u@\h=W]#'PATH=$PATHHOSTNAME='/bin/hostname'exportUSERLOGNAMEPS1PATH(5)創建設備節點在/dev目錄下,創建兩個設備節點:mknodconsolec51mknodnullc13如果文件系統中沒有這兩個設備節點,系統啟動時會提示找不到控制臺,而無法進入文件系統。(6)制作文件系統映像文件最后將文件系統目錄打包為yaffs2映像文件,以供使用BootLoader將其燒寫到NANDFLASH中。yaffs2源代碼的目錄下的utils目錄中包含有制作yaffs2映像文件所需要的工具的源代碼mkyaffs2image.c。編譯mkyaffs2image.c這個文件,生成mkyaffs2image可執行文件并復制到宿主機/usr/bin目錄下。在文件系統主目錄外,使用命令mkyaffs2imagerootfsrootfs.img即可生成yaffs2格式的文件系統映像文件rootfs.img。三、Linux設備驅動程序開發設備驅動是應用程序和硬件之間的紐帶,它使得應用程序能通過系統調用與硬件設備通信。設備驅動直接與底層硬件打交道,根據硬件設備的具體工作方式來讀寫設備寄存器,完成設備的輪詢、中斷處理、DMA通信,進行物理內存向虛擬內存的映射,最終使通信設備能夠收發數據,使顯示設備可以顯示圖文,使存儲設備可以記錄數據文件[30]。在沒有操作系統的情況下,設備驅動的結構完全取決于程序員的設計。而在有操作系統的情況下,驅動程序的結構必須符合操作系統中定義框架,這樣驅動程序才可以正常的工作。3.1Linux設備驅動概述Linux設備驅動可以直接編譯進內核,也可以作為模塊在使用時動態加載。驅動程序直接編譯進內核隨著內核啟動加載,運行效率高,不過內核變得比較大,而且當對設備驅動進行修改時需要重新編譯內核。動態加載在需要的時候才把驅動模塊加載進內核,減小了內核的體積,對于驅動程序的修改、測試也十分便利,不用每次都重新編譯內核。現實世界中存在大量的設備,這些設備在電氣特性和I/O方式上各不相同。為了簡化設備驅動開發人員的工作,Linux系統從這些各異的設備中提取出了共性的特征,將其劃分為三大類:字符設備、塊設備和網絡設備。(1)字符設備字符設備是指像字節流一樣順序訪問的設備(如鼠標、觸摸屏等),由字符設備驅動程序來實現這種特性。大多數字符設備只能順序訪問數據,不能前后移動訪問指針。用戶應用程序通過/dev目錄下的字符設備文件節點來訪問字符設備文件。字符設備驅動程序通常至少需要實現open、close、read和write等系統調用所對應的、對硬件進行操作的功能函數。(2)塊設備塊設備通常按照塊為單位來訪問數據,比如FLASH上的數據就是以頁為單位存取。用戶應用程序對塊設備的訪問也是通過/dev目錄下的塊設備文件節點來訪問。塊設備和字符設備的區別僅僅在于內核內部管理數據的方式,也就是內核和驅動程序的接口不同,對用戶而言這兩類設備是沒有差別。(3)網絡設備不同于字符設備和塊設備,網絡設備在/dev目錄下并不存在對應的設備文件節點,而是通過單獨的網絡接口(eth0、eth1)來代表,而且內核調用一套與數據包傳輸相關的函數和網絡設備之間通信。內核針對每一類設備都提供了對應的驅動模型框架,包括基本的內核設施和文件系統接口。這樣驅動開發人員在編寫某類設備驅動時,就有一套完整的驅動模型框架可以使用,從而可以將大量的精力放在設備本身的操作上。設備文件是文件系統上的一個節點,是一種特殊的文件。一個設備文件代表一個設備。設備文件一般存放在/dev目錄下,可以使用mknod命令創建,也可以配置文件系統和內核來自動創建。設備文件有主、次設備號與之相關聯。主設備號與驅動進行關聯,次設備號與具有相同驅動的不同物理設備關聯。設備文件是用戶應用程序和設備驅動之間的接口,應用程序一般只能通過設備文件來使用設備驅動的功能。應用程序與設備驅動的關系如圖4.1所示。當用戶程序使用文件系統接口函數open()打開一個設備文件時,操作系統獲知應用程序想操作的設備的設備號,而操作系統內部將設備號與物理設備及其驅動進行了綁定,因此操作系統知道應該調用哪個驅動來控制這個設備。此后應用程序調用read()、write()、ioctl()等函數時,操作系統都會調用驅動程序中相應的接口函數來完成對應的功能。openreadwriteioctl??調用其他庫函數執行系統調用進入內核其他庫函數實現系統調用的異常處理其他處理openreadwriteioctl??庫內核驅動程序、應用程序、硬件設備圖4.1應用程序與設備驅動的關系Linux下驅動程序的開發不僅要了解硬件工作原理,而且要弄清楚現有的驅動程序的框架,在這個框架中適合的地方加入對硬件的具體操作,同時注意多任務并發控制和同步。Linux設備驅動程序的編寫流程大致如下[20]:(1)查看電路原理圖、芯片數據手冊,了解設備的工作原理、操作方法;(2)在內核驅動程序中查找相近的驅動程序(比如設備類型相同、兼容型號設備、使用相同的總線、有相同的操作時序),以它為模板進行開發,有時從零開始;(3)實現驅動程序的初始化和卸載函數,如向內核注冊和注銷這個驅動程序;(4)設計、實現內核驅動框架所需要的接口函數,比如open、close、read、ioctl等函數;(5)實現中斷服務函數(中斷并不是每個設備驅動程序所必須的);(6)編譯該驅動程序(直接編譯到內核中或者編譯成模塊使用insmod命令加載);(7)測試驅動程序;3.2Linux設備模型最初Linux中引入設備模型是為了電源管理,建立一個全局的設備樹(devicetree),當系統進入休眠時,系統可以通過這棵樹找到所有的設備,隨時讓他們掛起(suspend)或者喚醒(resume)。隨著內核體系結構的不斷完善,設備模型的功能不斷增強,2.6版內核設備模型提供的功能有:電源管理和系統關機。設備模型建立一個全局的設備樹,使得系統以正確的順序遍歷系統設備,完成對設備電源管理,以合理的順序關機。與用戶空間通信。系統利用設備模型建立sysfs虛擬文件系統,向用戶空間提供系統信息,以及改變設備參數的接口。設備熱插拔。內核中的熱插拔機制可以處理熱插拔設備,特別是能夠與用戶空間進行關于熱插拔設備的通信,而這種機制也是通過設備模型管理的。設備類型。將設備分類有助于設備的管理與使用,如要找USB鼠標,只要去sysfs虛擬文件系統classes/input/里去找就可以了,而不必關心這個鼠標是接到哪個USB主機控制器的哪個Hub的第幾個端口上。對象生命周期。內核管理對象的工作更為復雜,得有一個好的機制來實現設備生命周期的管理。比如把USB鼠標拔了之后,全局設備樹和sysfs里面得相應去掉。Linux設備模型是一個十分復雜的體系結構,一般在編寫設備驅動程序的時候通常不會用到這方面的知識,因為Linux內核提供的驅動模型框架隱藏了設備模型的概念。理解這部分內容對于驅動開發人員理解Linux設備驅動的結構是很有幫助的。本文僅對設備模型的底層模型和上層容器兩部分進行簡單介紹。3.2.1底層模型kobject、kset和kobj_type這三個數據結構組成了設備模型的底層模型。設備模型中的每一個元素都對應一個kobject和kset,kobj_type是kobject在層次結構和屬性結構方面的擴充,三者之間的關系如圖4.2所示[39-41]。其中所有被包含的kobject實際上是被嵌入到其它類型中,甚至是其它的kset;一個kobject的父節點不一定是包含它的kset。ksetkobjectksetkobjectkobjectkobjectkobject??kobj_typekset鏈表kobject->ksetkobject->parentkobject->ktype圖4.2kobject、kset和kobj_type關系圖(1)kobjectkobject是組成設備模型的基本結構,類似于面向對象語言中的基類,它被嵌入到更大的對象中,如bus_type、devices、device_driver等。最初它只是用于一個簡單的引用計數,但是隨著時間的推移,它的任務越來越多,因此也有了許多成員,它的結構體如下:structkobject{constchar*name;structlist_headentry;structkobject*parent;structkset*kset;structkobj_type*ktype;structsysfs_dirent*sd;structkrefkref;unsignedintstate_initialized:1;……};name指向設備的名字;entry,parent,kset用來形成樹狀結構的指針;structkobj_type*type用來表示該kobject的類型;structsysfs_dirent類型的指針指向了該kobject在sysfs中的目錄實體,sysfs中每一個目錄都會對應一個sysfs_dirent結構;每個在內核中注冊的kobject對象都對應于sysfs中的一個目錄。內核源碼/Lib/Kobject.c文件中提供了接口函數對kobject結構體進行操作。(2)ksetkset是相同類型的kobject的集合。kobject相當于樹中的葉子節點,kset類似于內節點,兩者連接形成樹狀結構。kset結構體如下:structkset{structlist_headlist;spinlock_tlist_lock;structkobjectkobj;structkset_uevent_ops*uevent_ops;};list是kset中所有的kobject組成的雙向循環鏈表的鏈表頭;list_lock是對kset中的kobject遍歷時的鎖;kset數據結構內嵌了一個kobject對象(由kobj表示),所有屬于這個kset的kobject對象的parent域均指向這個內嵌的對象。uevent_ops是kset對kobject熱插拔事件處理的操作函數集合。內核源
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 應急與事故管理制度
- 弱電hse管理制度
- 影院使用及管理制度
- 微型消防站管理制度
- 心理功能室管理制度
- 快遞公司誰管理制度
- 念佛堂機構管理制度
- 患者自費藥管理制度
- 慢病篩查與管理制度
- 成都劇本殺管理制度
- GB/T 1695-2005硫化橡膠工頻擊穿電壓強度和耐電壓的測定方法
- 土木工程施工課程設計完整版
- NB∕T 33009-2021 電動汽車充換電設施建設技術導則
- 檢修質量管理培訓課件
- 幼兒園安全教育《防溺水》課件
- 《走進民間音樂》資料
- 螺桿冷水機組使用說明書
- 2021年北京首通智城科技創新有限責任公司招聘筆試試題及答案解析
- 實習證明模板10篇
- 國開期末考試《建筑制圖基礎》機考試題及答案(第A-1套)
- 越南語基礎實踐教程1第二版完整版ppt全套教學教程最全電子課件整本書ppt
評論
0/150
提交評論