




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rè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章 移植前準(zhǔn)備83.1軟件平臺(tái)的搭建83.1.1 虛擬機(jī)的安裝83.1.2 Red Hat linux 的安裝83.1.3 軟件包和源碼包的準(zhǔn)備和下載8第4章 Linux 內(nèi)核9第5章 RTC芯片105.1 RTC芯片簡述10
2、5.2 I2C總線簡介10第6章 字符設(shè)備驅(qū)動(dòng)相關(guān)知識(shí)116.1 模塊機(jī)制116.2 字符設(shè)備開發(fā)基本步驟126.3 主設(shè)備號(hào)和次設(shè)備號(hào)126.4 實(shí)現(xiàn)字符驅(qū)動(dòng)程序13第7章 RTC驅(qū)動(dòng)實(shí)現(xiàn)167.1 設(shè)計(jì)思路167.2 RTC程序?qū)崿F(xiàn)167.2.1 RTC基本數(shù)據(jù)結(jié)構(gòu)16注冊字符設(shè)備167.2.3 定義操作函數(shù)177.2.4 函數(shù)聲明187.3 編譯生成.ko文件187.4 實(shí)際運(yùn)行及結(jié)果18第8章 結(jié)論20謝 辭21參 考 文 獻(xiàn)22附錄A RTC驅(qū)動(dòng)程序23附錄B Makefile文件41附錄C 應(yīng)用層測試程序41基于Linux操作系統(tǒng)下RTC驅(qū)動(dòng)開發(fā)摘 要:論文主要研究了Linux系統(tǒng)
3、下的RTC芯片驅(qū)動(dòng)架構(gòu),并設(shè)計(jì)了一個(gè)基于Tiny210開發(fā)板的RTC字符設(shè)備驅(qū)動(dòng)。首先對Linux體系進(jìn)行了簡單介紹,分析了Linux系統(tǒng)的應(yīng)用和特性,并對現(xiàn)有平臺(tái)Tiny210開發(fā)板進(jìn)行了簡單分析。在對實(shí)際項(xiàng)目RTC驅(qū)動(dòng)開發(fā)的分析設(shè)計(jì)的基礎(chǔ)上,采用了以動(dòng)態(tài)模塊加載方式的字符設(shè)備驅(qū)動(dòng)模型。在對RTC芯片各個(gè)模塊的簡單介紹中快速構(gòu)建和開發(fā)了一個(gè)該芯片的驅(qū)動(dòng)模型,實(shí)現(xiàn)了對硬件時(shí)間的讀寫、鬧鐘的設(shè)置功能。減少了開發(fā)的復(fù)雜性,縮短了開發(fā)時(shí)間,且具有很強(qiáng)的可擴(kuò)展、可移植性。關(guān)鍵詞:Linux操作系統(tǒng);Tiny210開發(fā)板;字符設(shè)備驅(qū)動(dòng);RTC芯片Driver Development of Real Ti
4、mer 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 systems, and existing plat
5、forms 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 the chip driver, the real
6、ization 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章 Linux概述1.1 Linux操作系統(tǒng)的誕
7、生和發(fā)行版 1.1.1 Linux系統(tǒng)的誕生 1981年IBM推出了微型計(jì)算機(jī)IBM PC。在它推出的前10年內(nèi),MS-DOS操作系統(tǒng)主宰了整個(gè)計(jì)算機(jī)操作系統(tǒng)界。而在當(dāng)時(shí),計(jì)算機(jī)硬件的價(jià)格在不斷下跌,但軟件仍處于高位。蘋果的操作系統(tǒng)MacOS的是無疑是最好的性能,但價(jià)格高,沒有人可以輕易接近。到1991年,隨著GNU計(jì)劃開發(fā)出來了一些工具,以及GNU C編譯器的發(fā)布。甚至MINIX也因?yàn)榘鏅?quán)開始需要購買才能獲得源代碼。在GNU HURD操作系統(tǒng)的開發(fā)工作卻不是能在幾年內(nèi)完成的。對于萊納斯來說,已經(jīng)等不及了。起初,他只是為了學(xué)習(xí)386架構(gòu)的編程技術(shù),但隨后的Linux開發(fā)過程已經(jīng)徹底改變了他的主
8、意。在1991年初,萊納斯在學(xué)習(xí)MINIX的操作系統(tǒng)的時(shí)候產(chǎn)生了開發(fā)一個(gè)新的屬于自己的理想中的操作系統(tǒng)的想法。最早與Linux(當(dāng)然此時(shí)還不叫Linux 這個(gè)名稱)相關(guān)的新聞是萊納斯在1991年7月3號(hào)的comp.os.minix上發(fā)布的消息。而在萊納斯8 月25 日發(fā)布的消息中,他第一次向外界透露出有開發(fā)免費(fèi)的操作系統(tǒng)的意向,可是它并不會(huì)象GNU 那種現(xiàn)在已經(jīng)在行業(yè)中成型的系統(tǒng)那樣專業(yè),而代碼量不會(huì)很大1。直到1991 年的10 月5 日,萊納斯在comp.os.minix 新聞組上發(fā)布消息,正式向外宣布Linux 內(nèi)核系統(tǒng)的誕生(Free minix-like kernel sources
9、 for 386-AT)。這段消息就是直到今日都廣為流傳的被稱為Linux的誕生宣言。因此對Linux 社區(qū),及其所用用戶來說,10月5日都是一個(gè)特殊的日子。直到今天,包括現(xiàn)在的Red Hat公司在內(nèi)的很多公司都會(huì)在發(fā)布許多Linux 的新版本時(shí)選擇了這個(gè)日子。 Linux是一種源于UNIX的操作系統(tǒng),雖然從嚴(yán)格意義上講,Linux這個(gè)詞實(shí)際上是指Linux內(nèi)核,但實(shí)際上人們已經(jīng)習(xí)慣了把整個(gè)基于Linux內(nèi)核以及在此基礎(chǔ)上的各種工具的操作系統(tǒng)統(tǒng)稱為Linux。 1.1.2 Linux 發(fā)行版 通常來講,一個(gè)Linux的發(fā)行版不僅僅是指Linux內(nèi)核,還包括了使用Linux的軟件的安裝工具,以及
10、各種工具軟件,而在一些特定的版本中中也有一些特定軟件,只不過現(xiàn)在都習(xí)慣于把它們統(tǒng)稱為Linux發(fā)行版。每一種發(fā)行版的開發(fā)都是針對著不同的目標(biāo),像是支持不同計(jì)算機(jī)結(jié)構(gòu),更強(qiáng)調(diào)實(shí)時(shí)應(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)方面具有廣泛運(yùn)用。直到現(xiàn)在,Linux還是提供網(wǎng)站服務(wù)供應(yīng)商最常使用的平臺(tái)。雖然因?yàn)樾碌木幊陶Z言的興起,它的市場份額在不斷減少,但在嵌入式行業(yè),Lin
11、ux基于其低廉成本與小體積依然是不可動(dòng)搖的霸主,像在機(jī)頂盒、手機(jī)及移動(dòng)裝置等硬件平臺(tái)上,Linux已經(jīng)是不可或缺的3。 1.2.2 Linux 的特性 完全兼容 因?yàn)長inux兼容了POSIX1.0標(biāo)準(zhǔn),所以一些常見的Windows的程序完全可以在Linux上無障礙運(yùn)行,這也為用戶從Windows轉(zhuǎn)到Linux提供了方便。因?yàn)楝F(xiàn)在Windows的巨大影響力,許多用戶在使用Linux前,都會(huì)因?yàn)橐郧癢indows的使用習(xí)慣而擔(dān)心能否適應(yīng)新的環(huán)境,而這一點(diǎn)就使他們不在顧慮。 完全免費(fèi),發(fā)展迅速 Linux是一款完全免費(fèi)的操作系統(tǒng)。因?yàn)長inux社區(qū)的存在,所有的Linux用戶都可以輕易的得到當(dāng)前任
12、意版本的Linux的源代碼,并按照自己的意愿來修改它。正是由于這一點(diǎn),每時(shí)每刻,每一次的技術(shù)進(jìn)步,每一種新平臺(tái)面世,都有來自世界各地的精英都參與了Linux的更新和實(shí)現(xiàn),無數(shù)的靈感跟不斷進(jìn)步的技術(shù)與編程思想,讓Linux有了無窮的可能性,并在無數(shù)程序員的努力下不斷壯大。 多用戶、多任務(wù) 正如當(dāng)今世界發(fā)展的主流那樣,Linux也支持多用戶。這保證了各用戶的相對獨(dú)立,之間互不影響,都對于自己的文件設(shè)備有自己的權(quán)利。而多任務(wù)則是現(xiàn)在各種智能設(shè)備的主要特點(diǎn),為了節(jié)省運(yùn)行時(shí)間和解放更多的系統(tǒng)資源,實(shí)現(xiàn)了多進(jìn)程的并行執(zhí)行,Linux操作系統(tǒng)就是其中的典范。 良好的界面 因?yàn)楝F(xiàn)在Windows系統(tǒng)的強(qiáng)烈影響
13、,Linux同時(shí)具有可以通過鍵盤輸入相應(yīng)的指令來進(jìn)行操作的字符界面和類似Windows圖形界面的X-Window系統(tǒng)提供的圖形界面。后者使用戶可以類似于Windows操作系統(tǒng)使用鼠標(biāo)對其進(jìn)行操作,而不會(huì)因?yàn)檗D(zhuǎn)換了操作系統(tǒng)感到不適應(yīng)。 豐富的網(wǎng)絡(luò)功能 Unix最大的優(yōu)勢就是其強(qiáng)大的網(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)用到網(wǎng)絡(luò)服務(wù)器這類有較高穩(wěn)定性要求的服務(wù)上有非常
14、高的適應(yīng)性。 支持多種平臺(tái) Linux作為一種嵌入式操作系統(tǒng),在各種移動(dòng)裝置上應(yīng)用廣泛。Linux因?yàn)槠溟_源的特性使它基本可以在市場上絕大部分的硬件平臺(tái)上運(yùn)行,這也使它精簡體積小的內(nèi)核可以方便地移植多種嵌入式處理器上。 第2章 Tiny210開發(fā)板2.1 Tiny210 簡介Tiny210是一款高性能的Cortex A8核心板,它由廣州友善之臂設(shè)計(jì)、生產(chǎn)和發(fā)行銷售。它采用三星S5PV210作為主處理器,運(yùn)行主頻可高達(dá)1GHz。S5PV210內(nèi)部集成了PowerVR SGX540高性能圖形引擎,支持3D圖形流暢運(yùn)行,并可流暢播放1080P大尺寸視頻4。Tiny210主要采用了2.0mm間距的雙排
15、針,引出CPU大部分常用功能引腳,并力求和Tiny6410核心板三排引腳兼容(P1,P2,CON2) 5。2.2 Tiny210硬件配置如圖2-1: 2.3 軟件支持 Superboot-210 Android 4.0 WindowsCE6第3章 移植前準(zhǔn)備3.1軟件平臺(tái)的搭建 3.1.1 虛擬機(jī)的安裝在有了硬件平臺(tái)的支持下(Tiny210開發(fā)板)開始進(jìn)行軟件平臺(tái)的搭建。在pc機(jī)上安裝一個(gè)虛擬機(jī),本文選用的虛擬機(jī)是VMware Workstation 。虛擬機(jī)其實(shí)就是在主機(jī)中占用一塊內(nèi)存在主機(jī)的硬件平臺(tái)上搭建一個(gè)類似主機(jī)的運(yùn)行環(huán)境,在 VMware中,你可以在一個(gè)以主機(jī)的分割的內(nèi)存為基礎(chǔ)的窗口
16、中加載一臺(tái)虛擬機(jī),運(yùn)行自己的操作系統(tǒng)和應(yīng)用程序,而不影響主機(jī)任何操作。 3.1.2 Red Hat Linux 的安裝在安裝了Vmware Workstation 的條件下,創(chuàng)建一個(gè)虛擬機(jī)給它分配20G的磁盤大小。512M的內(nèi)存空間。然后從網(wǎng)上下載Red Hat Linux 操作系統(tǒng)安裝包iso文件,我下載的是Red Hat Linux-5的iso文件,該版本的Linux內(nèi)核時(shí)3.0的,相對來說是版本比較高的內(nèi)核。在獲得Red Hat的iso文件后,在創(chuàng)建的虛擬機(jī)中安裝該Linux操作系統(tǒng)。 3.1.3 軟件包和源碼包的準(zhǔn)備和下載需要的軟件有交叉編譯器arm-Linux-gcc ,我選用的交叉
17、編譯器為Tiny210的開發(fā)自帶的交叉編譯器,該編譯器是4.0版本以上的,正是由于我即將下載內(nèi)核源碼版本比較高,因此我們選用的交叉編譯器的版本也是相對來說比較高的。從網(wǎng)站下載Linux的內(nèi)核源代碼linux-3.0.8.tar.gzRTC 。Boot Loader 是在硬件平臺(tái)運(yùn)行之前完成對硬件的初始化病喚醒操作系統(tǒng)的程序。就是通過Boot Loader來實(shí)現(xiàn)初始化硬件設(shè)備,從而給操作系統(tǒng)提供了一個(gè)合適的軟硬件環(huán)境,并為調(diào)用它做好準(zhǔn)備。我選擇的Boot Loader是U_boot6。第4章 Linux 內(nèi)核現(xiàn)在自己的當(dāng)前目錄,即目錄下,解壓自己的內(nèi)核源代碼:解壓Li
18、nux內(nèi)核源碼包,在當(dāng)前目錄下生成一相應(yīng)的文件夾linux-3.0.8,這就是該內(nèi)核的所有實(shí)現(xiàn)代碼。Linux的內(nèi)核的目錄包含很多個(gè)文件夾,分別用于實(shí)現(xiàn)不同的功能(如圖4-1)7。(假設(shè)相對于Linux-3.0.8):圖4-1 Linux根目錄 其中有幾個(gè)比較重要的需要著重了解: /drivers 驅(qū)動(dòng)目錄,該目錄是所有被加載到內(nèi)核的設(shè)備驅(qū)動(dòng)的程序。其中又把設(shè)備驅(qū)動(dòng)進(jìn)一步劃分成幾類,如字符設(shè)備驅(qū)動(dòng),塊設(shè)備驅(qū)動(dòng)等。 /include 該目錄包括編譯核心所需要的大部分頭文件,也是Linux下程序編譯的查找默認(rèn)路徑。 /net 該目錄里不用說就是核心的網(wǎng)絡(luò)層代碼。 /init 該目錄中包含內(nèi)核的所有
19、硬件初始化代碼,這是內(nèi)核所有工作的起點(diǎn),像是main.c和Version.c這兩個(gè)C語言程序的編譯入口文件就在其中,同時(shí)也是是所有進(jìn)程的最初父進(jìn)程。 /kernel 該內(nèi)核管理的核心代碼放在這里,也就是通常所說的內(nèi)核的具體實(shí)現(xiàn),一般除了內(nèi)核裁剪都不需要對它進(jìn)行操作。 /documentation 該目錄下是對每個(gè)目錄作用的具體說明的文檔以及一些功能的實(shí)例,就相當(dāng)于產(chǎn)品說明書。 /ipc 該目錄包含了核心進(jìn)程間的通信代碼,是Linux多任務(wù)特性具體實(shí)現(xiàn)。 /lib 該目錄是編譯默認(rèn)路徑,包含了內(nèi)核絕大部分的庫文件與代碼。 /modules 該目錄存放了已建好的、可動(dòng)態(tài)加載的模塊,裁剪內(nèi)核的主要工
20、作目標(biāo)。第5章 RTC芯片5.1 RTC芯片簡述 RTC(real time clock)實(shí)時(shí)時(shí)鐘,顧名思義,擁有真實(shí)時(shí)間的時(shí)鐘,其實(shí)它的主要作用就是在操作系統(tǒng)沒有工作的時(shí)候自主維護(hù)時(shí)間表,并在需要的時(shí)候給操作系統(tǒng)提供系統(tǒng)時(shí)間。開發(fā)板的時(shí)間系統(tǒng)可以分成兩種,分別是系統(tǒng)時(shí)間和硬件時(shí)間。硬件時(shí)間指的就是RTC芯片自主維護(hù)的時(shí)間,因?yàn)镽TC芯片是電池供電的,所以在硬件平臺(tái)掉電后時(shí)間表不會(huì)丟失。Linux內(nèi)核就把RTC芯片當(dāng)作“離線”的時(shí)間與日期維護(hù)器。當(dāng)Linux內(nèi)核啟動(dòng)時(shí),都要通過RTC來進(jìn)行初始化,從RTC中讀取時(shí)間保存到系統(tǒng)中,得到系統(tǒng)時(shí)間。而在運(yùn)行期間,內(nèi)核以軟件的形式維護(hù)系統(tǒng)的當(dāng)前時(shí)間與日
21、期,并在關(guān)機(jī)或必要的時(shí)候?qū)r(shí)間回寫RTC芯片,由它自主維護(hù)。另外如果RTC擁有了IRQ中斷并且可以定時(shí),那么RTC還可以作為一個(gè)鬧鐘用來在內(nèi)核睡眠時(shí)喚醒內(nèi)核。 Linux有兩種RTC驅(qū)動(dòng)的接口,一個(gè)是老的接口,專門用在PC機(jī)上的。另外一鐘新接口是基于Linux設(shè)備驅(qū)動(dòng)程序的。而后者創(chuàng)建了一個(gè)RTC驅(qū)動(dòng)模型,并注冊到RTC核心中,把所有工作交由RTC芯片完成。5.2 I2C總線簡介I2C總線是一種由Philips公司開發(fā)的兩線式串行總線標(biāo)準(zhǔn),用于鏈接微控制器及其外圍設(shè)備。I2C有100K和400K兩種工作速率,它支持多機(jī)通訊和多主控模塊設(shè)計(jì),并且每個(gè)電路模塊都有唯一的地址,還允許每個(gè)在
22、I2C總線上的期間都可以使用獨(dú)立的電源。本文就是介紹基于I2C總線的Linux字符設(shè)備驅(qū)動(dòng)。I2C由數(shù)據(jù)線(SDA)和時(shí)鐘線(SCL)構(gòu)成的同步串行總線,可發(fā)送和接受數(shù)據(jù),在處理器與控制芯片之間、芯片與芯片之間進(jìn)行雙向傳送8。I2C總線在傳送數(shù)據(jù)過程中共有三種類型信號(hào),它們分別是開始信號(hào)、結(jié)束信號(hào)和應(yīng)答信號(hào)9。第6章 字符設(shè)備驅(qū)動(dòng)相關(guān)知識(shí)6.1模塊機(jī)制 Linux提供了一種被稱為模塊(Module)的機(jī)制提供了對許多模塊支持,設(shè)備驅(qū)動(dòng)每個(gè)模塊由不同代碼組成,實(shí)現(xiàn)不同功能10(所有的模塊在一起才是一個(gè)可執(zhí)行程序)。insmod 將模塊動(dòng)態(tài)加載到正在運(yùn)行內(nèi)核;rmmod 程序移除模塊;Linux內(nèi)
23、核模塊的程序結(jié)構(gòu): module_init()加載模塊函數(shù)(必須) 使用insmod命令加載模塊時(shí),內(nèi)核就會(huì)執(zhí)行該模塊的加載函數(shù),也就是說這就是整個(gè)模塊函數(shù)的入口,就是通過它來完成模塊的初始化相關(guān)工作。 module_exit()卸載模塊函數(shù)(必須) 當(dāng)使用rmmod命令卸載某模塊時(shí),內(nèi)核就會(huì)執(zhí)行該這段函數(shù),完成對模塊的刪除和空間的釋放。 MODULE_LICENSE()模塊許可證聲明(必須) 這一段函數(shù)就是描述內(nèi)核將要加載的模塊的工作權(quán)限,如果在加載模塊時(shí)不聲明LICENSE,內(nèi)核就會(huì)報(bào)警:kernel tainted,意思就是內(nèi)核被污染。 module_param()模塊參數(shù)(可選) 這個(gè)
24、函數(shù)括號(hào)內(nèi)放置著模塊內(nèi)部聲明的全局變量,對應(yīng)著在加載模塊時(shí)rommod命令后面跟著的參數(shù),這些參數(shù)就會(huì)被傳入模塊內(nèi)。 EXPORT_SYMBOL()模塊導(dǎo)出符號(hào)(可選) 這個(gè)函數(shù)括號(hào)內(nèi)也放置著數(shù)量不等參數(shù),也就是符號(hào)(可以是函數(shù)或變量),而在這個(gè)模塊結(jié)束之后,其他模塊就可以通過這個(gè)符號(hào)使用本模塊中這些到處的參數(shù),變量或函數(shù)。 其他一些聲明MODULE_XXXXX()模塊聲明(可選)不同的聲明對應(yīng)著不同的功能選項(xiàng),視實(shí)際情況而定。 模塊加載函數(shù):static int _init initialization_rtc(void) /* 初始化代碼 */module_init(initializat
25、ion_rtc); 模塊卸載函數(shù)static void _exit cleanup_rtc(void) /* 釋放資源 */module_exit(cleanup_rtc); 6.2字符設(shè)備開發(fā)基本步驟 向內(nèi)核確定主該設(shè)備的主次設(shè)備號(hào) 實(shí)現(xiàn)字符驅(qū)動(dòng)程序: 填充file_operations結(jié)構(gòu)體 實(shí)現(xiàn)模塊加載函數(shù)用以注冊字符設(shè)備 實(shí)現(xiàn)模塊卸載函數(shù)完成模塊的釋放和刪除 創(chuàng)建設(shè)備文件節(jié)點(diǎn)6.3主、次設(shè)備號(hào)11 主設(shè)備號(hào)是內(nèi)核識(shí)別一個(gè)設(shè)備的標(biāo)識(shí)。整數(shù)(占12bits),范圍從0到4095,通常使用1到255。 次設(shè)備號(hào)由內(nèi)核使用,用于正確確定設(shè)備文件所指的設(shè)備。整數(shù)(占20bits),范圍從0到10
26、48575,一般使用0到255。 設(shè)備編號(hào)的內(nèi)部表達(dá) dev_t類型(32位,其中主設(shè)備號(hào)12位,次設(shè)備號(hào)20位): 是屬于Linux內(nèi)核編程的專有類型,用來保存設(shè)備編號(hào)。 從dev_t類型變量中獲得主設(shè)備號(hào)和次設(shè)備號(hào):這是兩個(gè)封裝好的函數(shù)MAJOR(dev_t rtc);/獲得主設(shè)備號(hào)MINOR(dev_t rtc);/獲得次設(shè)備號(hào) 將主設(shè)備號(hào)和次設(shè)備號(hào)轉(zhuǎn)換成dev_t類型:這也是一個(gè)封裝好的函數(shù)dev_t =MKDEV(int ,int ); 分配主設(shè)備號(hào) 手工分配主設(shè)備號(hào)的函數(shù):#include <linux/fs.h> /這是Linux內(nèi)核中有關(guān)設(shè)備號(hào)的頭文件int reg
27、ister_chrdev_region( dev_t num, unsigned int , char *rtc );這是自己手動(dòng)把num分配給rtc作為主設(shè)備號(hào)。 動(dòng)態(tài)分配主設(shè)備號(hào):#include <linux/fs.h> /這是Linux內(nèi)核中有關(guān)設(shè)備號(hào)的頭文件int alloc_chrdev_resion(dev_t *,unsigned int ,unsigned int ,char *rtc);這是內(nèi)核自動(dòng)分配一個(gè)設(shè)備好給rtc。 釋放設(shè)備號(hào)void unregister_chrdev(dev_t, unsigned int );在該設(shè)備號(hào)不再使用之后,釋放并刪除它,以
28、節(jié)約內(nèi)核資源。6.4實(shí)現(xiàn)字符驅(qū)動(dòng)程序?qū)崿F(xiàn)字符設(shè)備驅(qū)動(dòng),最重要的就是字符設(shè)備結(jié)構(gòu)體cdev,以及驅(qū)動(dòng)接口結(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; /*不常用*/ dev_t xxx; /*設(shè)備號(hào)*/ unsigned int xxx; /*不常用*/ ; file_operations 結(jié)構(gòu)體字符驅(qū)動(dòng)和內(nèi)核的
29、接口:在內(nèi)核代碼中,./include/linux/fs.h下的代碼實(shí)現(xiàn),定義了字符驅(qū)動(dòng)程序只要填充一個(gè)file_operations結(jié)構(gòu)體并把它注冊到內(nèi)核中,內(nèi)核就有了通過它操作這個(gè)字符設(shè)備的能力。 file_operations的主要成員:struct module *xxx: 指向模塊本身open: 提供打開設(shè)備的函數(shù)接口;release:提供關(guān)閉設(shè)備的函數(shù)接口;read: 實(shí)現(xiàn)從設(shè)備上讀取數(shù)據(jù)的函數(shù)接口;write: 實(shí)現(xiàn)向設(shè)備上寫入數(shù)據(jù)的函數(shù)接口;ioctl: I/O控制函數(shù);llseek: 定位讀寫指針位置并把他們輸出出來; ioctl函數(shù)為設(shè)備驅(qū)動(dòng)程序執(zhí)行用戶空間的“命令”提供了
30、一個(gè)特有的接口用來設(shè)置或者讀取設(shè)備的具體信息。 cmd 參數(shù)的定義Linux內(nèi)核對file_operations的ioctl()函數(shù)的cmd參數(shù)有特殊的定義:如圖6-1。圖6-1 cmd參數(shù)構(gòu)造命令編號(hào)的宏:_IO() 給沒有參數(shù)的命令;_IOR() 給從驅(qū)動(dòng)中讀數(shù)據(jù)的命令;_IOW() 給寫入數(shù)據(jù)的命令;_IOWR() 用于雙向傳輸。 Ioctl函數(shù)模板static long rtc_dev_ioctl(struct file *file,unsigned int cmd, unsigned long arg).switch (cmd) case RTC_EPOCH_SET:.Break;c
31、ase RTC_SET_TIME:.break;case RTC_IRQP_SET:.break;case RTC_PIE_ON:.break;.圖6-2 字符設(shè)備驅(qū)動(dòng) 第7章 RTC驅(qū)動(dòng)實(shí)現(xiàn)7.1 設(shè)計(jì)思路Linux設(shè)備驅(qū)動(dòng)屬于內(nèi)核的一部分,Linux內(nèi)核的驅(qū)動(dòng)模塊可以用兩種不同的方式加載和編譯: 通過內(nèi)核裁剪,隨同Linux的啟動(dòng)直接加載編譯進(jìn)Linux內(nèi)核; 把驅(qū)動(dòng)程序編譯成一個(gè)可加載和刪除的動(dòng)態(tài)模塊,可以在需要時(shí)隨時(shí)使用insmod命令加載,rmmod命令刪除。這種方式更快,也節(jié)省了內(nèi)核資源,控制了內(nèi)核的大小,而模塊一旦被插入內(nèi)核,就和其他被直接初始化到內(nèi)核中的模塊一樣了。這次的RTC
32、驅(qū)動(dòng)就采用動(dòng)態(tài)模塊加載的方式,將程序主體分成3個(gè)部分。分別是注冊字符設(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;int wday;int yday;int isdst;這個(gè)結(jié)構(gòu)體代表了硬件時(shí)間與日期,從RTC芯片讀取的時(shí)間和日期就
33、分開保存在這個(gè)結(jié)構(gòu)體中 7.2.2注冊字符設(shè)備 模塊初始化函數(shù): init_rtc static int _init init_rtc(void) rtc_class = class_create(THIS_MODULE, "rtc"); int err;err = alloc_chrdev_region(&rtc_devt, 0, RTC_DEV_MAX, "rtc&q
34、uot;); rtc_dev_init(); rtc_sysfs_init(rtc_class); if (err < 0)printk(KERN_ERR "%s: failed to allocate char dev regionn",_FILE_); return 0;
35、; Init_rtc首先創(chuàng)建了一個(gè)類rtc12。類本身就是一個(gè)高度面向?qū)ο蟮漠a(chǎn)物,而用戶空間就可以在不知道如何實(shí)現(xiàn)的情況下直接得到結(jié)果,驅(qū)動(dòng)程序也不用直接處理,只要調(diào)用就行了。 7.2.3 定義操作函數(shù) dev.c 填充了file_operations結(jié)構(gòu)rtc_foperations,以及這些操作函數(shù)的具體實(shí)現(xiàn)。rtc_foperations- rtc基本的文件操作: static const struct file_operations rtc_foperations =
36、; .owner = THIS_MODULE, .llseek = null, .read = read, .poll = poll, .unlock
37、ed_ioctl = ioctl, .open = openfile, .release = release, .fasync = fasync, 7.2.4 函數(shù)聲明ioctl.c里的所有函數(shù)的實(shí)現(xiàn)都對應(yīng)于dev.c 中rtc_i
38、octl相應(yīng)的命令,其中RTC_RD_TIME與RTC_SET_TIME兩個(gè)命令需要特別注意,這是RTC最基本的功能函數(shù)獲取時(shí)間和設(shè)置時(shí)間。7.3 運(yùn)行步驟通過編寫的Makefile及arm-linux-gcc編譯生成rtc.ko文件,如圖7-1。圖7-1 編譯生成.ko文件編寫用戶層測試程序,并編譯成可執(zhí)行程序qq。7.4 實(shí)際運(yùn)行及結(jié)果將生成的.ko模塊和應(yīng)用層測試程序qq下載的目標(biāo)板,運(yùn)行過程如圖7-2:用insmod裝載模板。創(chuàng)建設(shè)備節(jié)點(diǎn): mknod /dev/rtc c 250 0修改執(zhí)行程序權(quán)限: chmod 777 qq執(zhí)行測試程序。圖7-2 運(yùn)行過程結(jié)果如圖7-3:圖7-3
39、運(yùn)行結(jié)果第8章 結(jié)論本論文中對Linux的發(fā)展跟現(xiàn)狀進(jìn)行了了解,還在對課題基于Linux操作系統(tǒng)下RTC驅(qū)動(dòng)開發(fā)的基礎(chǔ)上對Linux內(nèi)核進(jìn)行了大致的分析,并在課題最后進(jìn)行了相對于RTC驅(qū)動(dòng)模塊的應(yīng)用層測試軟件的編寫。在本文中嵌入式系統(tǒng)選擇的是Linux系統(tǒng),它具有占有內(nèi)存小和運(yùn)行速率高的優(yōu)點(diǎn)。并采用了模塊化的指導(dǎo)設(shè)計(jì)方法開發(fā)設(shè)備驅(qū)動(dòng),提高了程序的可讀性和可移植性。本文將字符設(shè)備分為了設(shè)備注冊、函數(shù)功能實(shí)現(xiàn)以及調(diào)用接口,并對程序進(jìn)行了應(yīng)用層的實(shí)例驗(yàn)證。由于時(shí)間的原因,本文中RTC字符驅(qū)動(dòng)的程序設(shè)計(jì)還是有些簡單,在以后的學(xué)習(xí)工作中還需要進(jìn)一步改善。在以后對驅(qū)動(dòng)的學(xué)習(xí)中,希望能夠不斷完善RTC芯片的
40、功能實(shí)現(xiàn),并在在嵌入式Linux操作系統(tǒng)的建立中,以內(nèi)核剪裁的方式將驅(qū)動(dòng)程序移植到Linux內(nèi)核中去,努力做出更為精簡穩(wěn)定的內(nèi)核系統(tǒng)。謝 辭首先,向我的指導(dǎo)老師趙老師和劉老師表示感謝,感謝老師們一直以來對我的關(guān)懷和悉心指導(dǎo),并在完成畢業(yè)設(shè)計(jì)的過程中讓我體會(huì)到了也學(xué)到了很多。在整個(gè)畢業(yè)設(shè)計(jì)指導(dǎo)活動(dòng)中,老師的豐富經(jīng)驗(yàn)和對整個(gè)行業(yè)脈絡(luò)的把握,都是年輕的我難以望其項(xiàng)背的,并在整個(gè)課題的完成過程中起到了至關(guān)重要的作用。趙老師教學(xué)作風(fēng)的和劉老師的治學(xué)風(fēng)格都讓我留下了很深的印象。 同時(shí)也要感謝培訓(xùn)班的所有同學(xué),在臨近畢業(yè)的培訓(xùn)過程中,對我的關(guān)心和幫助。感謝他們不厭其煩地指導(dǎo)我解決了不少項(xiàng)目上的難題,她們積極
41、向上的學(xué)習(xí)態(tài)度也是我奮斗下去的動(dòng)力。感謝我的親人,在這四年里是他們給我無數(shù)的鼓勵(lì)、支持和幫助,正因?yàn)橛兴麄兾也拍芨吲d順利的完成大學(xué)學(xué)業(yè),并學(xué)到了很多專業(yè),以及很多人生道路上的寶貴財(cái)富。 最后感謝各位評閱老師在百忙之中抽空評閱我的論文。參 考 文 獻(xiàn)1 徐俊仕.基于嵌入式Linux的車載GPS導(dǎo)航系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)D西安:西北工業(yè)大學(xué)機(jī)械電子工程學(xué)院,2007.2 戴明華,李長云,曾志浩,崔海燕. 嵌入式Linux驅(qū)動(dòng)程序框架研究綜述J. 長沙大學(xué)學(xué)報(bào),2012,02:52-53.3 方先康.基于powerpc處理器MPC8541E的嵌入式Linux系統(tǒng)開發(fā)D北京:北京郵電大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,
42、2011.4 張利平.基于MPC8536的雷達(dá)嵌入式數(shù)據(jù)處理平臺(tái)設(shè)計(jì)D.成都:中國西南電子技術(shù)研究所,2012.5 羅澤勇.一種基于powerpc的嵌入式信號(hào)處理平臺(tái)的設(shè)計(jì)D.西安:西安電子科技大學(xué),2011.6 董文軍. Linux驅(qū)動(dòng)程序兼容性的相關(guān)問題J.單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2010,03:16-18.7 董闖.基于MPC85xx的U-boot啟動(dòng)流程分析和移植D,北京:北京郵電大學(xué),2009.8 周立功,陳明計(jì),陳渝ARM嵌入式Linux系統(tǒng)構(gòu)建與驅(qū)動(dòng)開發(fā)范例M北京:北京航空航天大學(xué)出版社,2006.9 王淑貞U-Boot在S3C2410上的移植J.微計(jì)算機(jī)應(yīng)用,2008,29(4
43、):95-97.10 LTIB user manual Linux Target Image Builder,Freescale,2006.11 史勝輝.基于嵌入式Linux的頻譜分析儀軟件系統(tǒng)設(shè)計(jì)D.成都:電子科技大學(xué),2011.12 MPC8536 datasheet MPC8536E PowerQUICC III tm Integrated Processor Product Brief ,2009.附錄A RTC驅(qū)動(dòng)程序Class.c#include <linux/module.h>#include <linux/rtc.h>#include <linux
44、/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 void rtc_device_release(struct device *dev)struct rtc_device *rtc = to_rtc_de
45、vice(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, old_delta;static int rtc_suspend(struct device *dev, pm_message_t mesg)struc
46、t 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 = timespec_sub(delta, old_delta);if (delta_delta.tv_sec < -2 | delta_delt
47、a.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_system, new_rtc;struct timespecsleep_time;if (strcmp(dev_name(&rtc->de
48、v), 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_to_time(&tm, &new_rtc.tv_sec);new_rtc.tv_nsec = 0;if (new_rtc.tv_se
49、c < 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_time.tv_sec >= 0)timekeeping_inject_sleeptime(&sleep_time);return
50、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_wkalrm alrm;int id, err;if (idr_pre_get(&rtc_idr, GFP_KERNEL) = 0) err = -E
51、NOMEM;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 (rtc = NULL) err = -ENOMEM;goto exit_idr;rtc->id = id;rtc->ops = ops;r
52、tc->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->irq_lock);spin_lock_init(&rtc->irq_task_lock);init_waitqueue_head(
53、&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_rtctimer, rtc_uie_update_irq, (void *)rtc);hrtimer_init(&rtc->pie_ti
54、mer, 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, &alrm);strlcpy(rtc->name, name, RTC_DEVICE_NAME_SIZE);dev_set_name(&
55、amp;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(rtc);dev_info(dev, "rtc core: registered %s as %sn",rtc->name,
56、 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",name, err);return ERR_PTR(err);EXPORT_SYMBOL_GPL(rtc_device_register);void
57、 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(void)rtc_class = class_create(THIS_MODULE, "rtc");if (IS_ERR(rtc_class) printk(K
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 酒店安全檢查與隱患防范措施
- 人教版新教材英語七年級下冊Unit1課文原文翻譯
- 跨國公司區(qū)域采購戰(zhàn)略管理設(shè)計(jì)
- 跨行業(yè)財(cái)務(wù)報(bào)告對比與成本控制方法創(chuàng)新
- 科技創(chuàng)新驅(qū)動(dòng)制造業(yè)智能化升級的路徑
- 河北省邢臺(tái)市巨鹿縣二中2024年高三下學(xué)期高中等級考質(zhì)量抽測數(shù)學(xué)試題試卷
- 2024-2025學(xué)年江蘇省鹽城市解放路實(shí)驗(yàn)學(xué)校小學(xué)六年級數(shù)學(xué)畢業(yè)檢測指導(dǎo)卷含解析
- 路氹城2025年數(shù)學(xué)四年級第二學(xué)期期末統(tǒng)考模擬試題含解析
- 貴金屬在醫(yī)療設(shè)備制造中的創(chuàng)新技術(shù)
- 2025福建省港口集團(tuán)有限責(zé)任公司秋季校園招聘97人起筆試參考題庫附帶答案詳解
- 中國后循環(huán)缺血的專家共識(shí)48506課件
- 信用管理概論課件整書電子教案完整版教學(xué)課件全套ppt教學(xué)教程最全課件最新
- 思想道德與法治全冊教案
- (高職)旅游景區(qū)服務(wù)與管理電子課件完整版PPT全書電子教案
- 唯美動(dòng)畫生日快樂電子相冊視頻動(dòng)態(tài)PPT模板
- 設(shè)計(jì)文件簽收表(一)
- 試運(yùn)行方案計(jì)劃-
- 可研匯報(bào)0625(專家評審)
- 帶電核相試驗(yàn)報(bào)告
- SCH壁厚等級對照表
- 春季常見傳染病預(yù)防知識(shí)PPT課件
評論
0/150
提交評論