LX800在車載監(jiān)控系統(tǒng)中的應(yīng)用
掃描二維碼
隨時(shí)隨地手機(jī)看文章
摘要:隨著嵌入式Linux操作系統(tǒng)的迅速發(fā)展,嵌入式Linux已逐漸成為嵌入式操作系統(tǒng)的一個(gè)重要分支。介紹了LX800在車載監(jiān)控系統(tǒng)中的應(yīng)用,實(shí)現(xiàn)了CAN總線實(shí)時(shí)數(shù)據(jù)和視頻的顯示和控制。主要闡述了x86系統(tǒng)平臺(tái)的硬件總體設(shè)計(jì)、PCI9054驅(qū)動(dòng)的實(shí)現(xiàn)及應(yīng)用主程序相關(guān)流程。
關(guān)鍵詞:嵌入式Linux;LX800;PCI9054
引言
嵌入式系統(tǒng)由于體積小、功耗低、可靠性高、可裁減性強(qiáng)、軟硬件集成度高等特點(diǎn)的被廣泛地應(yīng)用于工業(yè)制造、過程控制、通信、儀器、儀表、汽車、船舶、航空、航天、消費(fèi)類產(chǎn)品等眾多領(lǐng)域。一個(gè)完整的嵌入式Linux解決方案應(yīng)包括嵌入式Linux操作系統(tǒng)內(nèi)核、運(yùn)行環(huán)境、圖形化界面和應(yīng)用軟件等。由于嵌入式設(shè)備的特殊要求,嵌入式Linux解決方案中的內(nèi)核、環(huán)境、GUI等都與標(biāo)準(zhǔn)Linux有很大不同,其主要挑戰(zhàn)是如何在狹小的Flash、ROM和內(nèi)存中,實(shí)現(xiàn)高質(zhì)量的任務(wù)實(shí)時(shí)調(diào)度、圖形化顯示、網(wǎng)絡(luò)通信等功能。本文基于AMD LX800微處理器和Linux操作系統(tǒng)進(jìn)行車載監(jiān)控系統(tǒng)的設(shè)計(jì)。車載監(jiān)控系統(tǒng)是對(duì)車輛工作狀態(tài)、運(yùn)行情況進(jìn)行顯示、控制并完成人機(jī)交互的系統(tǒng),實(shí)現(xiàn)系統(tǒng)實(shí)時(shí)響應(yīng)操作、顯示相關(guān)的機(jī)車信息。
1 系統(tǒng)硬件設(shè)計(jì)
GeodeLX處理器是AMD公司推出的基于x86體系結(jié)構(gòu)的嵌入式處理器,主要用于工業(yè)控制、移動(dòng)設(shè)備等領(lǐng)域。GeodeLX處理器支持i586指令集,并且?guī)в蠱MX和AMD“3DNow!”指令集擴(kuò)展;其CPU頻率在400~500MHz,帶有8級(jí)單發(fā)射的指令流水線,64 KB指令L1Cache和64 KB數(shù)據(jù)L1 Cache,128 KB的可配置為指令或數(shù)據(jù)的L2 Cache。處理器內(nèi)部集成了圖形和視頻處理單元,提高了二維圖形和視頻的應(yīng)用加速。
PCI總線即外圍部件互連總線,是一種先進(jìn)的高性能32/64位地址/數(shù)據(jù)復(fù)用局部總線,可同時(shí)支持多組外圍設(shè)備,并且不受制于處理器,為處理器與高速外圍設(shè)備提供了一座溝通的橋梁,提高了數(shù)據(jù)吞吐量(32位最大可達(dá)132 MB/s),因此是現(xiàn)在PC領(lǐng)域中很流行的總線。P CI總線具有嚴(yán)格的總線規(guī)范,保證了良好的兼容性,符合PCI總線規(guī)范的擴(kuò)展卡可以插入任何PCI系統(tǒng)可靠地工作。因此,和GeodeLX處理器一起使用的CS5536芯片通過PCI總線組提供南橋的功能,如IDE、USB2.0、Flash、AC97和x86的外圍設(shè)備接口。
為了擴(kuò)展一些用戶接口,如高速串口、CAN總線接口等,需要將復(fù)雜的PCI總線接口轉(zhuǎn)換為相對(duì)簡單的用戶接口。本系統(tǒng)采用PLX公司生產(chǎn)的PCI總線通用接口芯片PLC9054,處理器可以通過PCI總線訪問擴(kuò)展資源,如CAN總線、液晶屏數(shù)據(jù)線、按鍵高速串口等其他擴(kuò)展設(shè)備。此款芯片采用先進(jìn)的PLX數(shù)據(jù)管道結(jié)構(gòu)技術(shù),符合PCIV2.1和V2.2規(guī)范;提供了兩個(gè)獨(dú)立的可編程DMA控制器;每個(gè)通道均支持塊和分散/集中的DMA方式;在PCI總線端支持32位數(shù)據(jù)總線,33 MHz時(shí)鐘信號(hào);本地端可以編程實(shí)現(xiàn)8/16/32位的數(shù)據(jù)寬度;傳輸速率最高可達(dá)132 MB/s;本地總線端時(shí)鐘最高可達(dá)50 MHz,支持復(fù)用/非復(fù)用的32位地址數(shù)據(jù)。PCI9054提供了PCI、LOCAL、EEPROM總線3個(gè)接口,作為一種橋接芯片在PCI總線和LOCAL總線之間提供傳遞消息。
W83627DHG通過LPC接口與CS5536通信,此款LPC接口的I/O芯片除了可以支持傳統(tǒng)的輸入/輸出接口,如鍵盤和鼠標(biāo)、并口、軟盤口、UART、SPI口等,硬件監(jiān)控針對(duì)新一代的CPU,提供符合VRD11.0規(guī)格的CPU電壓偵測功能,并且可經(jīng)由鍵盤任一按鍵或是鼠標(biāo)將系統(tǒng)由休眠狀態(tài)喚醒。
BIOS實(shí)際是一組被固化到電腦中,為電腦提供最基本的硬件控制的程序,它是連通軟件程序和硬件設(shè)備之間的樞紐,負(fù)責(zé)響應(yīng)硬件的即時(shí)要求,并按軟件對(duì)硬件的操作要求執(zhí)行。本設(shè)計(jì)BIOS芯片采用LPC Flash可擦寫芯片。
系統(tǒng)的整體硬件結(jié)構(gòu)如圖1所示,系統(tǒng)由處理器、外圍電路及外圍接口設(shè)備組成。外圍電路包括晶振、電源、復(fù)位電路、串口、網(wǎng)口、PCI總線、USB接口、Flash等。
[!--empirenews.page--]
2 系統(tǒng)軟件設(shè)計(jì)
Linux采用統(tǒng)一的框架對(duì)硬件進(jìn)行管理,從一個(gè)硬件平臺(tái)到另一個(gè)硬件平臺(tái)的改動(dòng)與上層應(yīng)用無關(guān)。Linux可以隨意地配置,不需要任何許可證或與商家的合作關(guān)系,源代碼可以免費(fèi)得到,這使得采用Linux作為操作系統(tǒng)不會(huì)遇到任何關(guān)于版權(quán)的糾紛。Linux本身內(nèi)置網(wǎng)絡(luò)支持,而目前嵌入式系統(tǒng)對(duì)網(wǎng)絡(luò)支持要求越來越高,Linux的高度模塊化使添加部件非常容易。Linux是一個(gè)和Unix相似、以內(nèi)核為基礎(chǔ)的、具有完全的內(nèi)存訪問控制、支持大量硬件(包括x86、Alpha、ARM等現(xiàn)有的大部分芯片)等特性的一種通用操作系統(tǒng)。其程序源碼全部公開,任何人可以修改,并在GNU通用公共許可證下發(fā)行。這樣,開發(fā)人員可以對(duì)操作系統(tǒng)進(jìn)行定制裁減,適應(yīng)其特殊需要。其強(qiáng)大的語言編譯器GCC、G++等不但成熟完善,而且使用方便。本論文中基于V2.6.27內(nèi)核通過make menuconfig對(duì)內(nèi)核進(jìn)行部分功能裁減。
軟硬件綜合開發(fā)是嵌入式系統(tǒng)的一大特色,軟件設(shè)計(jì)是在緊密聯(lián)系硬件的基礎(chǔ)上來完成的。本文的車載監(jiān)控系統(tǒng)設(shè)計(jì)遵循嵌入式軟件的體系結(jié)構(gòu)設(shè)計(jì)方法,分為兩個(gè)部分:①相關(guān)驅(qū)動(dòng)的開發(fā),如底層包括擴(kuò)展的PCI9054驅(qū)動(dòng)、串口驅(qū)動(dòng)、CAN驅(qū)動(dòng)及內(nèi)核自帶的網(wǎng)絡(luò)驅(qū)動(dòng)、USB、CS5536等設(shè)備驅(qū)動(dòng);②應(yīng)用程序的開發(fā),包括顯示監(jiān)控任務(wù)的實(shí)現(xiàn)、配置文件讀寫實(shí)現(xiàn)等。
2.1 設(shè)備驅(qū)動(dòng)開發(fā)
底層接口層封裝監(jiān)控顯示軟件與底層通信硬件接口、操作系統(tǒng)交互等部分的代碼,通過定義統(tǒng)一的接口規(guī)范,實(shí)現(xiàn)上層軟件不依賴具體的硬件平臺(tái),從而實(shí)現(xiàn)軟件易于移植。
作為底層驅(qū)動(dòng)模塊的基本結(jié)構(gòu)至少必須包含兩個(gè)函數(shù):module_init()和module_exit()。第一個(gè)函數(shù)是在把模塊加載入內(nèi)核時(shí)調(diào)用的;第二個(gè)函數(shù)則在刪除該模塊時(shí)調(diào)用。module_init()向內(nèi)核注冊(cè)模塊所能提供的所有新功能,即可以由應(yīng)用程序使用的新功能。函數(shù)module_ exit()的任務(wù)是清除掉module_init()所做的一切,保證這個(gè)模塊被安全地卸載。模塊的調(diào)用情況如圖2所示。下面以PCI9054為代表,描述硬件驅(qū)動(dòng)設(shè)計(jì)過程。
PCI9054驅(qū)動(dòng)程序主要實(shí)現(xiàn)PCI9054設(shè)備的中斷使能屏蔽,PCI9054設(shè)備的中斷處理,PCI9054設(shè)備的掛載、卸載、初始化。
2.1.1 定義和注冊(cè)PCI9054設(shè)備
[!--empirenews.page--]
2.1.2 PCI9054_probe()函數(shù)任務(wù)
對(duì)于probe驅(qū)動(dòng)函數(shù),驅(qū)動(dòng)程序的許多任務(wù)及硬件初始化工作都將在此函數(shù)中完成。它主要完成注冊(cè)PCI9054時(shí)調(diào)用的函數(shù),完成PCI9054配置信息讀取,取得外設(shè)地址,申請(qǐng)中斷,配置PCI9054的雜項(xiàng)寄存器。探測流程如圖3所示。
2.1.3 pci9054_init_module初始化函數(shù)
主要完成PCI的初始化、注冊(cè)PCI設(shè)備、使能PCI中斷等。流程圖如圖4所示。
[!--empirenews.page--]
2.1.4 pci9054_cleanup_module注銷函數(shù)
用于注銷PCI9054設(shè)備及相關(guān)擴(kuò)展設(shè)備。流程圖如圖5所示。
2.2 應(yīng)用程序的開發(fā)
車載監(jiān)控系統(tǒng)應(yīng)用程序的實(shí)現(xiàn)過程主要包括:窗體和各個(gè)信息控件的初始化并顯示窗體實(shí)現(xiàn)人機(jī)交互、對(duì)按鍵的響應(yīng)、參數(shù)的存儲(chǔ)、發(fā)送語音消息、圖5 PCI9054設(shè)備的卸載CAN事件數(shù)據(jù)的處理并實(shí)時(shí)刷新屏上信息顯示當(dāng)前設(shè)備的工作狀態(tài)。其程序流程如圖6所示。
2.3 應(yīng)用程序與設(shè)備驅(qū)動(dòng)的關(guān)聯(lián)
在Linux系統(tǒng)中,對(duì)于一個(gè)硬件設(shè)備對(duì)應(yīng)的是/dev目錄下的邏輯設(shè)備節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)以文件的形式存在,但它不是普通意義上的文件,是設(shè)備文件,更確切地說,它是設(shè)備節(jié)點(diǎn)。這個(gè)節(jié)點(diǎn)是通過mknod命令建立的,其中指定了主設(shè)備號(hào)和次設(shè)備號(hào)。通常而言,主設(shè)備號(hào)表明了對(duì)應(yīng)著確定的驅(qū)動(dòng)程序;次設(shè)備號(hào)由內(nèi)核使用,用于正確確定設(shè)備文件所指的設(shè)備。
insmod加載驅(qū)動(dòng)程序,設(shè)備號(hào)是從/proc/devices文件中獲得的,所以通常是有驅(qū)動(dòng)程序在內(nèi)核中,才有設(shè)備節(jié)點(diǎn)在目錄中。這個(gè)設(shè)備號(hào)(這里特指主設(shè)備號(hào))的主要作用,就是聲明設(shè)備所使用的驅(qū)動(dòng)程序。驅(qū)動(dòng)程序和設(shè)備號(hào)是一一對(duì)應(yīng)的,當(dāng)你打開一個(gè)設(shè)備文件時(shí),操作系統(tǒng)能知道這個(gè)設(shè)備所對(duì)應(yīng)的驅(qū)動(dòng)程序的加載。
設(shè)備節(jié)點(diǎn)文件中的file屬性中指明了驅(qū)動(dòng)程序中fops方法實(shí)現(xiàn)的函數(shù)指針。應(yīng)用程序通過使用open、write、read、ioetl等函數(shù)來訪問設(shè)備節(jié)點(diǎn),進(jìn)行相應(yīng)的工作。
結(jié)語
LX800微處理器以其豐富的接口、較快的處理速度、穩(wěn)定性及易擴(kuò)展性而受到嵌入式開發(fā)者的青睞?;贚X800的車載監(jiān)控系統(tǒng)采用Lin ux操作系統(tǒng),使其具備了實(shí)時(shí)多任務(wù)處理的能力。經(jīng)過測試,系統(tǒng)運(yùn)行穩(wěn)定可靠,有較好應(yīng)用前景。