




已閱讀5頁,還剩48頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
嵌入式LINUX設備驅動程序 本講主要內容 嵌入式linux設備驅動的基本框架與實現(xiàn)數(shù)碼管顯示驅動程序分析幀緩沖顯示驅動實現(xiàn)方法 Linux系統(tǒng)中的設備文件 Linux將所有外部設備看成是一類特殊文件 稱之為 設備文件 如果說系統(tǒng)調用是Linux內核和應用程序之間的接口 那么設備驅動程序則可以看成是Linux內核與外部設備之間的接口 設備驅動程序向應用程序屏蔽了硬件在實現(xiàn)上的細節(jié) 使得應用程序可以像操作普通文件一樣來操作外部設備 Linux設備驅動在系統(tǒng)中的層次 設備驅動的作用 設備驅動是位于應用和物理設備之間的軟件層 負責完成二者間的I O操作 在LINUX系統(tǒng)里 對用戶程序 設備驅動隱藏了設備的具體細節(jié) 為不同設備提供了一致的接口 設備驅動是嵌入式系統(tǒng)開發(fā)的重要內容之一 設備驅動完成的主要功能 對設備的初始化和釋放 將數(shù)據(jù)從內核傳遞到硬件設備 以及從硬件讀取數(shù)據(jù) 讀取應用程序傳送給設備文件的數(shù)據(jù) 并回送應用程序請求的數(shù)據(jù) 這需要在用戶空間 內核空間 總線以及外設之間傳輸數(shù)據(jù) 檢查和處理設備出現(xiàn)的錯誤 設備驅動的分類 Linux支持3種不同類型的設備字符設備塊設備網絡接口字符設備能夠像字節(jié)流一樣被訪問的設備 一般不需要緩存技術 也不支持隨機訪問 典型的字符設備有 鼠標 鍵盤 I O設備等 設備驅動的分類 塊設備支持面向塊訪問的設備 每塊包含2的N次冪字節(jié)數(shù)據(jù) 典型的塊大小為512或1024B 大多數(shù)塊設備允許隨機訪問 而且常常采用buffer cache等緩存技術 塊設備的訪問常常通過文件系統(tǒng)來進行 典型的塊設備有 如磁盤 硬盤 光盤驅動器等 設備驅動的分類 網絡接口能夠和其他主機交換數(shù)據(jù)的設備接口 網絡接口只是面向數(shù)據(jù)包而不是數(shù)據(jù)流 它沒有被映射為任何設備文件 其訪問要通過BSD套接口進行 設備驅動的分類 主設備號與次設備號 LINUX系統(tǒng)中 設備由一個主設備號和一個次設備號來唯一標識 主設備號唯一標識了設備類型 即設備驅動程序類型 它是塊設備表或字符設備表中設備表項的索引 一些典型設備的主設備號已經基本固定下來 例如 軟驅的主設備號為2 IDE硬盤的主設備號為3等等 設備宏操作MAJOR 可以獲取主設備號 主設備號與次設備號 次設備號用于標識使用同一設備驅動程序的不同硬件 并僅由設備驅動程序解釋當應用程序操作某個設備文件時 Linux內核根據(jù)其主設備號調用相應的驅動程序 并從用戶態(tài)進入內核態(tài)驅動程序判斷次設備號 并完成相應的硬件操作 用戶空間和內核空間 Linux運行在2種模式下內核模式用戶模式內核模式對應內核空間 而用戶模式對應用戶空間 驅動程序作為內核的一部分 它對應內核空間 應用程序不能直接訪問其數(shù)據(jù) 用戶空間和內核空間 用戶空間和內核空間的數(shù)據(jù)傳遞 copy to user void to constvoid from unsignedlongcount copy from user void to constvoid from unsignedlongcount copy to user copy from user 第一種方法在復制數(shù)據(jù)的同時 會進行地址空間的有效性檢查 內核設備驅動模塊 設備驅動程序以兩種方式添加到內核 Buildin直接把驅動程序編譯到內核代碼中Module以模塊的方式加載驅動程序加載 insmoddriver o卸載 rmmoddriver查看 lsmod Linux設備節(jié)點的添加 設備節(jié)點位于 dev路徑下可用如下命令添加dev節(jié)點 b代表塊設備 C表示字符設備mknod dev hda1b c 1271塊設備 主設備號127 次設備號1 Linux設備驅動代碼的分布 char 字符設備驅動源碼 block 塊設備驅動源碼 cdrom LinuxCDROM驅動源碼 這里可以找到某些特殊的CDROM設備 如SoundblasterCDROM IDE接口的CD驅動位于drivers ide ide cd c中而SCSICD驅動位于drivers scsi scsi c中 pci 它包含了PCI偽設備驅動源碼 這里可以找到關于PCI子系統(tǒng)映射與初始化的代碼 Linux設備驅動代碼的分布 scsi 所有的SCSI代碼以及Linux支持的SCSI設備的設備驅動 net 包含網絡驅動源碼 sound 所有的聲卡驅動源碼 video 所有的視頻卡驅動源碼 19 Linux設備驅動的代碼結構 驅動程序的注冊與注銷設備的打開與釋放設備的讀寫操作設備的控制操作設備的中斷和輪詢處理等 設備驅動的注冊 方法1result devfs register chrdev 0 MOD NAME MOD NAME 設備驅動的名稱 keypad fops 文件操作指針 優(yōu)點 無需手動創(chuàng)建設備節(jié)點 由系統(tǒng)自動完成 對于塊設備的注冊 具有類似函數(shù) devfs register blkdev以及操作過程 設備驅動的注冊 方法2result register chrdev 0 MOD NAME mknod dev MOD NAMECMAJORMINOR 設備驅動的注銷 方法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ù)open 和release 來完成 主要完成設備的初始化工作以及設備的釋放 文件操作結構體的定義 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 文件操作結構體的定義 int open structinode structfile int release structinode structfile int fsync structfile structdentry intdatasync 文件操作結構體的主要函數(shù) open 用于打開文件設備release 在關閉文件的調用read 用于從設備中讀取數(shù)據(jù)write 向設備發(fā)送數(shù)據(jù)poll 查詢設備是否可讀或可寫ioctl 提供執(zhí)行設備特定命令的方法fasync 用于設備的異步通知操作 設備的讀寫 字符設備的讀寫操作可以直接使用read 和write 函數(shù)來完成 塊設備的讀寫 需要調用block read 和block write 函數(shù) 這2個函數(shù)向設備請求表中增加讀寫請求 塊設備的讀寫是對內存緩沖區(qū)進行操作 如果內存緩沖區(qū)中沒有要讀入的數(shù)據(jù) 或者緩沖區(qū)中的數(shù)據(jù)需要寫入設備 可以通過調用數(shù)據(jù)結構blk dev struct中的函數(shù)request fn 完成 設備的控制操作 對設備的控制操作可通過文件操作數(shù)據(jù)結構中的ioctl 函數(shù)來完成 控制操作與具體的設備有密切關系 需要根據(jù)設備實際情況進行具體分析 設備的輪詢和中斷處理 輪詢方式對于不支持中斷的硬件設備 讀寫時需要輪流查詢設備的狀態(tài) 以便決定隨后的數(shù)據(jù)操作 如果輪詢處理方式的驅動程序被鏈接到內核 則意味著查詢過程中 內核一直處于閑置狀態(tài) 解決辦法是使用內核定時器 進行定期查詢 設備的輪詢和中斷處理 中斷處理方式硬件在需要的時候 向內核發(fā)出中斷請求信號 而內核則負責把中斷信號傳遞給相應的設備驅動 驅動程序必須在設備驅動的初始化時申請中斷資源 并注冊中斷處理函數(shù) 申請 request irq irq irq handler flag dev name dev id 釋放 free irq irq dev id 其中irq為申請的中斷線號 irq handler為注冊的中斷處理函數(shù) dev id用于共享中斷信號線 典型字符驅動程序框架 staticstructfile operationsdemo fops read demo readwrite demo writeopen demo open intinit module void returndemo init 用于注冊設備驅動 申請中斷線 初始化等voidcleanup module void demo cleanup 用于注銷設備驅動 釋放中斷線等接口函數(shù)的實現(xiàn) Example1 PXA270開發(fā)系統(tǒng)的按鍵驅動程序與數(shù)碼顯示驅動數(shù)碼顯示源代碼按鍵驅動源代碼 調試驅動程序 使用printk輸出信息 信息的優(yōu)先級依次為 KERN EMERGKERN ALERTKERN CRITKERN ERRKERN WARNINGKERN NOTICEKERN INFOKERN DEBUG如果要在終端輸出信息 編譯選項 Wall O2根據(jù) kernel printk c的不同設置 不顯示的信息會出現(xiàn)在 var log messages中驅動調試方法參見LinuxDeviceDriverschapter3 幀緩沖設備驅動程序 LCD分類 LCD可由為液晶照明的方式有兩種 傳送式和反射式傳送式屏幕要使用外加光源照明 稱為背光 backlight 照明光源要安裝在LCD的背后 傳送式LCD在正常光線及暗光線下 顯示效果都很好 但在戶外 尤其在日光下 很難辯清顯示內容 反射式屏幕 則不需要外加照明電源 使用周圍環(huán)境的光線 或在某些筆記本中 使用前部照明系統(tǒng)的光線 這樣 反射式屏幕就沒有背光 所以 此種屏幕在戶外或光線充足的室內 才會有出色的顯示效果 但在一般室內光線下 這種顯示屏的顯示效果就不及背光傳送式的 幀緩沖 Framebuffer 幀緩沖 framebuffer 顯示緩沖區(qū)是Linux為顯示設備提供的一個接口 是把顯存抽象后的一種設備 他允許上層應用程序在圖形模式下直接對顯示緩沖區(qū)進行讀寫操作 Xwindow繪制窗口 顯示漢字都是通過fb 幀緩沖設備 Linux可支持最多32個 dev fb0 dev fb31缺省是 dev fb0可以直接拷貝位圖到fb來顯示到屏幕cp bitmap penguin bin dev fb0 幀緩沖設備驅動原理 幀緩沖設備屬于字符設備 其目的就是通過配置PXA270的寄存器 在一段指定的內存與LCD之間建立一個自動傳輸?shù)耐ǖ?這樣 任何程序只要修改這段內存中的數(shù)據(jù) 就可以改變LCD上的顯示內容 幀緩沖設備的文件操作層接口 staticstructfile operationsfb fops owner THIS MODULE read fb read 讀操作 write fb write 寫操作 ioctl fb ioctl 控制操作 mmap fb mmap 映射操作 open fb open 打開操作 release fb release 關閉操作 其中的成員函數(shù)都在文件linux driver video fbmem c中定義 幀緩沖設備的文件操作層接口 控制操作函數(shù)fb ioctl通過以下參數(shù)來傳遞控制命令FBIOGET VSCREENINFOFBIOPUT VSCREENINFOFBIOGET FSCREENINFO映射操作函數(shù)fb mmap將顯示緩存映射到用戶空間 幀緩沖設備的驅動層接口 fb info structfb info charmodename defaultvideomode charfontname defaultfontname structfb var screeninfovar Currentvar structfb fix screeninfofix Currentfix structfb ops fbops char screen base Virtualaddress 幀緩沖設備的驅動層接口 fb info Modename 設備名稱 Fontname 顯示字體 fb var screeninfo 記錄用戶可修改的顯示控制器參數(shù) 包括屏幕分辨率和每個像素點的比特數(shù) 其中的xres定義屏幕一行有多少個象素點 yres定義屏幕一列有多少個象素點 bits per pixel定義每個象素點用多少個字節(jié)表示 幀緩沖設備的驅動層接口 fb info fb fix screeninfo 記錄用戶不能修改的顯示控制器的參數(shù) 如屏幕緩沖區(qū)的物理地址 長度 當對幀緩沖設備進行映射操作的時候 就是從fb fix screeninfo中取得緩沖區(qū)物理地址的 Fb ops 指向底層操作的函數(shù)的指針 結構體fb info的定義 如何寫幀緩沖設備驅動 遵循設備驅動程序的結構 設備注冊 定義file operations接口 初始化LCDC寄存器初始化一個fb info結構 填充其中的成員變量 并調用register framebuffer fb info 將fb info登記入內核 實現(xiàn)定義的各個接口函數(shù) 幀緩沖驅動程序 初始化函數(shù) 新的FB驅動程序 需要向fbmem c drivers video 中的結構體fb drivers中添加相應的參數(shù)來給出初始化函數(shù)的入口 staticstruct constchar name int init void int setup char fb drivers initdata ifdefCONFIG FB PXA pxa pxafb init pxafb setup endif 幀緩沖驅動程序 初始化函數(shù) dbmx1fb init的主要操作初始化相關的寄存器初始化一個fb info結構 填充其中的成員變量利用register framebuffer 向內核注冊該設備 如何寫幀緩沖的應用程序 在應用程序中 操作幀緩沖設備的一般步驟如下 1 打開 dev fb設備文件 2 用ioctrl操作取得當前顯示屏幕的參數(shù) 如屏幕分辨率 每個像素點的比特數(shù) 根據(jù)屏幕參數(shù)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公婆贈與合同范例
- 企業(yè)出售二手車合同范例
- 公司研發(fā)總監(jiān)勞動合同范例
- 保姆停車服務合同范例
- 中級會計考試的核心知識點回顧及試題答案
- 公司股權分合同范例
- ip形象設計合同范例
- 2024年高級會計熱力圖分析試題及答案
- 中國化肥進口合同樣本
- 2024年消防工程師復習試題及答案
- 2022新高考卷小說《江上》 答案+評點
- 裝配式擋墻專項施工方案
- 閩教版(2020版)六年級下冊信息技術整冊教案
- 光電倍增管PPT
- 1-2會員代表選票
- 年成都遠洋太古里案例解析(p)PPT課件
- 知識產權戰(zhàn)略案例分析
- 滬科七年級數(shù)學下冊 實數(shù)單元綜合測試卷解析
- 學生安全協(xié)議書5篇
- 污水廠設備管理培訓(共110頁).ppt
- 雍琦版-《法律邏輯學》課后習題答案(共78頁)
評論
0/150
提交評論