版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
主講內(nèi)容第8章
嵌入式系統(tǒng)BootLoader技術(shù)第9章
嵌入式Linux操作系統(tǒng)移植第10章
嵌入式Linux設(shè)備驅(qū)動(dòng)程序開發(fā)第11章
嵌入式Linux應(yīng)用程序設(shè)計(jì)10.1嵌入式Linux驅(qū)動(dòng)程序開發(fā)基礎(chǔ)
10.1.1嵌入式Linux設(shè)備驅(qū)動(dòng)程序分類靜態(tài)加載的驅(qū)動(dòng)程序動(dòng)態(tài)加載的驅(qū)動(dòng)程序Linux將設(shè)備按照功能特性劃分為三種類型:字符設(shè)備,塊設(shè)備和網(wǎng)絡(luò)設(shè)備。10.1.2最簡單的內(nèi)核模塊1.helloworld模塊源代碼2.模塊的編譯3.模塊的加載和卸載10.1嵌入式Linux驅(qū)動(dòng)程序開發(fā)基礎(chǔ)
10.2嵌入式Linux設(shè)備驅(qū)動(dòng)重要技術(shù)10.2.1內(nèi)存與I/O端口(1)內(nèi)核空間和用戶空間(2)內(nèi)核中內(nèi)存分配內(nèi)核中獲取內(nèi)存的幾種方式如下。①通過伙伴算法分配大片物理內(nèi)存②通過slab緩沖區(qū)分配小片物理內(nèi)存③非連續(xù)內(nèi)存區(qū)分配④高端內(nèi)存映射⑤固定線性地址映射(3)I/O端口根據(jù)CPU體系結(jié)構(gòu)的不同,CPU對IO端口的編址方式有兩種:I/O映射方式(I/O-mapped)和內(nèi)存映射方式(Memory-mapped)。
下面主要討論一下內(nèi)存映射方式訪問I/O端口的方法,我們稱之為I/O內(nèi)存操作。I/O內(nèi)存區(qū)必須在使用前分配I/O內(nèi)存映射訪問I/O內(nèi)存映射到用戶空間10.1嵌入式Linux驅(qū)動(dòng)程序開發(fā)基礎(chǔ)
10.2.2同步機(jī)制Linux內(nèi)核中包含的同步機(jī)制包括:原子操作、信號(hào)量(semaphore)、讀寫信號(hào)量(rw_semaphore)、自旋鎖(spinlock)、大內(nèi)核鎖(BigKernelLock,BKL)、讀寫鎖(rwlock)、讀拷貝更新(Read-CopyUpdate,RCU)和seqlock(順序鎖)等。1.原子操作原子操作主要用于實(shí)現(xiàn)資源計(jì)數(shù),很多引用計(jì)數(shù)(refcnt)就是通過原子操作實(shí)現(xiàn)的。原子類型定義如下:typedefstruct{volatileintcounter;}atomic_t;原子操作通常用于實(shí)現(xiàn)資源的引用計(jì)數(shù)2.信號(hào)量信號(hào)量在創(chuàng)建時(shí)需要設(shè)置一個(gè)初始值.
3.讀寫信號(hào)量讀寫信號(hào)量有兩種實(shí)現(xiàn):一種是通用的,不依賴于硬件架構(gòu)一種是架構(gòu)相關(guān)的讀寫信號(hào)量的相關(guān)API有:DECLARE_RWSEM(name)該宏聲明一個(gè)讀寫信號(hào)量name并對其進(jìn)行初始化。voidinit_rwsem(structrw_semaphore*sem);該函數(shù)對讀寫信號(hào)量sem進(jìn)行初始化。voiddown_read(structrw_semaphore*sem);在Linux中,每一個(gè)進(jìn)程都用一個(gè)類型為task_t或structtask_struct的結(jié)構(gòu)來描述4.自旋鎖一個(gè)執(zhí)行單元要想訪問被自旋鎖保護(hù)的共享資源,必須先得到鎖,在訪問完共享資源后,必須釋放鎖。自旋鎖的API有:spin_lock_init(x);10.2.3阻塞與非阻塞1.阻塞操作2.非阻塞操作10.2.4時(shí)間問題1.延時(shí)操作:(1)長延時(shí)。(2)短延時(shí)2.內(nèi)核定時(shí)器內(nèi)核提供給驅(qū)動(dòng)許多函數(shù)來聲明、注冊、以及去除內(nèi)核定時(shí)器。
3.工作隊(duì)列采用缺省工作者線程來實(shí)現(xiàn)工作隊(duì)列的API:①INIT_WORK(_work,_func,_data)②intschedule_work(structwork_struct*work)③intschedule_delayed_work(structwork_struct*work,unsignedlongdelay)④voidflush_scheduled_work(void)⑤intcancel_delayed_work(structwork_struct*work)
創(chuàng)建自己的工作者線程和工作隊(duì)列,API:①structworkqueue_struct*create_workqueue(constchar*name)②intqueue_work(structworkqueue_struct*wq,structwork_struct*work)③intqueue_delayed_work(structworkqueue_struct*wq,structwork_struct*work,unsignedlongdelay)④voidflush_workqueue(structworkqueue_struct*wq)⑤voiddestroy_workqueue(structworkqueue_struct*wq)10.2.5中斷處理在Linux系統(tǒng)里,對中斷的處理是屬于系統(tǒng)核心部分,因而如果設(shè)別與系統(tǒng)之間以中斷方式進(jìn)行數(shù)據(jù)交換,就必須把該設(shè)備的驅(qū)動(dòng)程序作為系統(tǒng)核心的一部分。設(shè)備驅(qū)動(dòng)程序通過調(diào)用request_irq函數(shù)來申請中斷,通過free_irq來釋放中斷。它們被定義為:#include<linux/sched.h>intrequest_irq(unsignedintirq,void(*handler)(intirq,voiddev_id,structpt_regs*regs),unsignedlongflags,constchar*device,void*dev_id);voidfree_irq(unsignedintirq,void*dev_id);函數(shù)的參數(shù)如下。unsignedintirq:請求的中斷號(hào)。irqreturn_t(*handler):安裝的中斷處理函數(shù)指針。unsignedlongflags:中斷處理的屬性。
constchar*dev_name:這個(gè)傳遞給request_irq的字串用在/proc/interrupts來顯示中斷的擁有者。
void*dev_id:用作共享中斷的指針。10.3字符設(shè)備驅(qū)動(dòng)程序字符設(shè)備驅(qū)動(dòng)程序可以分為三個(gè)主要組成部分:1,自動(dòng)配置和初始化子程序,負(fù)責(zé)檢測所要驅(qū)動(dòng)的硬件設(shè)備是否存在和是否能正常工作。2,服務(wù)于I/O請求的子程序,又稱為驅(qū)動(dòng)程序的上半部分。3,中斷服務(wù)子程序,又稱為驅(qū)動(dòng)程序的下半部分。10.3.1字符設(shè)備驅(qū)動(dòng)結(jié)構(gòu)1.主次設(shè)備號(hào):字符設(shè)備和塊設(shè)備通過文件系統(tǒng)中的名子來存取。主編號(hào)標(biāo)識(shí)設(shè)備相連的驅(qū)動(dòng)。次編號(hào)被內(nèi)核用來決定引用哪個(gè)設(shè)備。設(shè)備編號(hào)在驅(qū)動(dòng)程序的內(nèi)部具有固定的表示方式。在建立驅(qū)動(dòng)時(shí),需要做的第一件事是獲取一個(gè)或多個(gè)設(shè)備編號(hào)來使用。在驅(qū)動(dòng)程序執(zhí)行的過程中,如果不希望在使用該設(shè)備,要及時(shí)的將設(shè)備編號(hào)釋放:2.驅(qū)動(dòng)相關(guān)數(shù)據(jù)結(jié)構(gòu)大部分的基礎(chǔ)性的驅(qū)動(dòng)操作包括3個(gè)重要的內(nèi)核數(shù)據(jù)結(jié)構(gòu),它們是file_operations,file,和inode。(1)文件操作(file_operations) file_operation結(jié)構(gòu)表示了用戶程序怎樣對設(shè)備進(jìn)行操作。這個(gè)結(jié)構(gòu),定義在<linux/fs.h>中,是一個(gè)函數(shù)指針的集合structmodule*owner。(2)文件結(jié)構(gòu) structfile定義于</linux/fs.h>,是設(shè)備驅(qū)動(dòng)中第二個(gè)最重要的數(shù)據(jù)結(jié)構(gòu)。(3)inode結(jié)構(gòu) inode結(jié)構(gòu)由內(nèi)核在內(nèi)部用來表示文件。3.自動(dòng)配置和初始化(1)初始化。當(dāng)驅(qū)動(dòng)程序?qū)⒈患虞d的時(shí)候,首先會(huì)調(diào)用初始函數(shù)進(jìn)行自動(dòng)配置。(2)清除處理。4.中斷處理如果需要驅(qū)動(dòng)程序具有中斷處理的能力,必須進(jìn)行中斷申請。從request_irq返回給請求函數(shù)的返回值是0指示成功,為負(fù)表示錯(cuò)誤碼。中斷處理可以在驅(qū)動(dòng)初始化時(shí)安裝或者在設(shè)備第一次打開時(shí)。在中斷的使用過程中還可以對其進(jìn)行使能和禁止操作10.3.2字符設(shè)備驅(qū)動(dòng)實(shí)例——LED驅(qū)動(dòng)1.LED驅(qū)動(dòng)程序分析本驅(qū)動(dòng)程序文件名為led2440.c2.驅(qū)動(dòng)模塊加入內(nèi)核使用命令:cp-fled2440.c/linux-2.6.32.4/drivers/char/編輯Kconfig文件:修改Makefile文件:配置、編譯內(nèi)核執(zhí)行makezImage內(nèi)核映像和驅(qū)動(dòng)程序模塊會(huì)先后被編譯完畢。將內(nèi)核下載至開發(fā)板;將驅(qū)動(dòng)程序模塊加入到根文件系統(tǒng)后,下載至開發(fā)板。這樣就可以調(diào)用驅(qū)動(dòng)程序進(jìn)行演示了。3.LED驅(qū)動(dòng)演示(1)驅(qū)動(dòng)程序模塊加載到內(nèi)核。進(jìn)入驅(qū)動(dòng)程序模塊所在目錄,執(zhí)行:insmod-fled2440.ko(2)建立設(shè)備節(jié)點(diǎn)。也就是建立用戶程序關(guān)聯(lián)到驅(qū)動(dòng)程序的途徑(3)演示程序。建立一個(gè)LED控制的簡單演示程序led2440test10.4網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序10.4.1Linux網(wǎng)絡(luò)設(shè)備簡介1.Linux網(wǎng)絡(luò)驅(qū)動(dòng)基礎(chǔ)2.DM9000控制器10.4.2網(wǎng)絡(luò)驅(qū)動(dòng)核心數(shù)據(jù)結(jié)構(gòu)分成幾個(gè)方面對其進(jìn)行介紹通用信息硬件描述信息協(xié)議相關(guān)信息設(shè)備操作函數(shù)接口10.4.3網(wǎng)絡(luò)驅(qū)動(dòng)程序分析1.初始化、清理網(wǎng)絡(luò)設(shè)備
網(wǎng)絡(luò)設(shè)備初始化的工作主要是確定硬件設(shè)備的存在,以及將硬件設(shè)備加載到設(shè)備鏈表中,為網(wǎng)絡(luò)設(shè)備的激活做準(zhǔn)備。需要注意這兩個(gè)變量:name和owner。2.打開和關(guān)閉網(wǎng)絡(luò)設(shè)備open函數(shù)主要用來完成對網(wǎng)絡(luò)設(shè)備中斷進(jìn)行注冊、通過配置物理接口初始化設(shè)備,以及為發(fā)送數(shù)據(jù)準(zhǔn)備隊(duì)列。3.中斷處理
網(wǎng)絡(luò)驅(qū)動(dòng)程序的中斷處理函數(shù)在網(wǎng)絡(luò)設(shè)備激活時(shí)進(jìn)行注冊,主要用于完成:現(xiàn)場保護(hù)及中斷屏蔽、讀取網(wǎng)絡(luò)設(shè)備寄存器信息及判斷中斷原因并處理、恢復(fù)中斷現(xiàn)場。函數(shù)首先需要獲得自旋鎖,然后將當(dāng)前的寄存器地址保存下來,以便返回的時(shí)候繼續(xù)進(jìn)行被打斷的作業(yè);接著就是屏蔽所有的中斷,讀取中斷狀態(tài)寄存器并清除中斷狀態(tài)寄存器,然后就開始真正的中斷處理了。當(dāng)發(fā)生接收中斷時(shí),中斷函數(shù)調(diào)用dm9000_rx()函數(shù)。
4.sk_buff結(jié)構(gòu)sk_buff的數(shù)據(jù)成員分為兩部分:一部分是實(shí)際在網(wǎng)絡(luò)中要傳輸?shù)牟糠郑瑪?shù)據(jù)區(qū)(Packetdatestorage);一部分由內(nèi)核管理服務(wù)于結(jié)構(gòu)鏈表。
還有一些常用的成員如:sk_buff->tstamp:sk_buff->dev:sk_buff->protocol:
內(nèi)核提供了一系列用于操作sk_buff數(shù)據(jù)結(jié)構(gòu)的函數(shù),用于分配、釋放、復(fù)制、克隆、擴(kuò)展等功能,下面介紹些常用的。structsk_buff*alloc_skb(unsignedintlen,intpriority)structsk_buff*dev_alloc_skb(unsignedintlen)
5.數(shù)據(jù)發(fā)送處理
6.數(shù)據(jù)接收處理
數(shù)據(jù)接收的主要工作有:檢查接收的到的數(shù)據(jù)包是否正確;根據(jù)數(shù)據(jù)被長度在內(nèi)核空間為數(shù)據(jù)包申請sk_buff;把數(shù)據(jù)包復(fù)制到sk_buff,填寫相關(guān)成員后插入隊(duì)列;釋放網(wǎng)絡(luò)芯片中分配的緩沖區(qū)。7.其它處理接口在網(wǎng)絡(luò)設(shè)備結(jié)構(gòu)中還有一些函數(shù)接口需要實(shí)現(xiàn),如:(1)get_stats(2)set_multicast_list(3)tx_tiemout10.5設(shè)備驅(qū)動(dòng)實(shí)例10.5.1ADC設(shè)備驅(qū)動(dòng)實(shí)例
ADC是比較簡單的字符設(shè)備,在此直接給出ADC的驅(qū)動(dòng)程序源代碼和注釋說明。10.5.2PWM設(shè)備驅(qū)動(dòng)實(shí)例10.5.3觸摸屏設(shè)備驅(qū)動(dòng)實(shí)例1.輸入子系統(tǒng)
在Linux中,輸入子系統(tǒng)(InputSubsystem)是由輸入子系統(tǒng)設(shè)備驅(qū)動(dòng)層、輸入子系統(tǒng)核心層(InputCore)和輸入子系統(tǒng)事件處理層(EventHandler)組成。設(shè)備的驅(qū)動(dòng)的實(shí)現(xiàn)步驟如下:①在驅(qū)動(dòng)模塊加載函數(shù)中設(shè)置Input設(shè)備支持input子系統(tǒng)的哪些事件;②將Input設(shè)備注冊到input子系統(tǒng)中;③在Input設(shè)備發(fā)生輸入操作時(shí)(如:鍵盤被按下/抬起、觸摸屏被觸摸/抬起/移動(dòng)、鼠標(biāo)被移動(dòng)/單擊/抬起時(shí)等),提交所發(fā)生的事件及對應(yīng)的鍵值/坐標(biāo)等狀態(tài)。在提交輸入設(shè)備的事件后必須用下列方法使事件同步,讓它告知input系統(tǒng),設(shè)備驅(qū)動(dòng)已經(jīng)發(fā)出了一個(gè)完整的報(bào)告:voidinput_sync(structinput_dev*dev)2.觸摸屏驅(qū)動(dòng)實(shí)現(xiàn) S3C2440A芯片內(nèi)
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年智能硬件產(chǎn)品知識(shí)產(chǎn)權(quán)保護(hù)常年顧問合同4篇
- 2025年茶葉出口退稅代理服務(wù)合同4篇
- 二零二四年幼兒教育中心資產(chǎn)剝離與經(jīng)營權(quán)轉(zhuǎn)讓協(xié)議3篇
- 二零二五年度林瓊與保險(xiǎn)公司健康保險(xiǎn)合同4篇
- 專項(xiàng)財(cái)稅解決方案常年服務(wù)合同2024
- 個(gè)性化包年服務(wù)協(xié)議2024條款版B版
- 2025年度用友企業(yè)營銷自動(dòng)化系統(tǒng)銷售合同2篇
- 2025年人教版選擇性必修1英語上冊月考試卷含答案
- 2025年物業(yè)管理公司合同管理實(shí)施細(xì)則與公共設(shè)施維護(hù)合同3篇
- 四年級(jí)數(shù)學(xué)(四則混合運(yùn)算)計(jì)算題專項(xiàng)練習(xí)與答案匯編
- 公司組織架構(gòu)圖(可編輯模版)
- 1汽輪機(jī)跳閘事故演練
- 陜西省銅川市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會(huì)明細(xì)
- 禮品(禮金)上交登記臺(tái)賬
- 普通高中英語課程標(biāo)準(zhǔn)詞匯表
- 北師大版七年級(jí)數(shù)學(xué)上冊教案(全冊完整版)教學(xué)設(shè)計(jì)含教學(xué)反思
- 2023高中物理步步高大一輪 第五章 第1講 萬有引力定律及應(yīng)用
- 青少年軟件編程(Scratch)練習(xí)題及答案
- 浙江省公務(wù)員考試面試真題答案及解析精選
- 系統(tǒng)性紅斑狼瘡-第九版內(nèi)科學(xué)
- 全統(tǒng)定額工程量計(jì)算規(guī)則1994
評論
0/150
提交評論