嵌入式GPIO課程設(shè)計(jì)報(bào)告.doc_第1頁(yè)
嵌入式GPIO課程設(shè)計(jì)報(bào)告.doc_第2頁(yè)
嵌入式GPIO課程設(shè)計(jì)報(bào)告.doc_第3頁(yè)
嵌入式GPIO課程設(shè)計(jì)報(bào)告.doc_第4頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡(jiǎn)介

嵌入式課程設(shè)計(jì)報(bào)告一,設(shè)計(jì)要求(1)GPIO15,實(shí)現(xiàn)對(duì)GPIO的操作,重點(diǎn)介紹驅(qū)動(dòng)程序框架的設(shè)計(jì),以及在嵌入式系統(tǒng)中調(diào)試驅(qū)動(dòng)程序的流程。(2)基于輪詢(xún)的UART驅(qū)動(dòng)設(shè)計(jì),用戶(hù)空間和內(nèi)核空間的數(shù)據(jù)互傳。二,設(shè)計(jì)實(shí)現(xiàn)(1)GPIO的驅(qū)動(dòng)設(shè)計(jì)主要包括以下四個(gè)函數(shù)的設(shè)計(jì):加載本驅(qū)動(dòng)是執(zhí)行init_module函數(shù),以注冊(cè)本驅(qū)動(dòng),同時(shí)系統(tǒng)為本驅(qū)動(dòng)分配一對(duì)唯一的主設(shè)備號(hào)和從設(shè)備號(hào);卸載驅(qū)動(dòng)時(shí)執(zhí)行cleanup_module函數(shù),系統(tǒng)回收已分配的主設(shè)備號(hào)和從設(shè)備號(hào);打開(kāi)驅(qū)動(dòng)程序文件時(shí)執(zhí)行g(shù)pio_open函數(shù),通過(guò)調(diào)用GPIO_init初始化GPIO15,設(shè)置其為輸出端口,通過(guò)調(diào)用GPIO_hig使GPIO15引腳輸出高電平,并將驅(qū)動(dòng)程序的引用計(jì)數(shù)加1;關(guān)閉驅(qū)動(dòng)程序文件時(shí)執(zhí)行g(shù)pio_release函數(shù),并調(diào)用GPIO_low使GPIO15引腳輸出低電平,并將驅(qū)動(dòng)程序的引用計(jì)數(shù)減1.在驅(qū)動(dòng)程序設(shè)計(jì)中,由于linux運(yùn)行事使用的是虛擬內(nèi)存,因此在驅(qū)動(dòng)程序中訪問(wèn)處理器的特殊功能寄存器時(shí),需要將相應(yīng)的特殊功能寄存器的物理地址轉(zhuǎn)化成虛擬地址。本例中,就是包含頭文件,通過(guò)hardware.h中進(jìn)一步引用定義了PXA270處理器特殊功能寄存器虛擬地址的頭文件includeasm-asmarch-pxapxa-regs.h。其中定義了控制GPIO所需的三個(gè)寄存器:#defineGPDRO_REG(0x40E0000C)/*GPIO方向寄存器*/#defineGPSRO_REG(0X40E00018)/*GPIO輸出置為寄存器*/#defineGPCRO_REG(0x40E00024)/*GPIO輸出復(fù)位寄存器*/其中_REG宏調(diào)用了物理地址到虛擬地址的轉(zhuǎn)換函數(shù)io_p2v(x)。#defineio_p2v(x)(x丨0xbe000000)(x)1)&0x06000000)#define_REG(x)_REGP(io_p2v(x)GPIO驅(qū)動(dòng)程序部分源代碼如下:#ifndefMODULE#defineMODULE#endif#ifndef_KERNEL_#define_KERNEL_#endif#ifCONFIG_MODVERSIONS=1#defineMODVERSIONS#include#endif#include#include#include#include#include#include#include#include#include/#include#include#include#ifndefKERNEL_WERSIONS(2)所謂輪詢(xún)方式,是指內(nèi)核定期對(duì)設(shè)備的狀態(tài)進(jìn)行查詢(xún),然后作出相應(yīng)的處理?;谳喸?xún)的UART驅(qū)動(dòng)程序,其主要函數(shù)的功能如下:Init_module()函數(shù)用來(lái)初始化串口模塊,加載串口設(shè)備驅(qū)動(dòng)。Uart_open()函數(shù)用來(lái)打開(kāi)一個(gè)串口設(shè)備節(jié)點(diǎn),當(dāng)一個(gè)設(shè)備節(jié)點(diǎn)被打開(kāi)時(shí),計(jì)數(shù)器MOD_INC_USE_COUNT加1.Uart_release()函數(shù)用來(lái)關(guān)閉一個(gè)設(shè)備節(jié)點(diǎn),當(dāng)一個(gè)設(shè)備節(jié)點(diǎn)被關(guān)閉時(shí),MOD_DEC_USE_COUNT減1.uart_write()函數(shù)首先調(diào)用copy_from_user()函數(shù)將用戶(hù)空間的數(shù)據(jù)復(fù)制到內(nèi)核空間,然后通過(guò)藍(lán)牙串口BTuart發(fā)送出去,在該函數(shù)中調(diào)用了SerialOutputByte()函數(shù)。uart_read()函數(shù)中,首先讀BTRBR寄存器,將接收到的數(shù)據(jù)讀到內(nèi)核空間,然后通過(guò)copy_to_user()函數(shù)將接收數(shù)據(jù)復(fù)制到用戶(hù)空間。Cleanup_module()函數(shù)將BTuart設(shè)備驅(qū)動(dòng)卸載。Uart_init(void)函數(shù)主要來(lái)配置串口的波特率、數(shù)據(jù)位、停止位和奇偶校驗(yàn)位。SerialOutputByte(constcharc)函數(shù)是串口發(fā)送函數(shù),將字符C通過(guò)串口發(fā)送出去。SerialoutputByte(void)函數(shù)是串口接收數(shù)據(jù)函數(shù)。基于輪詢(xún)的UART驅(qū)動(dòng)程序的部分源代碼如下:#include#include#ifCONFIG_MODVERSIONS=1#defineMODVERSIONS#include#endif#include#include#include#include#include#include#include#ifndefKERNEL_VERSIONS#defineKERNEL_VERSIONS(a,b,c)(a)*65536+(b)*256+(c)#endif#iflinux_VERSION_CODEKERNEL_VERSION(2,2,0)#include#endif#defineDEVICE_NAME”uart_test”#definesetuartband三,設(shè)計(jì)總結(jié)設(shè)備驅(qū)動(dòng)程序,他直接與相應(yīng)設(shè)備打交道,并且向上層提供一組訪問(wèn)接口,內(nèi)核常常使用設(shè)備類(lèi)型、主設(shè)備號(hào)和次設(shè)備號(hào)來(lái)標(biāo)識(shí)一個(gè)具體的設(shè)備,在設(shè)備管理中用戶(hù)可以像訪問(wèn)普通文件一樣訪問(wèn)外部設(shè)備。在linux中所有的硬件設(shè)備均被當(dāng)作特殊的設(shè)備文件處理,可以使用標(biāo)準(zhǔn)的文件操作,對(duì)于字符設(shè)備和塊設(shè)備,其設(shè)備文件用mknod命令創(chuàng)建,用主設(shè)備號(hào)和次設(shè)備號(hào)來(lái)標(biāo)識(shí),同一個(gè)設(shè)備驅(qū)動(dòng)程序控制的所有設(shè)備具有相同的主設(shè)備號(hào),并用不同的次設(shè)備號(hào)加以區(qū)別,然后,對(duì)設(shè)備進(jìn)行操作的系統(tǒng)調(diào)用和對(duì)文件操作類(lèi)似,最后通過(guò)內(nèi)核將系統(tǒng)調(diào)用轉(zhuǎn)換成對(duì)物理設(shè)備的操作。驅(qū)動(dòng)的實(shí)現(xiàn)就是編寫(xiě)一組被系統(tǒng)調(diào)用的函數(shù),然后加載到系統(tǒng)中,這些函數(shù)能夠?qū)崿F(xiàn)對(duì)硬件的操作,能夠通過(guò)和系統(tǒng)的接口與上層應(yīng)用程序交互信息。設(shè)備驅(qū)動(dòng)在加載時(shí)首先需要調(diào)用入口函數(shù)init_module(),該函數(shù)完成驅(qū)動(dòng)的初始化工作,比如寄存器置位、結(jié)構(gòu)體賦值等一系列的工作,其中一個(gè)最重要的工作就是向內(nèi)核注冊(cè)該設(shè)備,字符設(shè)備調(diào)用函數(shù)register_chrdve()完成注冊(cè),注冊(cè)成功后,該設(shè)備獲得了系統(tǒng)分配或向系統(tǒng)申請(qǐng)的主設(shè)備號(hào)、自定義的次設(shè)備號(hào),并建立起與設(shè)備文件的關(guān)聯(lián),設(shè)備驅(qū)動(dòng)在卸載時(shí)需要回收相應(yīng)的資源,將設(shè)備的響應(yīng)寄存器值復(fù)位并從系統(tǒng)中注銷(xiāo)該設(shè)備的操作過(guò)程,設(shè)備驅(qū)動(dòng)程序可以分為三個(gè)主要的部分:一自動(dòng)配置和初始化子程序。負(fù)責(zé)檢測(cè)所需驅(qū)動(dòng)的硬件設(shè)備是否存在以及是否能夠正常工作,這部分驅(qū)動(dòng)只在初始化時(shí)被調(diào)用一次。二服務(wù)I/O就是請(qǐng)求子程序,這部分是系統(tǒng)調(diào)用的結(jié)果。三中斷服務(wù)程序又稱(chēng)驅(qū)動(dòng)程序的下半部分,設(shè)備在I/O請(qǐng)求結(jié)束或其他狀態(tài)改變時(shí)產(chǎn)生中斷,因?yàn)樵O(shè)備驅(qū)動(dòng)程序支持同一類(lèi)型的若干設(shè)備,所以調(diào)用中斷服務(wù)子程序時(shí)都帶有一個(gè)或多個(gè)參數(shù)以唯一標(biāo)識(shí)請(qǐng)求服務(wù)的設(shè)備。內(nèi)核模塊是linux內(nèi)核的重要組成部

溫馨提示

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

評(píng)論

0/150

提交評(píng)論