設(shè)備管理_嵌入式linux設(shè)備驅(qū)動程序課件_第1頁
設(shè)備管理_嵌入式linux設(shè)備驅(qū)動程序課件_第2頁
設(shè)備管理_嵌入式linux設(shè)備驅(qū)動程序課件_第3頁
設(shè)備管理_嵌入式linux設(shè)備驅(qū)動程序課件_第4頁
設(shè)備管理_嵌入式linux設(shè)備驅(qū)動程序課件_第5頁
已閱讀5頁,還剩48頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

嵌入式LINUX設(shè)備驅(qū)動程序 本講主要內(nèi)容 嵌入式linux設(shè)備驅(qū)動的基本框架與實現(xiàn)數(shù)碼管顯示驅(qū)動程序分析幀緩沖顯示驅(qū)動實現(xiàn)方法 Linux系統(tǒng)中的設(shè)備文件 Linux將所有外部設(shè)備看成是一類特殊文件 稱之為 設(shè)備文件 如果說系統(tǒng)調(diào)用是Linux內(nèi)核和應(yīng)用程序之間的接口 那么設(shè)備驅(qū)動程序則可以看成是Linux內(nèi)核與外部設(shè)備之間的接口 設(shè)備驅(qū)動程序向應(yīng)用程序屏蔽了硬件在實現(xiàn)上的細(xì)節(jié) 使得應(yīng)用程序可以像操作普通文件一樣來操作外部設(shè)備 Linux設(shè)備驅(qū)動在系統(tǒng)中的層次 設(shè)備驅(qū)動的作用 設(shè)備驅(qū)動是位于應(yīng)用和物理設(shè)備之間的軟件層 負(fù)責(zé)完成二者間的I O操作 在LINUX系統(tǒng)里 對用戶程序 設(shè)備驅(qū)動隱藏了設(shè)備的具體細(xì)節(jié) 為不同設(shè)備提供了一致的接口 設(shè)備驅(qū)動是嵌入式系統(tǒng)開發(fā)的重要內(nèi)容之一 設(shè)備驅(qū)動完成的主要功能 對設(shè)備的初始化和釋放 將數(shù)據(jù)從內(nèi)核傳遞到硬件設(shè)備 以及從硬件讀取數(shù)據(jù) 讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù) 并回送應(yīng)用程序請求的數(shù)據(jù) 這需要在用戶空間 內(nèi)核空間 總線以及外設(shè)之間傳輸數(shù)據(jù) 檢查和處理設(shè)備出現(xiàn)的錯誤 設(shè)備驅(qū)動的分類 Linux支持3種不同類型的設(shè)備字符設(shè)備塊設(shè)備網(wǎng)絡(luò)接口字符設(shè)備能夠像字節(jié)流一樣被訪問的設(shè)備 一般不需要緩存技術(shù) 也不支持隨機訪問 典型的字符設(shè)備有 鼠標(biāo) 鍵盤 I O設(shè)備等 設(shè)備驅(qū)動的分類 塊設(shè)備支持面向塊訪問的設(shè)備 每塊包含2的N次冪字節(jié)數(shù)據(jù) 典型的塊大小為512或1024B 大多數(shù)塊設(shè)備允許隨機訪問 而且常常采用buffer cache等緩存技術(shù) 塊設(shè)備的訪問常常通過文件系統(tǒng)來進(jìn)行 典型的塊設(shè)備有 如磁盤 硬盤 光盤驅(qū)動器等 設(shè)備驅(qū)動的分類 網(wǎng)絡(luò)接口能夠和其他主機交換數(shù)據(jù)的設(shè)備接口 網(wǎng)絡(luò)接口只是面向數(shù)據(jù)包而不是數(shù)據(jù)流 它沒有被映射為任何設(shè)備文件 其訪問要通過BSD套接口進(jìn)行 設(shè)備驅(qū)動的分類 主設(shè)備號與次設(shè)備號 LINUX系統(tǒng)中 設(shè)備由一個主設(shè)備號和一個次設(shè)備號來唯一標(biāo)識 主設(shè)備號唯一標(biāo)識了設(shè)備類型 即設(shè)備驅(qū)動程序類型 它是塊設(shè)備表或字符設(shè)備表中設(shè)備表項的索引 一些典型設(shè)備的主設(shè)備號已經(jīng)基本固定下來 例如 軟驅(qū)的主設(shè)備號為2 IDE硬盤的主設(shè)備號為3等等 設(shè)備宏操作MAJOR 可以獲取主設(shè)備號 主設(shè)備號與次設(shè)備號 次設(shè)備號用于標(biāo)識使用同一設(shè)備驅(qū)動程序的不同硬件 并僅由設(shè)備驅(qū)動程序解釋當(dāng)應(yīng)用程序操作某個設(shè)備文件時 Linux內(nèi)核根據(jù)其主設(shè)備號調(diào)用相應(yīng)的驅(qū)動程序 并從用戶態(tài)進(jìn)入內(nèi)核態(tài)驅(qū)動程序判斷次設(shè)備號 并完成相應(yīng)的硬件操作 用戶空間和內(nèi)核空間 Linux運行在2種模式下內(nèi)核模式用戶模式內(nèi)核模式對應(yīng)內(nèi)核空間 而用戶模式對應(yīng)用戶空間 驅(qū)動程序作為內(nèi)核的一部分 它對應(yīng)內(nèi)核空間 應(yīng)用程序不能直接訪問其數(shù)據(jù) 用戶空間和內(nèi)核空間 用戶空間和內(nèi)核空間的數(shù)據(jù)傳遞 copy to user void to constvoid from unsignedlongcount copy from user void to constvoid from unsignedlongcount copy to user copy from user 第一種方法在復(fù)制數(shù)據(jù)的同時 會進(jìn)行地址空間的有效性檢查 內(nèi)核設(shè)備驅(qū)動模塊 設(shè)備驅(qū)動程序以兩種方式添加到內(nèi)核 Buildin直接把驅(qū)動程序編譯到內(nèi)核代碼中Module以模塊的方式加載驅(qū)動程序加載 insmoddriver o卸載 rmmoddriver查看 lsmod Linux設(shè)備節(jié)點的添加 設(shè)備節(jié)點位于 dev路徑下可用如下命令添加dev節(jié)點 b代表塊設(shè)備 C表示字符設(shè)備mknod dev hda1b c 1271塊設(shè)備 主設(shè)備號127 次設(shè)備號1 Linux設(shè)備驅(qū)動代碼的分布 char 字符設(shè)備驅(qū)動源碼 block 塊設(shè)備驅(qū)動源碼 cdrom LinuxCDROM驅(qū)動源碼 這里可以找到某些特殊的CDROM設(shè)備 如SoundblasterCDROM IDE接口的CD驅(qū)動位于drivers ide ide cd c中而SCSICD驅(qū)動位于drivers scsi scsi c中 pci 它包含了PCI偽設(shè)備驅(qū)動源碼 這里可以找到關(guān)于PCI子系統(tǒng)映射與初始化的代碼 Linux設(shè)備驅(qū)動代碼的分布 scsi 所有的SCSI代碼以及Linux支持的SCSI設(shè)備的設(shè)備驅(qū)動 net 包含網(wǎng)絡(luò)驅(qū)動源碼 sound 所有的聲卡驅(qū)動源碼 video 所有的視頻卡驅(qū)動源碼 19 Linux設(shè)備驅(qū)動的代碼結(jié)構(gòu) 驅(qū)動程序的注冊與注銷設(shè)備的打開與釋放設(shè)備的讀寫操作設(shè)備的控制操作設(shè)備的中斷和輪詢處理等 設(shè)備驅(qū)動的注冊 方法1result devfs register chrdev 0 MOD NAME MOD NAME 設(shè)備驅(qū)動的名稱 keypad fops 文件操作指針 優(yōu)點 無需手動創(chuàng)建設(shè)備節(jié)點 由系統(tǒng)自動完成 對于塊設(shè)備的注冊 具有類似函數(shù) devfs register blkdev以及操作過程 設(shè)備驅(qū)動的注冊 方法2result register chrdev 0 MOD NAME mknod dev MOD NAMECMAJORMINOR 設(shè)備驅(qū)動的注銷 方法1devfs unregister chrdev MAJOR MOD NAME 或者devfs unregister blkdev MAJOR MOD NAME devfs unregister devfs handle 方法2unregister chrdev Major MOD NAME 或者unregister blkdev Major MOD NAME rm dev MOD NAME 設(shè)備的打開與釋放 設(shè)備的打開與釋放要通過文件操作結(jié)構(gòu)體中定義的相關(guān)函數(shù)open 和release 來完成 主要完成設(shè)備的初始化工作以及設(shè)備的釋放 文件操作結(jié)構(gòu)體的定義 structfile operations structmodule owner ssize t read structfile char size t loff t ssize t write structfile constchar size t loff t unsignedint poll structfile structpoll table struct int ioctl structinode structfile unsignedint unsignedlong int mmap structfile structvm area struct 文件操作結(jié)構(gòu)體的定義 int open structinode structfile int release structinode structfile int fsync structfile structdentry intdatasync 文件操作結(jié)構(gòu)體的主要函數(shù) open 用于打開文件設(shè)備release 在關(guān)閉文件的調(diào)用read 用于從設(shè)備中讀取數(shù)據(jù)write 向設(shè)備發(fā)送數(shù)據(jù)poll 查詢設(shè)備是否可讀或可寫ioctl 提供執(zhí)行設(shè)備特定命令的方法fasync 用于設(shè)備的異步通知操作 設(shè)備的讀寫 字符設(shè)備的讀寫操作可以直接使用read 和write 函數(shù)來完成 塊設(shè)備的讀寫 需要調(diào)用block read 和block write 函數(shù) 這2個函數(shù)向設(shè)備請求表中增加讀寫請求 塊設(shè)備的讀寫是對內(nèi)存緩沖區(qū)進(jìn)行操作 如果內(nèi)存緩沖區(qū)中沒有要讀入的數(shù)據(jù) 或者緩沖區(qū)中的數(shù)據(jù)需要寫入設(shè)備 可以通過調(diào)用數(shù)據(jù)結(jié)構(gòu)blk dev struct中的函數(shù)request fn 完成 設(shè)備的控制操作 對設(shè)備的控制操作可通過文件操作數(shù)據(jù)結(jié)構(gòu)中的ioctl 函數(shù)來完成 控制操作與具體的設(shè)備有密切關(guān)系 需要根據(jù)設(shè)備實際情況進(jìn)行具體分析 設(shè)備的輪詢和中斷處理 輪詢方式對于不支持中斷的硬件設(shè)備 讀寫時需要輪流查詢設(shè)備的狀態(tài) 以便決定隨后的數(shù)據(jù)操作 如果輪詢處理方式的驅(qū)動程序被鏈接到內(nèi)核 則意味著查詢過程中 內(nèi)核一直處于閑置狀態(tài) 解決辦法是使用內(nèi)核定時器 進(jìn)行定期查詢 設(shè)備的輪詢和中斷處理 中斷處理方式硬件在需要的時候 向內(nèi)核發(fā)出中斷請求信號 而內(nèi)核則負(fù)責(zé)把中斷信號傳遞給相應(yīng)的設(shè)備驅(qū)動 驅(qū)動程序必須在設(shè)備驅(qū)動的初始化時申請中斷資源 并注冊中斷處理函數(shù) 申請 request irq irq irq handler flag dev name dev id 釋放 free irq irq dev id 其中irq為申請的中斷線號 irq handler為注冊的中斷處理函數(shù) dev id用于共享中斷信號線 典型字符驅(qū)動程序框架 staticstructfile operationsdemo fops read demo readwrite demo writeopen demo open intinit module void returndemo init 用于注冊設(shè)備驅(qū)動 申請中斷線 初始化等voidcleanup module void demo cleanup 用于注銷設(shè)備驅(qū)動 釋放中斷線等接口函數(shù)的實現(xiàn) Example1 PXA270開發(fā)系統(tǒng)的按鍵驅(qū)動程序與數(shù)碼顯示驅(qū)動數(shù)碼顯示源代碼按鍵驅(qū)動源代碼 調(diào)試驅(qū)動程序 使用printk輸出信息 信息的優(yōu)先級依次為 KERN EMERGKERN ALERTKERN CRITKERN ERRKERN WARNINGKERN NOTICEKERN INFOKERN DEBUG如果要在終端輸出信息 編譯選項 Wall O2根據(jù) kernel printk c的不同設(shè)置 不顯示的信息會出現(xiàn)在 var log messages中驅(qū)動調(diào)試方法參見LinuxDeviceDriverschapter3 幀緩沖設(shè)備驅(qū)動程序 LCD分類 LCD可由為液晶照明的方式有兩種 傳送式和反射式傳送式屏幕要使用外加光源照明 稱為背光 backlight 照明光源要安裝在LCD的背后 傳送式LCD在正常光線及暗光線下 顯示效果都很好 但在戶外 尤其在日光下 很難辯清顯示內(nèi)容 反射式屏幕 則不需要外加照明電源 使用周圍環(huán)境的光線 或在某些筆記本中 使用前部照明系統(tǒng)的光線 這樣 反射式屏幕就沒有背光 所以 此種屏幕在戶外或光線充足的室內(nèi) 才會有出色的顯示效果 但在一般室內(nèi)光線下 這種顯示屏的顯示效果就不及背光傳送式的 幀緩沖 Framebuffer 幀緩沖 framebuffer 顯示緩沖區(qū)是Linux為顯示設(shè)備提供的一個接口 是把顯存抽象后的一種設(shè)備 他允許上層應(yīng)用程序在圖形模式下直接對顯示緩沖區(qū)進(jìn)行讀寫操作 Xwindow繪制窗口 顯示漢字都是通過fb 幀緩沖設(shè)備 Linux可支持最多32個 dev fb0 dev fb31缺省是 dev fb0可以直接拷貝位圖到fb來顯示到屏幕cp bitmap penguin bin dev fb0 幀緩沖設(shè)備驅(qū)動原理 幀緩沖設(shè)備屬于字符設(shè)備 其目的就是通過配置PXA270的寄存器 在一段指定的內(nèi)存與LCD之間建立一個自動傳輸?shù)耐ǖ?這樣 任何程序只要修改這段內(nèi)存中的數(shù)據(jù) 就可以改變LCD上的顯示內(nèi)容 幀緩沖設(shè)備的文件操作層接口 staticstructfile operationsfb fops owner THIS MODULE read fb read 讀操作 write fb write 寫操作 ioctl fb ioctl 控制操作 mmap fb mmap 映射操作 open fb open 打開操作 release fb release 關(guān)閉操作 其中的成員函數(shù)都在文件linux driver video fbmem c中定義 幀緩沖設(shè)備的文件操作層接口 控制操作函數(shù)fb ioctl通過以下參數(shù)來傳遞控制命令FBIOGET VSCREENINFOFBIOPUT VSCREENINFOFBIOGET FSCREENINFO映射操作函數(shù)fb mmap將顯示緩存映射到用戶空間 幀緩沖設(shè)備的驅(qū)動層接口 fb info structfb info charmodename defaultvideomode charfontname defaultfontname structfb var screeninfovar Currentvar structfb fix screeninfofix Currentfix structfb ops fbops char screen base Virtualaddress 幀緩沖設(shè)備的驅(qū)動層接口 fb info Modename 設(shè)備名稱 Fontname 顯示字體 fb var screeninfo 記錄用戶可修改的顯示控制器參數(shù) 包括屏幕分辨率和每個像素點的比特數(shù) 其中的xres定義屏幕一行有多少個象素點 yres定義屏幕一列有多少個象素點 bits per pixel定義每個象素點用多少個字節(jié)表示 幀緩沖設(shè)備的驅(qū)動層接口 fb info fb fix screeninfo 記錄用戶不能修改的顯示控制器的參數(shù) 如屏幕緩沖區(qū)的物理地址 長度 當(dāng)對幀緩沖設(shè)備進(jìn)行映射操作的時候 就是從fb fix screeninfo中取得緩沖區(qū)物理地址的 Fb ops 指向底層操作的函數(shù)的指針 結(jié)構(gòu)體fb info的定義 如何寫幀緩沖設(shè)備驅(qū)動 遵循設(shè)備驅(qū)動程序的結(jié)構(gòu) 設(shè)備注冊 定義file operations接口 初始化LCDC寄存器初始化一個fb info結(jié)構(gòu) 填充其中的成員變量 并調(diào)用register framebuffer fb info 將fb info登記入內(nèi)核 實現(xiàn)定義的各個接口函數(shù) 幀緩沖驅(qū)動程序 初始化函數(shù) 新的FB驅(qū)動程序 需要向fbmem c drivers video 中的結(jié)構(gòu)體fb drivers中添加相應(yīng)的參數(shù)來給出初始化函數(shù)的入口 staticstruct constchar name int init void int setup char fb drivers initdata ifdefCONFIG FB PXA pxa pxafb init pxafb setup endif 幀緩沖驅(qū)動程序 初始化函數(shù) dbmx1fb init的主要操作初始化相關(guān)的寄存器初始化一個fb info結(jié)構(gòu) 填充其中的成員變量利用register framebuffer 向內(nèi)核注冊該設(shè)備 如何寫幀緩沖的應(yīng)用程序 在應(yīng)用程序中 操作幀緩沖設(shè)備的一般步驟如下 1 打開 dev fb設(shè)備文件 2 用ioctrl操作取得當(dāng)前顯示屏幕的參數(shù) 如屏幕分辨率 每個像素點的比特數(shù) 根據(jù)屏幕參數(shù)

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論