




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、目 錄中文摘要1ABSTRACT2第1章 Linux概述31.1 Linux操作系統的誕生和發行版31.1.1 Linux系統的誕生31.1.2 Linux 發行版31.2 Linux應用和特性41.2.1 linux 的應用41.2.2 linux 的特性4第2章 Tiny210開發板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 內核9第5章 RTC芯片105.1 RTC芯片簡述10
2、5.2 I2C總線簡介10第6章 字符設備驅動相關知識116.1 模塊機制116.2 字符設備開發基本步驟126.3 主設備號和次設備號126.4 實現字符驅動程序13第7章 RTC驅動實現167.1 設計思路167.2 RTC程序實現167.2.1 RTC基本數據結構167.2.2注冊字符設備167.2.3 定義操作函數177.2.4 函數聲明187.3 編譯生成.ko文件187.4 實際運行及結果18第8章 結論20謝 辭21參 考 文 獻22附錄A RTC驅動程序23附錄B Makefile文件41附錄C 應用層測試程序41-19-基于Linux操作系統下RTC驅動開發摘 要:論文主要研
3、究了Linux系統下的RTC芯片驅動架構,并設計了一個基于Tiny210開發板的RTC字符設備驅動。首先對Linux體系進行了簡單介紹,分析了Linux系統的應用和特性,并對現有平臺Tiny210開發板進行了簡單分析。在對實際項目RTC驅動開發的分析設計的基礎上,采用了以動態模塊加載方式的字符設備驅動模型。在對RTC芯片各個模塊的簡單介紹中快速構建和開發了一個該芯片的驅動模型,實現了對硬件時間的讀寫、鬧鐘的設置功能。減少了開發的復雜性,縮短了開發時間,且具有很強的可擴展、可移植性。關鍵詞:Linux操作系統;Tiny210開發板;字符設備驅動;RTC芯片蚌埠學院本科畢業設計(論文)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操作系統的誕生和發行版 1.1.1 Linux系統的誕生 1981年IBM推出了微型計算機IBM PC。在它推出的前10年內,MS-DOS操作系統主宰了整個計算機操作系統界。而在當時,計算機硬件的價格在不斷下跌,但軟件仍處于高位。蘋果的操作系統MacOS的是無疑是最好的性能,但價格高,沒有人可以輕易接近。到1991年,隨著GNU計劃開發出來了一些工具,以及GNU C編譯器的發布。甚至MINIX也因為版權開始需要購買才能獲得源代碼。在GNU HURD操作系統的開發工作卻不是能在幾年內完成的。對于萊納斯來說,已經等不及了。起初,他只是為了學習386架構的編程技術,
8、但隨后的Linux開發過程已經徹底改變了他的主意。在1991年初,萊納斯在學習MINIX的操作系統的時候產生了開發一個新的屬于自己的理想中的操作系統的想法。最早與Linux(當然此時還不叫Linux 這個名稱)相關的新聞是萊納斯在1991年7月3號的comp.os.minix上發布的消息。而在萊納斯8 月25 日發布的消息中,他第一次向外界透露出有開發免費的操作系統的意向,可是它并不會象GNU 那種現在已經在行業中成型的系統那樣專業,而代碼量不會很大1。直到1991 年的10 月5 日,萊納斯在comp.os.minix 新聞組上發布消息,正式向外宣布Linux 內核系統的誕生(Free mi
9、nix-like kernel sources for 386-AT)。這段消息就是直到今日都廣為流傳的被稱為Linux的誕生宣言。因此對Linux 社區,及其所用用戶來說,10月5日都是一個特殊的日子。直到今天,包括現在的Red Hat公司在內的很多公司都會在發布許多Linux 的新版本時選擇了這個日子。 Linux是一種源于UNIX的操作系統,雖然從嚴格意義上講,Linux這個詞實際上是指Linux內核,但實際上人們已經習慣了把整個基于Linux內核以及在此基礎上的各種工具的操作系統統稱為Linux。 1.1.2 Linux 發行版 通常來講,一個Linux的發行版不僅僅是指Linux內核
10、,還包括了使用Linux的軟件的安裝工具,以及各種工具軟件,而在一些特定的版本中中也有一些特定軟件,只不過現在都習慣于把它們統稱為Linux發行版。每一種發行版的開發都是針對著不同的目標,像是支持不同計算機結構,更強調實時應用,和專門面向嵌入式系統等。主流的Linux發型版有Ubuntu,Red Hat等等。1.2 Linux應用和特性 1.2.1 Linux 的應用Linux的基本思想就是萬物皆文件,因此它擁有極高的靈活性和可移植性,再加上它的UNIX背景,使它Linux在服務器的操作系統方面具有廣泛運用。直到現在,Linux還是提供網站服務供應商最常使用的平臺。雖然因為新的編程語言的興起,
11、它的市場份額在不斷減少,但在嵌入式行業,Linux基于其低廉成本與小體積依然是不可動搖的霸主,像在機頂盒、手機及移動裝置等硬件平臺上,Linux已經是不可或缺的3。 1.2.2 Linux 的特性 完全兼容 因為Linux兼容了POSIX1.0標準,所以一些常見的Windows的程序完全可以在Linux上無障礙運行,這也為用戶從Windows轉到Linux提供了方便。因為現在Windows的巨大影響力,許多用戶在使用Linux前,都會因為以前Windows的使用習慣而擔心能否適應新的環境,而這一點就使他們不在顧慮。 完全免費,發展迅速 Linux是一款完全免費的操作系統。因為Linux社區的存
12、在,所有的Linux用戶都可以輕易的得到當前任意版本的Linux的源代碼,并按照自己的意愿來修改它。正是由于這一點,每時每刻,每一次的技術進步,每一種新平臺面世,都有來自世界各地的精英都參與了Linux的更新和實現,無數的靈感跟不斷進步的技術與編程思想,讓Linux有了無窮的可能性,并在無數程序員的努力下不斷壯大。 多用戶、多任務 正如當今世界發展的主流那樣,Linux也支持多用戶。這保證了各用戶的相對獨立,之間互不影響,都對于自己的文件設備有自己的權利。而多任務則是現在各種智能設備的主要特點,為了節省運行時間和解放更多的系統資源,實現了多進程的并行執行,Linux操作系統就是其中的典范。 良
13、好的界面 因為現在Windows系統的強烈影響,Linux同時具有可以通過鍵盤輸入相應的指令來進行操作的字符界面和類似Windows圖形界面的X-Window系統提供的圖形界面。后者使用戶可以類似于Windows操作系統使用鼠標對其進行操作,而不會因為轉換了操作系統感到不適應。 豐富的網絡功能 Unix最大的優勢就是其強大的網絡功能,而從Unix衍生出來的Linux系統也繼承了它在網絡功能上的優勢。Linux的網絡功能和其內核緊密相連,在這方面它要比其他操作系統更有優勢。 可靠的安全、穩定性能 Linux采取了許多安全技術措施為內部信息安全提供了保障。而且Linux的極高的穩定性使它在對要應用
14、到網絡服務器這類有較高穩定性要求的服務上有非常高的適應性。 支持多種平臺 Linux作為一種嵌入式操作系統,在各種移動裝置上應用廣泛。Linux因為其開源的特性使它基本可以在市場上絕大部分的硬件平臺上運行,這也使它精簡體積小的內核可以方便地移植多種嵌入式處理器上。 第2章 Tiny210開發板2.1 Tiny210 簡介Tiny210是一款高性能的Cortex A8核心板,它由廣州友善之臂設計、生產和發行銷售。它采用三星S5PV210作為主處理器,運行主頻可高達1GHz。S5PV210內部集成了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開發板)開始進行軟件平臺的搭建。在pc機上安裝一個虛擬機,本文選用的虛擬機是VMware Workstation 。虛擬機其實就是在主機中占用一塊內存在主機的硬
16、件平臺上搭建一個類似主機的運行環境,在 VMware中,你可以在一個以主機的分割的內存為基礎的窗口中加載一臺虛擬機,運行自己的操作系統和應用程序,而不影響主機任何操作。 3.1.2 Red Hat Linux 的安裝在安裝了Vmware Workstation 的條件下,創建一個虛擬機給它分配20G的磁盤大小。512M的內存空間。然后從網上下載Red Hat Linux 操作系統安裝包iso文件,我下載的是Red Hat Linux-5的iso文件,該版本的Linux內核時3.0的,相對來說是版本比較高的內核。在獲得Red Hat的iso文件后,在創建的虛擬機中安裝該Linux操作系統。 3.
17、1.3 軟件包和源碼包的準備和下載需要的軟件有交叉編譯器arm-Linux-gcc ,我選用的交叉編譯器為Tiny210的開發自帶的交叉編譯器,該編譯器是4.0版本以上的,正是由于我即將下載內核源碼版本比較高,因此我們選用的交叉編譯器的版本也是相對來說比較高的。從網站下載Linux的內核源代碼linux-3.0.8.tar.gzRTC 。Boot Loader 是在硬件平臺運行之前完成對硬件的初始化病喚醒操作系統的程序。就是通過Boot Loader來實現初始化硬件設備,從而給操作系統提供了一個合適的軟硬件環境,并為調用它做好準備。我選擇的Boot Loader是U
18、_boot6。第4章 Linux 內核現在自己的當前目錄,即目錄下,解壓自己的內核源代碼: tar xvzf linux-3.0.8.tgz解壓Linux內核源碼包,在當前目錄下生成一相應的文件夾linux-3.0.8,這就是該內核的所有實現代碼。Linux的內核的目錄包含很多個文件夾,分別用于實現不同的功能(如圖4-1)7。(假設相對于Linux-3.0.8):圖4-1 Linux根目錄 其中有幾個比較重要的需要著重了解: /drivers 驅動目錄,該目錄是所有被加載到內核的設備驅動的程序。其中又把設備驅動進一步劃分成幾類,如字符設備驅動,塊設備驅動等。 /include 該目錄包括編譯核
19、心所需要的大部分頭文件,也是Linux下程序編譯的查找默認路徑。 /net 該目錄里不用說就是核心的網絡層代碼。 /init 該目錄中包含內核的所有硬件初始化代碼,這是內核所有工作的起點,像是main.c和Version.c這兩個C語言程序的編譯入口文件就在其中,同時也是是所有進程的最初父進程。 /kernel 該內核管理的核心代碼放在這里,也就是通常所說的內核的具體實現,一般除了內核裁剪都不需要對它進行操作。 /documentation 該目錄下是對每個目錄作用的具體說明的文檔以及一些功能的實例,就相當于產品說明書。 /ipc 該目錄包含了核心進程間的通信代碼,是Linux多任務特性具體實
20、現。 /lib 該目錄是編譯默認路徑,包含了內核絕大部分的庫文件與代碼。 /modules 該目錄存放了已建好的、可動態加載的模塊,裁剪內核的主要工作目標。第5章 RTC芯片5.1 RTC芯片簡述 RTC(real time clock)實時時鐘,顧名思義,擁有真實時間的時鐘,其實它的主要作用就是在操作系統沒有工作的時候自主維護時間表,并在需要的時候給操作系統提供系統時間。開發板的時間系統可以分成兩種,分別是系統時間和硬件時間。硬件時間指的就是RTC芯片自主維護的時間,因為RTC芯片是電池供電的,所以在硬件平臺掉電后時間表不會丟失。Linux內核就把RTC芯片當作“離線”的時間與日期維護器。當
21、Linux內核啟動時,都要通過RTC來進行初始化,從RTC中讀取時間保存到系統中,得到系統時間。而在運行期間,內核以軟件的形式維護系統的當前時間與日期,并在關機或必要的時候將時間回寫RTC芯片,由它自主維護。另外如果RTC擁有了IRQ中斷并且可以定時,那么RTC還可以作為一個鬧鐘用來在內核睡眠時喚醒內核。 Linux有兩種RTC驅動的接口,一個是老的接口,專門用在PC機上的。另外一鐘新接口是基于Linux設備驅動程序的。而后者創建了一個RTC驅動模型,并注冊到RTC核心中,把所有工作交由RTC芯片完成。5.2 I2C總線簡介I2C總線是一種由Philips公司開發的兩線式串行總線標準
22、,用于鏈接微控制器及其外圍設備。I2C有100K和400K兩種工作速率,它支持多機通訊和多主控模塊設計,并且每個電路模塊都有唯一的地址,還允許每個在I2C總線上的期間都可以使用獨立的電源。本文就是介紹基于I2C總線的Linux字符設備驅動。I2C由數據線(SDA)和時鐘線(SCL)構成的同步串行總線,可發送和接受數據,在處理器與控制芯片之間、芯片與芯片之間進行雙向傳送8。I2C總線在傳送數據過程中共有三種類型信號,它們分別是開始信號、結束信號和應答信號9。第6章 字符設備驅動相關知識6.1模塊機制 Linux提供了一種被稱為模塊(Module)的機制提供了對許多模塊支持,設備驅動每個模塊由不同
23、代碼組成,實現不同功能10(所有的模塊在一起才是一個可執行程序)。insmod 將模塊動態加載到正在運行內核;rmmod 程序移除模塊;Linux內核模塊的程序結構: module_init()加載模塊函數(必須) 使用insmod命令加載模塊時,內核就會執行該模塊的加載函數,也就是說這就是整個模塊函數的入口,就是通過它來完成模塊的初始化相關工作。 module_exit()卸載模塊函數(必須) 當使用rmmod命令卸載某模塊時,內核就會執行該這段函數,完成對模塊的刪除和空間的釋放。 MODULE_LICENSE()模塊許可證聲明(必須) 這一段函數就是描述內核將要加載的模塊的工作權限,如果在
24、加載模塊時不聲明LICENSE,內核就會報警:kernel tainted,意思就是內核被污染。 module_param()模塊參數(可選) 這個函數括號內放置著模塊內部聲明的全局變量,對應著在加載模塊時rommod命令后面跟著的參數,這些參數就會被傳入模塊內。 EXPORT_SYMBOL()模塊導出符號(可選) 這個函數括號內也放置著數量不等參數,也就是符號(可以是函數或變量),而在這個模塊結束之后,其他模塊就可以通過這個符號使用本模塊中這些到處的參數,變量或函數。 其他一些聲明MODULE_XXXXX()模塊聲明(可選)不同的聲明對應著不同的功能選項,視實際情況而定。 模塊加載函數:st
25、atic int _init initialization_rtc(void) /* 初始化代碼 */module_init(initialization_rtc); 模塊卸載函數static void _exit cleanup_rtc(void) /* 釋放資源 */module_exit(cleanup_rtc); 6.2字符設備開發基本步驟 向內核確定主該設備的主次設備號 實現字符驅動程序: 填充file_operations結構體 實現模塊加載函數用以注冊字符設備 實現模塊卸載函數完成模塊的釋放和刪除 創建設備文件節點6.3主、次設備號11 主設備號是內核識別一個設備的標識。整數(占
26、12bits),范圍從0到4095,通常使用1到255。 次設備號由內核使用,用于正確確定設備文件所指的設備。整數(占20bits),范圍從0到1048575,一般使用0到255。 設備編號的內部表達 dev_t類型(32位,其中主設備號12位,次設備號20位): 是屬于Linux內核編程的專有類型,用來保存設備編號。 從dev_t類型變量中獲得主設備號和次設備號:這是兩個封裝好的函數MAJOR(dev_t rtc);/獲得主設備號MINOR(dev_t rtc);/獲得次設備號 將主設備號和次設備號轉換成dev_t類型:這也是一個封裝好的函數dev_t =MKDEV(int ,int );
27、分配主設備號 手工分配主設備號的函數:#include <linux/fs.h> /這是Linux內核中有關設備號的頭文件int register_chrdev_region( dev_t num, unsigned int , char *rtc );這是自己手動把num分配給rtc作為主設備號。 動態分配主設備號:#include <linux/fs.h> /這是Linux內核中有關設備號的頭文件int alloc_chrdev_resion(dev_t *,unsigned int ,unsigned int ,char *rtc);這是內核自動分配一個設備好給r
28、tc。 釋放設備號void unregister_chrdev(dev_t, unsigned int );在該設備號不再使用之后,釋放并刪除它,以節約內核資源。6.4實現字符驅動程序實現字符設備驅動,最重要的就是字符設備結構體cdev,以及驅動接口結構體-file_operations。 cdev 結構體struct cdev struct kobject xxx; /* 內核內嵌的對象 */ struct module *xxx; /*所屬模塊*/ struct file_operations *xxx; /*文件操作結構體*/ struct list_head xxx; /*不常用*/
29、dev_t xxx; /*設備號*/ unsigned int xxx; /*不常用*/ ; file_operations 結構體字符驅動和內核的接口:在內核代碼中,./include/linux/fs.h下的代碼實現,定義了字符驅動程序只要填充一個file_operations結構體并把它注冊到內核中,內核就有了通過它操作這個字符設備的能力。 file_operations的主要成員:struct module *xxx: 指向模塊本身open: 提供打開設備的函數接口;release:提供關閉設備的函數接口;read: 實現從設備上讀取數據的函數接口;write: 實現向設備上寫入數據的
30、函數接口;ioctl: I/O控制函數;llseek: 定位讀寫指針位置并把他們輸出出來; ioctl函數為設備驅動程序執行用戶空間的“命令”提供了一個特有的接口用來設置或者讀取設備的具體信息。 cmd 參數的定義Linux內核對file_operations的ioctl()函數的cmd參數有特殊的定義:如圖6-1。圖6-1 cmd參數構造命令編號的宏:_IO() 給沒有參數的命令;_IOR() 給從驅動中讀數據的命令;_IOW() 給寫入數據的命令;_IOWR() 用于雙向傳輸。 Ioctl函數模板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 字符設備驅動 第7章 RTC驅動實現7.1 設計思路Linux設備驅動屬于內核的一部分,Linux內核的驅動模塊可以用兩種不同的方式加載和編譯: 通過內核裁剪,隨同Linux的啟動直接加載編譯進Linux內核; 把驅動程序編譯成一個可加載和刪除的動態模塊,可以在需要時隨時使用insmod命令加載
32、,rmmod命令刪除。這種方式更快,也節省了內核資源,控制了內核的大小,而模塊一旦被插入內核,就和其他被直接初始化到內核中的模塊一樣了。這次的RTC驅動就采用動態模塊加載的方式,將程序主體分成3個部分。分別是注冊字符設備的class.c,定義操作函數的dev.c和提供接口說明的ioctl.c。7.2 RTC程序實現 7.2.1 RTC基本數據結構struct rtc_time 結構體struct rtc_time int sec;int min;int hour;int mday;int mon;int year;
33、int wday;int yday;int isdst;這個結構體代表了硬件時間與日期,從RTC芯片讀取的時間和日期就分開保存在這個結構體中 7.2.2注冊字符設備 模塊初始化函數: 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首先創建了一個類rtc12。類本身就是一個高度面向對象的產物,而用戶空間就可以在不知道如何實現的情況下直接得到結果,驅動程序也不用直接處理,只要調用就行了。 7.2.3 定義操作函數 dev.c 填充了file_operations結構rtc_foperations,以及這些操作函數的具體實現。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 函數聲明ioctl.c里的所有函數的實現都對應于dev.c 中rtc_ioctl相應的命令,其中RTC_RD_TIME與RTC_SET_TIME兩個命令需要特別注意,這是RTC最基本的功能函數獲取時間和設置時間。7.3 運行步驟通過編寫的Makefile及arm-linux-gcc編譯生成rtc.ko文件,如圖7-1。圖7-1 編譯生成.ko文件編寫用戶層測試程序,并編譯成可執行程序qq。7.4 實際運行及結果將生成的.ko模塊和應用層測試程序qq下載的目標板,運行過程如圖7-2:用insmod裝載模板。創建設備節點:
39、 mknod /dev/rtc c 250 0修改執行程序權限: chmod 777 qq執行測試程序。圖7-2 運行過程結果如圖7-3:圖7-3 運行結果第8章 結論本論文中對Linux的發展跟現狀進行了了解,還在對課題基于Linux操作系統下RTC驅動開發的基礎上對Linux內核進行了大致的分析,并在課題最后進行了相對于RTC驅動模塊的應用層測試軟件的編寫。在本文中嵌入式系統選擇的是Linux系統,它具有占有內存小和運行速率高的優點。并采用了模塊化的指導設計方法開發設備驅動,提高了程序的可讀性和可移植性。本文將字符設備分為了設備注冊、函數功能實現以及調用接口,并對程序進行了應用層的實例驗證
40、。由于時間的原因,本文中RTC字符驅動的程序設計還是有些簡單,在以后的學習工作中還需要進一步改善。在以后對驅動的學習中,希望能夠不斷完善RTC芯片的功能實現,并在在嵌入式Linux操作系統的建立中,以內核剪裁的方式將驅動程序移植到Linux內核中去,努力做出更為精簡穩定的內核系統。謝 辭首先,向我的指導老師趙老師和劉老師表示感謝,感謝老師們一直以來對我的關懷和悉心指導,并在完成畢業設計的過程中讓我體會到了也學到了很多。在整個畢業設計指導活動中,老師的豐富經驗和對整個行業脈絡的把握,都是年輕的我難以望其項背的,并在整個課題的完成過程中起到了至關重要的作用。趙老師教學作風的和劉老師的治學風格都讓我
41、留下了很深的印象。 同時也要感謝培訓班的所有同學,在臨近畢業的培訓過程中,對我的關心和幫助。感謝他們不厭其煩地指導我解決了不少項目上的難題,她們積極向上的學習態度也是我奮斗下去的動力。感謝我的親人,在這四年里是他們給我無數的鼓勵、支持和幫助,正因為有他們我才能高興順利的完成大學學業,并學到了很多專業,以及很多人生道路上的寶貴財富。 最后感謝各位評閱老師在百忙之中抽空評閱我的論文。參 考 文 獻1 徐俊仕.基于嵌入式Linux的車載GPS導航系統設計與實現D西安:西北工業大學機械電子工程學院,2007.2 戴明華,李長云,曾志浩,崔海燕. 嵌入式Linux驅動程序框架研究綜述J. 長沙大學學報,
42、2012,02:52-53.3 方先康.基于powerpc處理器MPC8541E的嵌入式Linux系統開發D北京:北京郵電大學計算機科學與技術學院,2011.4 張利平.基于MPC8536的雷達嵌入式數據處理平臺設計D.成都:中國西南電子技術研究所,2012.5 羅澤勇.一種基于powerpc的嵌入式信號處理平臺的設計D.西安:西安電子科技大學,2011.6 董文軍. Linux驅動程序兼容性的相關問題J.單片機與嵌入式系統應用,2010,03:16-18.7 董闖.基于MPC85xx的U-boot啟動流程分析和移植D,北京:北京郵電大學,2009.8 周立功,陳明計,陳渝ARM嵌入式Linu
43、x系統構建與驅動開發范例M北京:北京航空航天大學出版社,2006.9 王淑貞U-Boot在S3C2410上的移植J.微計算機應用,2008,29(4):95-97.10 LTIB user manual Linux Target Image Builder,Freescale,2006.11 史勝輝.基于嵌入式Linux的頻譜分析儀軟件系統設計D.成都:電子科技大學,2011.12 MPC8536 datasheet MPC8536E PowerQUICC III tm Integrated Processor Product Brief ,2009.附錄A RTC驅動程序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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國數碼3c涂料行業需求分析及投資發展前景調研報告
- 傳熱學考試模擬題(附答案)
- 臨床診斷學考試模擬題含答案
- 2025年陜西省漢中市寧強縣中考一模語文試題(原卷版+解析版)
- 聚丙烯腈纖維單體合成考核試卷
- 自然災害的風險評估與防范考核試卷
- 橡膠材料性質與應用考核試卷
- 石墨在新能源儲存系統材料的選擇考核試卷
- 海洋石油鉆探的深海鉆探事故案例分析考核試卷
- 搬運設備負載能力分析考核試卷
- 《工業網絡與組態技術》課程標準
- 2025山東能源集團中級人才庫選拔自考難、易點模擬試卷(共500題附帶答案詳解)
- 氣管切開非機械通氣患者氣道護理團體標準課件
- 《空氣動力學與飛行原理》空氣動力學-課件
- 營業執照地址變更申請書
- 生物制藥無菌技術進展-深度研究
- 大米生產與食品安全
- 2025年中國氫氣傳感器行業市場深度分析及投資策略研究報告
- 2025年全球及中國依西美坦片行業頭部企業市場占有率及排名調研報告
- 某院護理人員對常用中醫護理技術知信行現狀研究【復制】
- 專題18-地質地貌形成過程(原卷版)
評論
0/150
提交評論