摘要:利用神經(jīng)元芯片CYC53120和S3C2410芯片,實(shí)現嵌入式平臺下LonWorks總線(xiàn)的運用;同時(shí)介紹嵌入式Linux 下設備驅動(dòng)程序的構成,描述了LonWorks設備驅動(dòng)程序的軟件框架,為嵌入式Linux設備的開(kāi)發(fā)提供借鑒。 LonWorks是美國Echelon公司1992年推出的局部操作網(wǎng)絡(luò ),最初主要用于樓宇自動(dòng)化,但很快發(fā)展到工業(yè)現場(chǎng)網(wǎng)。LonWorks技術(shù)為設計和實(shí)現可互操作的控制網(wǎng)絡(luò )提供了一套完整、開(kāi)放、成品化的解決途徑,它協(xié)議完整、通信可靠,而且為用戶(hù)提供了功能強大的開(kāi)發(fā)工具(LONBU ILDER,NODEBU ILDER)。 在LonWorks現場(chǎng)總線(xiàn)設備的使用過(guò)程中,由于其設備驅動(dòng)與操作系統的相關(guān)性,從而要求開(kāi)發(fā)者在開(kāi)發(fā)過(guò)程不僅實(shí)現硬件構成,更需要熟悉操作系統及設備驅動(dòng)程序的制定。本文給出在ARM平臺下實(shí)現LonWorks總線(xiàn)設備的互聯(lián),并在嵌入式Linux系統下,介紹LonWorks現場(chǎng)總線(xiàn)設備驅動(dòng)程序的設計與實(shí)現。 1 LonWorks總線(xiàn)設備的構成 LonWorks技術(shù)的核心是神經(jīng)元芯片(Neuron Chip)。該芯片內部裝有3個(gè)微處理器:MAC處理器完成介質(zhì)訪(fǎng)問(wèn)控制;網(wǎng)絡(luò )處理器完成OSI的3~6層網(wǎng)絡(luò )協(xié)議;應用處理器完成用戶(hù)現場(chǎng)控制應用。它們之間通過(guò)公用存儲器傳遞數據。同時(shí)神經(jīng)元芯片共設置11個(gè)I/O口,這些I/O口可根據不同需求,利用Neuron C編程來(lái)靈活配置與外圍設備的接口,如RS232、并口、定時(shí)/計數、位I/O等。其芯片結構如圖1所示[1]。 在本系統設計中,基于嵌入式ARM平臺下實(shí)現對LonWorks總線(xiàn)的訪(fǎng)問(wèn),設計原理是利用S3C2410芯片的SPI(Serial Peripheral Interface)接口[2]與Neuron芯片來(lái)實(shí)現數據通信,其原理如圖2所示。 SPI總線(xiàn)系統可直接與各個(gè)廠(chǎng)家生產(chǎn)的多種標準外圍器件直接接口,它有4條引腳:SSEL(從器件選擇線(xiàn))、MOSI(主機輸出、從機輸入數據線(xiàn))、MISO(主機輸入、從機輸出數據線(xiàn))、SCK(同步串行時(shí)鐘線(xiàn))。S3C2410包含2個(gè)SPI接口,本文利用SPI1與Neuron芯片CY7C53120相連。 2 Linux下設備驅動(dòng)程序 設備驅動(dòng)程序是操作系統內核與機器硬件之間的接口。在Linux中,設備驅動(dòng)程序為應用程序屏蔽了硬件的細節,對應用程序而言,硬件設備只是一個(gè)設備文件,可以通過(guò)相應的系統調用像操作普通文件一樣對硬件設備進(jìn)行操作。 Linux系統的設備分為字符設備(char device)、塊設備(block device)和網(wǎng)絡(luò )設備(network device)3種[3-4]。字符設備是指存取時(shí)沒(méi)有緩存的設備;塊設備的讀寫(xiě)則都有緩存來(lái)支持,只能以塊為單位進(jìn)行讀寫(xiě),并且塊設備必須能夠隨機存取(random access) ;而Linux的網(wǎng)絡(luò )設備開(kāi)發(fā)則主要基于BSD Unix的socket機制。本文要開(kāi)發(fā)的Lonworks設備驅動(dòng)程序是一個(gè)字符型的設備,其基本組成如圖3所示。 Linux設備驅動(dòng)程序可以分為設備初始化子程序及卸載程序、服務(wù)子I/O請求的子程序和中斷服務(wù)子程序3個(gè)主要組成部分: (1)設備初始化子程序及卸載程序。Init_module用以負責檢測所要驅動(dòng)的硬件設備是否存在和是否能正常工作。如果該設備正常,則對這個(gè)設備及其相關(guān)的設備驅動(dòng)程序需要的軟硬件進(jìn)行初始化,其初始化程序流程如圖4所示。 Cleanup_module用以完成卸載設備時(shí)要做的工作,其設備卸載流程如圖5所示。 (2)服務(wù)于I/O請求的子程序,又稱(chēng)為驅動(dòng)程序的上半部。應用程序可以通過(guò)系統來(lái)調用此部分程序。此部分程序在執行時(shí),系統仍認為是與應用程序進(jìn)程屬于同一個(gè)進(jìn)程,具有進(jìn)行此系統調用的用戶(hù)程序的運行環(huán)境,只是由用戶(hù)態(tài)變成了核心態(tài),因而可以在其中調用sleep()等與進(jìn)程運行環(huán)境有關(guān)的函數。 此部分的設計主要是對file_operations結構的各個(gè)入口點(diǎn)的實(shí)現。從而實(shí)現了支持文件系統的調用(如open,close,read等)。file_operations結構是Linux操作系統中用于實(shí)現驅動(dòng)程序的最重要的數據結構,對Linux提供I/O 請求的子程序的一系列入口點(diǎn)進(jìn)行了封裝。下面給出用于Lonworks設備驅動(dòng)的file_operations結構示例。 struct file_operations{ int(*lseek)(struct inode *inode,struct file *flip,off_t off,int pos); int(*read)(struct inode *inode,struct file *filp,char *buf,int count); int(*write)(struct inode *inode,struct file *filp,char *buf,int count); int(*ioctl)(struct inode *inode,struct file *filp,unsigned int cmd,unsigned int arg); int(*open)(struct inode *inode,struct file *filp); viod(*release)(struct inode *inode,struct file *filp); } 由上可見(jiàn)file_operations 結構中的成員全部是函數指針,該結構實(shí)質(zhì)上就是函數跳轉表。每個(gè)應用進(jìn)程對設備的操作,都可以根據設備號,轉換成對file_operations 結構的訪(fǎng)問(wèn),通過(guò)調用相關(guān)函數完成具體操作。 (3)中斷服務(wù)子程序,又稱(chēng)為驅動(dòng)程序的下半部。在Linux系統中,并不直接從中斷向量表中調用設備驅動(dòng)程序的中斷服務(wù)子程序,而是由Linux系統來(lái)接收硬件中斷,再由系統來(lái)調用中斷服務(wù)子程序。 中斷可以在任何一個(gè)進(jìn)程運行時(shí)產(chǎn)生,因而中斷服務(wù)程序的調用,不依賴(lài)于任何進(jìn)程的狀態(tài),即不能調用任何與進(jìn)程運行環(huán)境有關(guān)的函數。在系統內部,I/O設備的存/取通過(guò)一組固定的入口點(diǎn)來(lái)進(jìn)行,這組入口點(diǎn)是由每個(gè)設備的驅動(dòng)程序提供的。對于本文涉及的LonWorks設備驅動(dòng),下面分析其作為字符型設備驅動(dòng)程序所需用的常用入口點(diǎn)。 Lon_open(struct inode *inode,struct file *filp)入口點(diǎn)用以打開(kāi)設備準備I/O操作。對字符設備文件進(jìn)行打開(kāi)操作,都會(huì )調用設備的open入口點(diǎn)。open子程序必須對將要進(jìn)行的I/O操作做好必要的準備工作,如清除緩沖區等。Lon_release(struct inode *inode,struct file *filp)入口點(diǎn)用以關(guān)閉設備。當最后一次使用設備終結后,調用release子程序。 Lon_read(struct inode *inode,struct file *filp,char *buf,int count)入口點(diǎn)用以從設備上讀數據?梢岳盟O定的緩沖區進(jìn)行I/O操作,從緩沖區里讀數據。對設備進(jìn)行讀操作將調用read子程序。相似的,Lon_write(struct inode *inode,struct file *filp,char *buf,int count)入口點(diǎn)用以往設備上寫(xiě)數據。對設備進(jìn)行寫(xiě)操作將調用write子程序。 Lon_ioctl(struct inode *inode,struct file *filp,unsigned int cmd,unsigned int arg)入口點(diǎn)執行讀、寫(xiě)之外的一些硬件控制操作,操作命令代碼通過(guò)cmd參數傳送,命令參數通過(guò)arg參數傳送。此函數也為功能擴展提供接口。 實(shí)現了以上3部分,核心驅動(dòng)模塊部分就完成了。對以上模塊進(jìn)行編譯并加載后,Linux用戶(hù)可用mknod命令利用動(dòng)態(tài)分配的主設備號建立相應的設備文件,并對它設置恰當讀寫(xiě)權限后,就可以在應用程序中通過(guò)這個(gè)設備文件來(lái)操作LonWorks總線(xiàn)設備了。這樣做不僅使得應用程序編程風(fēng)格更加統一,代碼更具魯棒性,應用系統更加安全更易于維護,而且可在核心級來(lái)保證關(guān)鍵部分的實(shí)時(shí)響應,從而降低用戶(hù)程序開(kāi)發(fā)的難度。 以上介紹了在A(yíng)RM9平臺的嵌入式Linux2.6.x系統中實(shí)現Lonwork通信的一種方法,并在以武漢創(chuàng )維特公司的JXARM9-2410實(shí)驗箱為基礎擴展的硬件平臺上實(shí)驗完成。后期可在此基礎上,結合Linux在網(wǎng)絡(luò )通信中的特長(cháng),實(shí)現對Lonwork網(wǎng)絡(luò )的應用管理或與其他通信網(wǎng)絡(luò )的互連,有較好的實(shí)用性。 |