基于Linux操作系統(tǒng)下RTC驅(qū)動開發(fā)_第1頁
基于Linux操作系統(tǒng)下RTC驅(qū)動開發(fā)_第2頁
基于Linux操作系統(tǒng)下RTC驅(qū)動開發(fā)_第3頁
基于Linux操作系統(tǒng)下RTC驅(qū)動開發(fā)_第4頁
基于Linux操作系統(tǒng)下RTC驅(qū)動開發(fā)_第5頁
已閱讀5頁,還剩45頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、目 錄中文摘要1ABSTRACT2第1章 Linux概述31.1 Linux操作系統(tǒng)的誕生和發(fā)行版31.1.1 Linux系統(tǒng)的誕生31.1.2 Linux 發(fā)行版31.2 Linux應(yīng)用和特性41.2.1 linux 的應(yīng)用41.2.2 linux 的特性4第2章 Tiny210開發(fā)板62.1 Tiny210 簡介62.2 Tiny210硬件配置62.3 軟件支持7第3章 移植前準備83.1軟件平臺的搭建83.1.1 虛擬機的安裝83.1.2 Red Hat linux 的安裝83.1.3 軟件包和源碼包的準備和下載8第4章 Linux 內(nèi)核9第5章 RTC芯片105.1 RTC芯片簡述10

2、5.2 I2C總線簡介10第6章 字符設(shè)備驅(qū)動相關(guān)知識116.1 模塊機制116.2 字符設(shè)備開發(fā)基本步驟126.3 主設(shè)備號和次設(shè)備號126.4 實現(xiàn)字符驅(qū)動程序13第7章 RTC驅(qū)動實現(xiàn)167.1 設(shè)計思路167.2 RTC程序?qū)崿F(xiàn)167.2.1 RTC基本數(shù)據(jù)結(jié)構(gòu)167.2.2注冊字符設(shè)備167.2.3 定義操作函數(shù)177.2.4 函數(shù)聲明187.3 編譯生成.ko文件187.4 實際運行及結(jié)果18第8章 結(jié)論20謝 辭21參 考 文 獻22附錄A RTC驅(qū)動程序23附錄B Makefile文件41附錄C 應(yīng)用層測試程序41-19-基于Linux操作系統(tǒng)下RTC驅(qū)動開發(fā)摘 要:論文主要研

3、究了Linux系統(tǒng)下的RTC芯片驅(qū)動架構(gòu),并設(shè)計了一個基于Tiny210開發(fā)板的RTC字符設(shè)備驅(qū)動。首先對Linux體系進行了簡單介紹,分析了Linux系統(tǒng)的應(yīng)用和特性,并對現(xiàn)有平臺Tiny210開發(fā)板進行了簡單分析。在對實際項目RTC驅(qū)動開發(fā)的分析設(shè)計的基礎(chǔ)上,采用了以動態(tài)模塊加載方式的字符設(shè)備驅(qū)動模型。在對RTC芯片各個模塊的簡單介紹中快速構(gòu)建和開發(fā)了一個該芯片的驅(qū)動模型,實現(xiàn)了對硬件時間的讀寫、鬧鐘的設(shè)置功能。減少了開發(fā)的復雜性,縮短了開發(fā)時間,且具有很強的可擴展、可移植性。關(guān)鍵詞:Linux操作系統(tǒng);Tiny210開發(fā)板;字符設(shè)備驅(qū)動;RTC芯片蚌埠學院本科畢業(yè)設(shè)計(論文)Driver

4、 Development of Real Timer Clock(RTC) Based on LinuxAbstract:In this thesis, the RTC chip driver under Linux system architecture and design of a development board based Tiny210 RTC character device drivers. First, a brief introduction Linux system to analyze the application and features of Linux sys

5、tems, and existing platforms Tiny210 development board for a simple analysis. On the basis of the actual project RTC-driven development of analysis and design, using a dynamic module loading character device driver model. Quickly build in RTC chip for each module in a brief and develop a model of th

6、e chip driver, the realization of hardware time to read and write, alarm setting function. Reducing the complexity of development and shorten the development time, and has a strong scalability, portability.Keywords: Linux operating system;Tiny210 development board;Character device driver;RTC chip第1章

7、 Linux概述1.1 Linux操作系統(tǒng)的誕生和發(fā)行版 1.1.1 Linux系統(tǒng)的誕生 1981年IBM推出了微型計算機IBM PC。在它推出的前10年內(nèi),MS-DOS操作系統(tǒng)主宰了整個計算機操作系統(tǒng)界。而在當時,計算機硬件的價格在不斷下跌,但軟件仍處于高位。蘋果的操作系統(tǒng)MacOS的是無疑是最好的性能,但價格高,沒有人可以輕易接近。到1991年,隨著GNU計劃開發(fā)出來了一些工具,以及GNU C編譯器的發(fā)布。甚至MINIX也因為版權(quán)開始需要購買才能獲得源代碼。在GNU HURD操作系統(tǒng)的開發(fā)工作卻不是能在幾年內(nèi)完成的。對于萊納斯來說,已經(jīng)等不及了。起初,他只是為了學習386架構(gòu)的編程技術(shù),

8、但隨后的Linux開發(fā)過程已經(jīng)徹底改變了他的主意。在1991年初,萊納斯在學習MINIX的操作系統(tǒng)的時候產(chǎn)生了開發(fā)一個新的屬于自己的理想中的操作系統(tǒng)的想法。最早與Linux(當然此時還不叫Linux 這個名稱)相關(guān)的新聞是萊納斯在1991年7月3號的comp.os.minix上發(fā)布的消息。而在萊納斯8 月25 日發(fā)布的消息中,他第一次向外界透露出有開發(fā)免費的操作系統(tǒng)的意向,可是它并不會象GNU 那種現(xiàn)在已經(jīng)在行業(yè)中成型的系統(tǒng)那樣專業(yè),而代碼量不會很大1。直到1991 年的10 月5 日,萊納斯在comp.os.minix 新聞組上發(fā)布消息,正式向外宣布Linux 內(nèi)核系統(tǒng)的誕生(Free mi

9、nix-like kernel sources for 386-AT)。這段消息就是直到今日都廣為流傳的被稱為Linux的誕生宣言。因此對Linux 社區(qū),及其所用用戶來說,10月5日都是一個特殊的日子。直到今天,包括現(xiàn)在的Red Hat公司在內(nèi)的很多公司都會在發(fā)布許多Linux 的新版本時選擇了這個日子。 Linux是一種源于UNIX的操作系統(tǒng),雖然從嚴格意義上講,Linux這個詞實際上是指Linux內(nèi)核,但實際上人們已經(jīng)習慣了把整個基于Linux內(nèi)核以及在此基礎(chǔ)上的各種工具的操作系統(tǒng)統(tǒng)稱為Linux。 1.1.2 Linux 發(fā)行版 通常來講,一個Linux的發(fā)行版不僅僅是指Linux內(nèi)核

10、,還包括了使用Linux的軟件的安裝工具,以及各種工具軟件,而在一些特定的版本中中也有一些特定軟件,只不過現(xiàn)在都習慣于把它們統(tǒng)稱為Linux發(fā)行版。每一種發(fā)行版的開發(fā)都是針對著不同的目標,像是支持不同計算機結(jié)構(gòu),更強調(diào)實時應(yīng)用,和專門面向嵌入式系統(tǒng)等。主流的Linux發(fā)型版有Ubuntu,Red Hat等等。1.2 Linux應(yīng)用和特性 1.2.1 Linux 的應(yīng)用Linux的基本思想就是萬物皆文件,因此它擁有極高的靈活性和可移植性,再加上它的UNIX背景,使它Linux在服務(wù)器的操作系統(tǒng)方面具有廣泛運用。直到現(xiàn)在,Linux還是提供網(wǎng)站服務(wù)供應(yīng)商最常使用的平臺。雖然因為新的編程語言的興起,

11、它的市場份額在不斷減少,但在嵌入式行業(yè),Linux基于其低廉成本與小體積依然是不可動搖的霸主,像在機頂盒、手機及移動裝置等硬件平臺上,Linux已經(jīng)是不可或缺的3。 1.2.2 Linux 的特性 完全兼容 因為Linux兼容了POSIX1.0標準,所以一些常見的Windows的程序完全可以在Linux上無障礙運行,這也為用戶從Windows轉(zhuǎn)到Linux提供了方便。因為現(xiàn)在Windows的巨大影響力,許多用戶在使用Linux前,都會因為以前Windows的使用習慣而擔心能否適應(yīng)新的環(huán)境,而這一點就使他們不在顧慮。 完全免費,發(fā)展迅速 Linux是一款完全免費的操作系統(tǒng)。因為Linux社區(qū)的存

12、在,所有的Linux用戶都可以輕易的得到當前任意版本的Linux的源代碼,并按照自己的意愿來修改它。正是由于這一點,每時每刻,每一次的技術(shù)進步,每一種新平臺面世,都有來自世界各地的精英都參與了Linux的更新和實現(xiàn),無數(shù)的靈感跟不斷進步的技術(shù)與編程思想,讓Linux有了無窮的可能性,并在無數(shù)程序員的努力下不斷壯大。 多用戶、多任務(wù) 正如當今世界發(fā)展的主流那樣,Linux也支持多用戶。這保證了各用戶的相對獨立,之間互不影響,都對于自己的文件設(shè)備有自己的權(quán)利。而多任務(wù)則是現(xiàn)在各種智能設(shè)備的主要特點,為了節(jié)省運行時間和解放更多的系統(tǒng)資源,實現(xiàn)了多進程的并行執(zhí)行,Linux操作系統(tǒng)就是其中的典范。 良

13、好的界面 因為現(xiàn)在Windows系統(tǒng)的強烈影響,Linux同時具有可以通過鍵盤輸入相應(yīng)的指令來進行操作的字符界面和類似Windows圖形界面的X-Window系統(tǒng)提供的圖形界面。后者使用戶可以類似于Windows操作系統(tǒng)使用鼠標對其進行操作,而不會因為轉(zhuǎn)換了操作系統(tǒng)感到不適應(yīng)。 豐富的網(wǎng)絡(luò)功能 Unix最大的優(yōu)勢就是其強大的網(wǎng)絡(luò)功能,而從Unix衍生出來的Linux系統(tǒng)也繼承了它在網(wǎng)絡(luò)功能上的優(yōu)勢。Linux的網(wǎng)絡(luò)功能和其內(nèi)核緊密相連,在這方面它要比其他操作系統(tǒng)更有優(yōu)勢。 可靠的安全、穩(wěn)定性能 Linux采取了許多安全技術(shù)措施為內(nèi)部信息安全提供了保障。而且Linux的極高的穩(wěn)定性使它在對要應(yīng)用

14、到網(wǎng)絡(luò)服務(wù)器這類有較高穩(wěn)定性要求的服務(wù)上有非常高的適應(yīng)性。 支持多種平臺 Linux作為一種嵌入式操作系統(tǒng),在各種移動裝置上應(yīng)用廣泛。Linux因為其開源的特性使它基本可以在市場上絕大部分的硬件平臺上運行,這也使它精簡體積小的內(nèi)核可以方便地移植多種嵌入式處理器上。 第2章 Tiny210開發(fā)板2.1 Tiny210 簡介Tiny210是一款高性能的Cortex A8核心板,它由廣州友善之臂設(shè)計、生產(chǎn)和發(fā)行銷售。它采用三星S5PV210作為主處理器,運行主頻可高達1GHz。S5PV210內(nèi)部集成了PowerVR SGX540高性能圖形引擎,支持3D圖形流暢運行,并可流暢播放1080P大尺寸視頻4

15、。Tiny210主要采用了2.0mm間距的雙排針,引出CPU大部分常用功能引腳,并力求和Tiny6410核心板三排引腳兼容(P1,P2,CON2) 5。2.2 Tiny210硬件配置如圖2-1: 2.3 軟件支持 Superboot-210 Android 2.3 + Linux-3.0.8 Android 4.0 WindowsCE6第3章 移植前準備3.1軟件平臺的搭建 3.1.1 虛擬機的安裝在有了硬件平臺的支持下(Tiny210開發(fā)板)開始進行軟件平臺的搭建。在pc機上安裝一個虛擬機,本文選用的虛擬機是VMware Workstation 。虛擬機其實就是在主機中占用一塊內(nèi)存在主機的硬

16、件平臺上搭建一個類似主機的運行環(huán)境,在 VMware中,你可以在一個以主機的分割的內(nèi)存為基礎(chǔ)的窗口中加載一臺虛擬機,運行自己的操作系統(tǒng)和應(yīng)用程序,而不影響主機任何操作。 3.1.2 Red Hat Linux 的安裝在安裝了Vmware Workstation 的條件下,創(chuàng)建一個虛擬機給它分配20G的磁盤大小。512M的內(nèi)存空間。然后從網(wǎng)上下載Red Hat Linux 操作系統(tǒng)安裝包iso文件,我下載的是Red Hat Linux-5的iso文件,該版本的Linux內(nèi)核時3.0的,相對來說是版本比較高的內(nèi)核。在獲得Red Hat的iso文件后,在創(chuàng)建的虛擬機中安裝該Linux操作系統(tǒng)。 3.

17、1.3 軟件包和源碼包的準備和下載需要的軟件有交叉編譯器arm-Linux-gcc ,我選用的交叉編譯器為Tiny210的開發(fā)自帶的交叉編譯器,該編譯器是4.0版本以上的,正是由于我即將下載內(nèi)核源碼版本比較高,因此我們選用的交叉編譯器的版本也是相對來說比較高的。從網(wǎng)站下載Linux的內(nèi)核源代碼linux-3.0.8.tar.gzRTC 。Boot Loader 是在硬件平臺運行之前完成對硬件的初始化病喚醒操作系統(tǒng)的程序。就是通過Boot Loader來實現(xiàn)初始化硬件設(shè)備,從而給操作系統(tǒng)提供了一個合適的軟硬件環(huán)境,并為調(diào)用它做好準備。我選擇的Boot Loader是U

18、_boot6。第4章 Linux 內(nèi)核現(xiàn)在自己的當前目錄,即目錄下,解壓自己的內(nèi)核源代碼: tar xvzf linux-3.0.8.tgz解壓Linux內(nèi)核源碼包,在當前目錄下生成一相應(yīng)的文件夾linux-3.0.8,這就是該內(nèi)核的所有實現(xiàn)代碼。Linux的內(nèi)核的目錄包含很多個文件夾,分別用于實現(xiàn)不同的功能(如圖4-1)7。(假設(shè)相對于Linux-3.0.8):圖4-1 Linux根目錄 其中有幾個比較重要的需要著重了解: /drivers 驅(qū)動目錄,該目錄是所有被加載到內(nèi)核的設(shè)備驅(qū)動的程序。其中又把設(shè)備驅(qū)動進一步劃分成幾類,如字符設(shè)備驅(qū)動,塊設(shè)備驅(qū)動等。 /include 該目錄包括編譯核

19、心所需要的大部分頭文件,也是Linux下程序編譯的查找默認路徑。 /net 該目錄里不用說就是核心的網(wǎng)絡(luò)層代碼。 /init 該目錄中包含內(nèi)核的所有硬件初始化代碼,這是內(nèi)核所有工作的起點,像是main.c和Version.c這兩個C語言程序的編譯入口文件就在其中,同時也是是所有進程的最初父進程。 /kernel 該內(nèi)核管理的核心代碼放在這里,也就是通常所說的內(nèi)核的具體實現(xiàn),一般除了內(nèi)核裁剪都不需要對它進行操作。 /documentation 該目錄下是對每個目錄作用的具體說明的文檔以及一些功能的實例,就相當于產(chǎn)品說明書。 /ipc 該目錄包含了核心進程間的通信代碼,是Linux多任務(wù)特性具體實

20、現(xiàn)。 /lib 該目錄是編譯默認路徑,包含了內(nèi)核絕大部分的庫文件與代碼。 /modules 該目錄存放了已建好的、可動態(tài)加載的模塊,裁剪內(nèi)核的主要工作目標。第5章 RTC芯片5.1 RTC芯片簡述 RTC(real time clock)實時時鐘,顧名思義,擁有真實時間的時鐘,其實它的主要作用就是在操作系統(tǒng)沒有工作的時候自主維護時間表,并在需要的時候給操作系統(tǒng)提供系統(tǒng)時間。開發(fā)板的時間系統(tǒng)可以分成兩種,分別是系統(tǒng)時間和硬件時間。硬件時間指的就是RTC芯片自主維護的時間,因為RTC芯片是電池供電的,所以在硬件平臺掉電后時間表不會丟失。Linux內(nèi)核就把RTC芯片當作“離線”的時間與日期維護器。當

21、Linux內(nèi)核啟動時,都要通過RTC來進行初始化,從RTC中讀取時間保存到系統(tǒng)中,得到系統(tǒng)時間。而在運行期間,內(nèi)核以軟件的形式維護系統(tǒng)的當前時間與日期,并在關(guān)機或必要的時候?qū)r間回寫RTC芯片,由它自主維護。另外如果RTC擁有了IRQ中斷并且可以定時,那么RTC還可以作為一個鬧鐘用來在內(nèi)核睡眠時喚醒內(nèi)核。 Linux有兩種RTC驅(qū)動的接口,一個是老的接口,專門用在PC機上的。另外一鐘新接口是基于Linux設(shè)備驅(qū)動程序的。而后者創(chuàng)建了一個RTC驅(qū)動模型,并注冊到RTC核心中,把所有工作交由RTC芯片完成。5.2 I2C總線簡介I2C總線是一種由Philips公司開發(fā)的兩線式串行總線標準

22、,用于鏈接微控制器及其外圍設(shè)備。I2C有100K和400K兩種工作速率,它支持多機通訊和多主控模塊設(shè)計,并且每個電路模塊都有唯一的地址,還允許每個在I2C總線上的期間都可以使用獨立的電源。本文就是介紹基于I2C總線的Linux字符設(shè)備驅(qū)動。I2C由數(shù)據(jù)線(SDA)和時鐘線(SCL)構(gòu)成的同步串行總線,可發(fā)送和接受數(shù)據(jù),在處理器與控制芯片之間、芯片與芯片之間進行雙向傳送8。I2C總線在傳送數(shù)據(jù)過程中共有三種類型信號,它們分別是開始信號、結(jié)束信號和應(yīng)答信號9。第6章 字符設(shè)備驅(qū)動相關(guān)知識6.1模塊機制 Linux提供了一種被稱為模塊(Module)的機制提供了對許多模塊支持,設(shè)備驅(qū)動每個模塊由不同

23、代碼組成,實現(xiàn)不同功能10(所有的模塊在一起才是一個可執(zhí)行程序)。insmod 將模塊動態(tài)加載到正在運行內(nèi)核;rmmod 程序移除模塊;Linux內(nèi)核模塊的程序結(jié)構(gòu): module_init()加載模塊函數(shù)(必須) 使用insmod命令加載模塊時,內(nèi)核就會執(zhí)行該模塊的加載函數(shù),也就是說這就是整個模塊函數(shù)的入口,就是通過它來完成模塊的初始化相關(guān)工作。 module_exit()卸載模塊函數(shù)(必須) 當使用rmmod命令卸載某模塊時,內(nèi)核就會執(zhí)行該這段函數(shù),完成對模塊的刪除和空間的釋放。 MODULE_LICENSE()模塊許可證聲明(必須) 這一段函數(shù)就是描述內(nèi)核將要加載的模塊的工作權(quán)限,如果在

24、加載模塊時不聲明LICENSE,內(nèi)核就會報警:kernel tainted,意思就是內(nèi)核被污染。 module_param()模塊參數(shù)(可選) 這個函數(shù)括號內(nèi)放置著模塊內(nèi)部聲明的全局變量,對應(yīng)著在加載模塊時rommod命令后面跟著的參數(shù),這些參數(shù)就會被傳入模塊內(nèi)。 EXPORT_SYMBOL()模塊導出符號(可選) 這個函數(shù)括號內(nèi)也放置著數(shù)量不等參數(shù),也就是符號(可以是函數(shù)或變量),而在這個模塊結(jié)束之后,其他模塊就可以通過這個符號使用本模塊中這些到處的參數(shù),變量或函數(shù)。 其他一些聲明MODULE_XXXXX()模塊聲明(可選)不同的聲明對應(yīng)著不同的功能選項,視實際情況而定。 模塊加載函數(shù):st

25、atic int _init initialization_rtc(void) /* 初始化代碼 */module_init(initialization_rtc); 模塊卸載函數(shù)static void _exit cleanup_rtc(void) /* 釋放資源 */module_exit(cleanup_rtc); 6.2字符設(shè)備開發(fā)基本步驟 向內(nèi)核確定主該設(shè)備的主次設(shè)備號 實現(xiàn)字符驅(qū)動程序: 填充file_operations結(jié)構(gòu)體 實現(xiàn)模塊加載函數(shù)用以注冊字符設(shè)備 實現(xiàn)模塊卸載函數(shù)完成模塊的釋放和刪除 創(chuàng)建設(shè)備文件節(jié)點6.3主、次設(shè)備號11 主設(shè)備號是內(nèi)核識別一個設(shè)備的標識。整數(shù)(占

26、12bits),范圍從0到4095,通常使用1到255。 次設(shè)備號由內(nèi)核使用,用于正確確定設(shè)備文件所指的設(shè)備。整數(shù)(占20bits),范圍從0到1048575,一般使用0到255。 設(shè)備編號的內(nèi)部表達 dev_t類型(32位,其中主設(shè)備號12位,次設(shè)備號20位): 是屬于Linux內(nèi)核編程的專有類型,用來保存設(shè)備編號。 從dev_t類型變量中獲得主設(shè)備號和次設(shè)備號:這是兩個封裝好的函數(shù)MAJOR(dev_t rtc);/獲得主設(shè)備號MINOR(dev_t rtc);/獲得次設(shè)備號 將主設(shè)備號和次設(shè)備號轉(zhuǎn)換成dev_t類型:這也是一個封裝好的函數(shù)dev_t =MKDEV(int ,int );

27、分配主設(shè)備號 手工分配主設(shè)備號的函數(shù):#include <linux/fs.h> /這是Linux內(nèi)核中有關(guān)設(shè)備號的頭文件int register_chrdev_region( dev_t num, unsigned int , char *rtc );這是自己手動把num分配給rtc作為主設(shè)備號。 動態(tài)分配主設(shè)備號:#include <linux/fs.h> /這是Linux內(nèi)核中有關(guān)設(shè)備號的頭文件int alloc_chrdev_resion(dev_t *,unsigned int ,unsigned int ,char *rtc);這是內(nèi)核自動分配一個設(shè)備好給r

28、tc。 釋放設(shè)備號void unregister_chrdev(dev_t, unsigned int );在該設(shè)備號不再使用之后,釋放并刪除它,以節(jié)約內(nèi)核資源。6.4實現(xiàn)字符驅(qū)動程序?qū)崿F(xiàn)字符設(shè)備驅(qū)動,最重要的就是字符設(shè)備結(jié)構(gòu)體cdev,以及驅(qū)動接口結(jié)構(gòu)體-file_operations。 cdev 結(jié)構(gòu)體struct cdev struct kobject xxx; /* 內(nèi)核內(nèi)嵌的對象 */ struct module *xxx; /*所屬模塊*/ struct file_operations *xxx; /*文件操作結(jié)構(gòu)體*/ struct list_head xxx; /*不常用*/

29、dev_t xxx; /*設(shè)備號*/ unsigned int xxx; /*不常用*/ ; file_operations 結(jié)構(gòu)體字符驅(qū)動和內(nèi)核的接口:在內(nèi)核代碼中,./include/linux/fs.h下的代碼實現(xiàn),定義了字符驅(qū)動程序只要填充一個file_operations結(jié)構(gòu)體并把它注冊到內(nèi)核中,內(nèi)核就有了通過它操作這個字符設(shè)備的能力。 file_operations的主要成員:struct module *xxx: 指向模塊本身open: 提供打開設(shè)備的函數(shù)接口;release:提供關(guān)閉設(shè)備的函數(shù)接口;read: 實現(xiàn)從設(shè)備上讀取數(shù)據(jù)的函數(shù)接口;write: 實現(xiàn)向設(shè)備上寫入數(shù)據(jù)的

30、函數(shù)接口;ioctl: I/O控制函數(shù);llseek: 定位讀寫指針位置并把他們輸出出來; ioctl函數(shù)為設(shè)備驅(qū)動程序執(zhí)行用戶空間的“命令”提供了一個特有的接口用來設(shè)置或者讀取設(shè)備的具體信息。 cmd 參數(shù)的定義Linux內(nèi)核對file_operations的ioctl()函數(shù)的cmd參數(shù)有特殊的定義:如圖6-1。圖6-1 cmd參數(shù)構(gòu)造命令編號的宏:_IO() 給沒有參數(shù)的命令;_IOR() 給從驅(qū)動中讀數(shù)據(jù)的命令;_IOW() 給寫入數(shù)據(jù)的命令;_IOWR() 用于雙向傳輸。 Ioctl函數(shù)模板static long rtc_dev_ioctl(struct file *file,uns

31、igned int cmd, unsigned long arg).switch (cmd) case RTC_EPOCH_SET:.Break;case RTC_SET_TIME:.break;case RTC_IRQP_SET:.break;case RTC_PIE_ON:.break;.圖6-2 字符設(shè)備驅(qū)動 第7章 RTC驅(qū)動實現(xiàn)7.1 設(shè)計思路Linux設(shè)備驅(qū)動屬于內(nèi)核的一部分,Linux內(nèi)核的驅(qū)動模塊可以用兩種不同的方式加載和編譯: 通過內(nèi)核裁剪,隨同Linux的啟動直接加載編譯進Linux內(nèi)核; 把驅(qū)動程序編譯成一個可加載和刪除的動態(tài)模塊,可以在需要時隨時使用insmod命令加載

32、,rmmod命令刪除。這種方式更快,也節(jié)省了內(nèi)核資源,控制了內(nèi)核的大小,而模塊一旦被插入內(nèi)核,就和其他被直接初始化到內(nèi)核中的模塊一樣了。這次的RTC驅(qū)動就采用動態(tài)模塊加載的方式,將程序主體分成3個部分。分別是注冊字符設(shè)備的class.c,定義操作函數(shù)的dev.c和提供接口說明的ioctl.c。7.2 RTC程序?qū)崿F(xiàn) 7.2.1 RTC基本數(shù)據(jù)結(jié)構(gòu)struct rtc_time 結(jié)構(gòu)體struct rtc_time int sec;int min;int hour;int mday;int mon;int year;

33、int wday;int yday;int isdst;這個結(jié)構(gòu)體代表了硬件時間與日期,從RTC芯片讀取的時間和日期就分開保存在這個結(jié)構(gòu)體中 7.2.2注冊字符設(shè)備 模塊初始化函數(shù): init_rtc static int _init init_rtc(void)         rtc_class = class_create(THIS_MODULE, "rtc");  in

34、t err;err = alloc_chrdev_region(&rtc_devt, 0, RTC_DEV_MAX, "rtc");     rtc_dev_init();       rtc_sysfs_init(rtc_class);      if (err < 0)printk(KERN_ERR "%s: failed to allocate char dev regionn",_FI

35、LE_);  return 0;             Init_rtc首先創(chuàng)建了一個類rtc12。類本身就是一個高度面向?qū)ο蟮漠a(chǎn)物,而用戶空間就可以在不知道如何實現(xiàn)的情況下直接得到結(jié)果,驅(qū)動程序也不用直接處理,只要調(diào)用就行了。 7.2.3 定義操作函數(shù)  dev.c 填充了file_operations結(jié)構(gòu)rtc_foperations,以及這些操作函數(shù)的具體實現(xiàn)。rtc_foperations- rtc基本的文件操作: static

36、0;const struct file_operations  rtc_foperations =   .owner       = THIS_MODULE,  .llseek      = null,  .read        = read,  .poll

37、        = poll,  .unlocked_ioctl = ioctl,  .open        = openfile,  .release     = release,  .fasync      = fasync

38、,      7.2.4 函數(shù)聲明ioctl.c里的所有函數(shù)的實現(xiàn)都對應(yīng)于dev.c 中rtc_ioctl相應(yīng)的命令,其中RTC_RD_TIME與RTC_SET_TIME兩個命令需要特別注意,這是RTC最基本的功能函數(shù)獲取時間和設(shè)置時間。7.3 運行步驟通過編寫的Makefile及arm-linux-gcc編譯生成rtc.ko文件,如圖7-1。圖7-1 編譯生成.ko文件編寫用戶層測試程序,并編譯成可執(zhí)行程序qq。7.4 實際運行及結(jié)果將生成的.ko模塊和應(yīng)用層測試程序qq下載的目標板,運行過程如圖7-2:用insmod裝載模板。創(chuàng)建設(shè)備節(jié)點:

39、 mknod /dev/rtc c 250 0修改執(zhí)行程序權(quán)限: chmod 777 qq執(zhí)行測試程序。圖7-2 運行過程結(jié)果如圖7-3:圖7-3 運行結(jié)果第8章 結(jié)論本論文中對Linux的發(fā)展跟現(xiàn)狀進行了了解,還在對課題基于Linux操作系統(tǒng)下RTC驅(qū)動開發(fā)的基礎(chǔ)上對Linux內(nèi)核進行了大致的分析,并在課題最后進行了相對于RTC驅(qū)動模塊的應(yīng)用層測試軟件的編寫。在本文中嵌入式系統(tǒng)選擇的是Linux系統(tǒng),它具有占有內(nèi)存小和運行速率高的優(yōu)點。并采用了模塊化的指導設(shè)計方法開發(fā)設(shè)備驅(qū)動,提高了程序的可讀性和可移植性。本文將字符設(shè)備分為了設(shè)備注冊、函數(shù)功能實現(xiàn)以及調(diào)用接口,并對程序進行了應(yīng)用層的實例驗證

40、。由于時間的原因,本文中RTC字符驅(qū)動的程序設(shè)計還是有些簡單,在以后的學習工作中還需要進一步改善。在以后對驅(qū)動的學習中,希望能夠不斷完善RTC芯片的功能實現(xiàn),并在在嵌入式Linux操作系統(tǒng)的建立中,以內(nèi)核剪裁的方式將驅(qū)動程序移植到Linux內(nèi)核中去,努力做出更為精簡穩(wěn)定的內(nèi)核系統(tǒng)。謝 辭首先,向我的指導老師趙老師和劉老師表示感謝,感謝老師們一直以來對我的關(guān)懷和悉心指導,并在完成畢業(yè)設(shè)計的過程中讓我體會到了也學到了很多。在整個畢業(yè)設(shè)計指導活動中,老師的豐富經(jīng)驗和對整個行業(yè)脈絡(luò)的把握,都是年輕的我難以望其項背的,并在整個課題的完成過程中起到了至關(guān)重要的作用。趙老師教學作風的和劉老師的治學風格都讓我

41、留下了很深的印象。 同時也要感謝培訓班的所有同學,在臨近畢業(yè)的培訓過程中,對我的關(guān)心和幫助。感謝他們不厭其煩地指導我解決了不少項目上的難題,她們積極向上的學習態(tài)度也是我奮斗下去的動力。感謝我的親人,在這四年里是他們給我無數(shù)的鼓勵、支持和幫助,正因為有他們我才能高興順利的完成大學學業(yè),并學到了很多專業(yè),以及很多人生道路上的寶貴財富。 最后感謝各位評閱老師在百忙之中抽空評閱我的論文。參 考 文 獻1 徐俊仕.基于嵌入式Linux的車載GPS導航系統(tǒng)設(shè)計與實現(xiàn)D西安:西北工業(yè)大學機械電子工程學院,2007.2 戴明華,李長云,曾志浩,崔海燕. 嵌入式Linux驅(qū)動程序框架研究綜述J. 長沙大學學報,

42、2012,02:52-53.3 方先康.基于powerpc處理器MPC8541E的嵌入式Linux系統(tǒng)開發(fā)D北京:北京郵電大學計算機科學與技術(shù)學院,2011.4 張利平.基于MPC8536的雷達嵌入式數(shù)據(jù)處理平臺設(shè)計D.成都:中國西南電子技術(shù)研究所,2012.5 羅澤勇.一種基于powerpc的嵌入式信號處理平臺的設(shè)計D.西安:西安電子科技大學,2011.6 董文軍. Linux驅(qū)動程序兼容性的相關(guān)問題J.單片機與嵌入式系統(tǒng)應(yīng)用,2010,03:16-18.7 董闖.基于MPC85xx的U-boot啟動流程分析和移植D,北京:北京郵電大學,2009.8 周立功,陳明計,陳渝ARM嵌入式Linu

43、x系統(tǒng)構(gòu)建與驅(qū)動開發(fā)范例M北京:北京航空航天大學出版社,2006.9 王淑貞U-Boot在S3C2410上的移植J.微計算機應(yīng)用,2008,29(4):95-97.10 LTIB user manual Linux Target Image Builder,Freescale,2006.11 史勝輝.基于嵌入式Linux的頻譜分析儀軟件系統(tǒng)設(shè)計D.成都:電子科技大學,2011.12 MPC8536 datasheet MPC8536E PowerQUICC III tm Integrated Processor Product Brief ,2009.附錄A RTC驅(qū)動程序Class.c#in

44、clude <linux/module.h>#include <linux/rtc.h>#include <linux/kdev_t.h>#include <linux/idr.h>#include <linux/slab.h>#include <linux/workqueue.h>#include "rtc-core.h"static DEFINE_IDR(rtc_idr);static DEFINE_MUTEX(idr_lock);struct class *rtc_class;static voi

45、d rtc_device_release(struct device *dev)struct rtc_device *rtc = to_rtc_device(dev);mutex_lock(&idr_lock);idr_remove(&rtc_idr, rtc->id);mutex_unlock(&idr_lock);kfree(rtc);#if defined(CONFIG_PM) && defined(CONFIG_RTC_HCTOSYS_DEVICE)static struct timespec old_rtc, old_system, ol

46、d_delta;static int rtc_suspend(struct device *dev, pm_message_t mesg)struct rtc_device*rtc = to_rtc_device(dev);struct rtc_timetm;struct timespecdelta, delta_delta;if (strcmp(dev_name(&rtc->dev), CONFIG_RTC_HCTOSYS_DEVICE) != 0)return 0;delta = timespec_sub(old_system, old_rtc);delta_delta =

47、timespec_sub(delta, old_delta);if (delta_delta.tv_sec < -2 | delta_delta.tv_sec >= 2) old_delta = delta; else old_system = timespec_sub(old_system, delta_delta);return 0;static int rtc_resume(struct device *dev)struct rtc_device*rtc = to_rtc_device(dev);struct rtc_timetm;struct timespecnew_sys

48、tem, new_rtc;struct timespecsleep_time;if (strcmp(dev_name(&rtc->dev), CONFIG_RTC_HCTOSYS_DEVICE) != 0)return 0;getnstimeofday(&new_system);rtc_read_time(rtc, &tm);if (rtc_valid_tm(&tm) != 0) pr_debug("%s: bogus resume timen", dev_name(&rtc->dev);return 0;rtc_tm_t

49、o_time(&tm, &new_rtc.tv_sec);new_rtc.tv_nsec = 0;if (new_rtc.tv_sec < old_rtc.tv_sec) pr_debug("%s: time travel!n", dev_name(&rtc->dev);return 0;sleep_time = timespec_sub(new_rtc, old_rtc);sleep_time = timespec_sub(sleep_time,timespec_sub(new_system, old_system);if (sleep

50、_time.tv_sec >= 0)timekeeping_inject_sleeptime(&sleep_time);return 0;#else#define rtc_suspendNULL#define rtc_resumeNULL#endifstruct rtc_device *rtc_device_register(const char *name, struct device *dev,const struct rtc_class_ops *ops,struct module *owner)struct rtc_device *rtc;struct rtc_wkalr

51、m alrm;int id, err;if (idr_pre_get(&rtc_idr, GFP_KERNEL) = 0) err = -ENOMEM;goto exit;mutex_lock(&idr_lock);err = idr_get_new(&rtc_idr, NULL, &id);mutex_unlock(&idr_lock);if (err < 0)goto exit;id = id & MAX_ID_MASK;rtc = kzalloc(sizeof(struct rtc_device), GFP_KERNEL);if (r

52、tc = NULL) err = -ENOMEM;goto exit_idr;rtc->id = id;rtc->ops = ops;rtc->owner = owner;rtc->irq_freq = 1;rtc->max_user_freq = 64;rtc->dev.parent = dev;rtc->dev.class = rtc_class;rtc->dev.release = rtc_device_release;mutex_init(&rtc->ops_lock);spin_lock_init(&rtc->

53、;irq_lock);spin_lock_init(&rtc->irq_task_lock);init_waitqueue_head(&rtc->irq_queue);timerqueue_init_head(&rtc->timerqueue);INIT_WORK(&rtc->irqwork, rtc_timer_do_work);rtc_timer_init(&rtc->aie_timer, rtc_aie_update_irq, (void *)rtc);rtc_timer_init(&rtc->uie_r

54、tctimer, rtc_uie_update_irq, (void *)rtc);hrtimer_init(&rtc->pie_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);rtc->pie_timer.function = rtc_pie_update_irq;rtc->pie_enabled = 0;err = _rtc_read_alarm(rtc, &alrm);if (!err && !rtc_valid_tm(&alrm.time)rtc_initialize_alarm(rtc, &

55、amp;alrm);strlcpy(rtc->name, name, RTC_DEVICE_NAME_SIZE);dev_set_name(&rtc->dev, "rtc%d", id);rtc_dev_prepare(rtc);err = device_register(&rtc->dev);if (err) put_device(&rtc->dev);goto exit_kfree;rtc_dev_add_device(rtc);rtc_sysfs_add_device(rtc);rtc_proc_add_device(r

56、tc);dev_info(dev, "rtc core: registered %s as %sn",rtc->name, dev_name(&rtc->dev);return rtc;exit_kfree:kfree(rtc);exit_idr:mutex_lock(&idr_lock);idr_remove(&rtc_idr, id);mutex_unlock(&idr_lock);exit:dev_err(dev, "rtc core: unable to register %s, err = %dn",

57、name, err);return ERR_PTR(err);EXPORT_SYMBOL_GPL(rtc_device_register);void rtc_device_unregister(struct rtc_device *rtc)if (get_device(&rtc->dev) != NULL) mutex_lock(&rtc->ops_lock);rtc_sysfs_del_device(rtc);rtc_dev_del_device(rtc);rtc_proc_del_device(rtc);device_unregister(&rtc->dev);rtc->ops = NULL;mutex_unlock(&rtc->ops_lock);put_device(&rtc->dev);EXPORT_SYMBOL_GPL(rtc_device_unregister);static int _init rtc_init(vo

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論