Linux設備驅動程序(同名71)課件_第1頁
Linux設備驅動程序(同名71)課件_第2頁
Linux設備驅動程序(同名71)課件_第3頁
Linux設備驅動程序(同名71)課件_第4頁
Linux設備驅動程序(同名71)課件_第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、Linux設備驅動程序docin/sundae_meng內(nèi)容設備分類設備驅動程序的框架字符型設備網(wǎng)絡設備文件系統(tǒng)User Space File SystemUSB設備FrameBuffer例子和使用Debug原理和Debug方法常用設備/fb/ram/loopback/zero設備驅動程序的任務設備初始化硬件操作和管理外部硬件和內(nèi)核空間的數(shù)據(jù)傳遞內(nèi)核空間和用戶空間的數(shù)據(jù)傳遞設備驅動程序的功能外部硬件設備驅動程序用戶程序存儲緩沖用戶空間內(nèi)核空間用戶態(tài)程序 vs 內(nèi)核態(tài)程序用戶程序權限受限虛擬運行環(huán)境邏輯地址關鍵資源訪問受監(jiān)管函數(shù)調用由用戶控制內(nèi)核程序最高權限實際的運行環(huán)境物理地址可訪問所有資源函

2、數(shù)由內(nèi)核直接調用 可以運行驅動程序設備操作和管理能運行在用戶態(tài)嗎?地址映射與物理地址訪問物理地址空間用戶進程1用戶進程2用戶進程3虛擬地址映射用戶利用指針訪問的是虛地址,不是物理地址,IO設備的物理地址可能是用戶進程不可觸及的虛擬地址映射虛擬地址映射直接訪問內(nèi)核內(nèi)存(/dev/kmem)kmfd=open(/dev/kmem,O_RDONLY);lseek(kmfd,offset,SEEK_SET);read(kmfd,byteArray,byteArrayLen);close(kmfd);直接訪問內(nèi)核地址(內(nèi)核態(tài)的虛地址)一般內(nèi)核地址起始于0 xC0000000直接訪問物理地址(/dev/m

3、em)mem_fd=open(/dev/mem,O_RDONLY);b=mmap(0, 0 x10000, PROT_READ|PROT_WRITE,MAP_SHARED, mem_fd,0 xA0000)close(memfd);0 xA00000 xB0000Pointer bmmap將文件中的數(shù)據(jù)映射成數(shù)組這里是將物理內(nèi)存(由特殊文件/dev/mem訪問)映射成指針b指向的數(shù)組。注意,指針b的值不一定是0 xA0000,它是和物理地址0 xA0000對應的用戶態(tài)的虛擬地址Linux中/dev/mem主要是用于設備內(nèi)存的訪問(比如顯卡內(nèi)存),而不是普通存儲器直接訪問IO端口(/dev/po

4、rt)port_fd=open(/dev/port, O_RDWR);lseek(port_fd,port_addr,SEEK_SET);read(port_fd,);write(port_fd,); close(port_fd);注意:不能用fopen/fread/fwrite/fclose因為它們有數(shù)據(jù)緩沖,對讀寫操作不是立即完成的outb()/outw()/inb()/inw()函數(shù)#include #include #include #define BASEPORT 0 x378 / printerint main() ioperm(BASEPORT, 3, 1);/ get acce

5、ss permission outb(0, BASEPORT); usleep(100000); printf(status: %dn, inb(BASEPORT + 1); ioperm(BASEPORT, 3, 0);/ give up exit(0);ioperm(from,num,turn_on) 用ioperm申請的操作端口地址在0 x0000 x3FF,利用iopl()可以申請所有的端口地址必須以root運行用 “gcc -02 o xxx.elf xxx.c” 編譯 outb(value, port); inb(port); / 8-bitoutw(value, port); i

6、nw(port); / 16-bit訪問時間大約1us設備驅動程序內(nèi)訪問設備地址設備驅動程序可以通過指針訪問設備地址設備驅動程序接觸到的還是虛擬地址,但對于外界設備有固定的設備地址映射(設備的地址在移植Linux時候確定)物理內(nèi)存地址空間設備驅動程序虛擬地址映射設備地址空間設備地址映射設備驅動程序虛擬地址映射設備地址映射直接訪問IO端口 vs 設備驅動程序IO直接訪問用戶態(tài)程序編寫/調試簡單查詢模式,響應慢設備共享管理困難設備驅動訪問核心態(tài)編程調試困難可用中斷模式訪問、快設備共享管理簡單(由內(nèi)核幫助完成)設備分類字符設備鼠標、串口、游戲桿塊設備磁盤、打印機網(wǎng)絡設備由BSD Socket訪問字符

7、設備 vs 塊設備字符設備字符設備發(fā)出讀/寫請求時,對應的硬件I/O一般立即發(fā)生。數(shù)據(jù)緩沖可有可無ADC/DAC、按鈕、LED、傳感器等塊設備利用一塊系統(tǒng)內(nèi)存作緩沖區(qū),一般讀寫由緩沖區(qū)直接提供,盡量減少IO操作針對磁盤等慢速設備可裝卸的設備驅動程序和靜態(tài)連接到內(nèi)核的設備驅動程序靜態(tài)連接到內(nèi)核的設備驅動程序修改配置文件、重新編譯和安裝內(nèi)核可裝卸的設備驅動程序insmod裝載rmmod卸載lsmod查詢Linux對硬件設備的抽象設備文件Open/Close/Read/Write例子/dev/mouse/dev/lp0驅動程序與設備文件設備驅動程序設備文件用mknod命令創(chuàng)建用insmod命令安裝,

8、或直接編譯到內(nèi)核中用戶程序用open/read/write/close等命令訪問通過主設備號找到設備驅動驅動程序代碼結構驅動程序注冊與注銷設備文件的操作函數(shù)(*open)()(*write)()(*flush)()(*llseek)()中斷服務程序LED設備驅動程序的例子CPUstruct file_operations LED_fops = read: LED_read, write: LED_write, open: LED_open, release: LED_release,;int LED_init_module(void) SET_MODULE_OWNER(&LED_fops);

9、LED_major = register_chrdev(0, LED, &LED_fops); LED_off(); LED_status=0; return 0; void LED_cleanup_module(void) unregister_chrdev(LED_major, LED); module_init(LED_init_module);module_exit(LED_cleanup_module);程序列表 (1)程序列表 (2)int LED_open(struct inode *inode, struct file *filp) printk(LED_open()n); M

10、OD_INC_USE_COUNT; return 0;int LED_release(struct inode *inode, struct file *filp) printk(“LED_release()n“); MOD_DEC_USE_COUNT; return 0;程序列表 (3)ssize_t LED_read (struct file *filp, char *buf, size_t count, loff_t *f_pos) int i; for (i=0; icount; i+) *(char*)(buf+i) = LED_Status; return count;ssize_

11、t LED_write(struct file *filp, const char *buf, size_t count, loff_t *f_pos) int i; for (i=0; iLED_on(); else Data-LED_off(); return count;(*(volatile unsigned int *)(0 xXXXXXXXX) |= MASK;(*(volatile unsigned int *)(0 xXXXXXXXX) &=MASK;#ifndef _KERNEL_ #define _KERNEL_#endif#ifndef MODULE #define MO

12、DULE#endif#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include MODULE_AUTHOR(Rendong Ying);int LED_major, LED_status;程序列表 (4)頭文件程序編譯 (Makefile)CC = arm-elf-linux-gccLD = arm-elf-linux-ldINCLU

13、DE = /usr/local/src/bspLinux/includeLIB_INC = /usr/local/lib/gcc-lib/arm-elf-linux/2.95.3/includeCFLAGS = -O6 -Wall -DCONFIG_KERNELD -DMODULE -D_KERNEL_ -DLinux -nostdinc -I- -I . -I$(INCLUDE) -idirafter $(LIB_INC)LED.o: LED.c$(CC) $(CFLAGS) -c LED.cclean:rm -f LED.o生成o文件設備裝載和設備文件建立chmod +x /tmp/LED

14、.o/sbin/insmod -f ./LED.ocat /proc/devices得到裝入內(nèi)核的主設備號mknod /dev/Lamp c Num1 Num2Num1為主設備號Num2為次設備號強制安裝,忽略版本檢查設備的測試和使用命令行echo 8 /proc/sys/kernel/printkcat /dev/Lamp cat /dev/Lamp 程序void main() int fd=open(“/dev/Lamp, O_RDWR); write(fd, &data, 1); close(fd);開啟printk,也可以從/var/log/messages看printk的記錄設備卸載/sbin/rmmod LEDrm -f /dev/LampFunction ofMOD_INC_USE_COUNT;MOD_DEC_USE_COUNT;復雜的設備驅動程序驅動程序注冊與注銷(注冊/注銷 設備、中斷)設備文件的操作函數(shù)(*open)()(*write)()(*flush)()(*llseek)()中斷服務程序內(nèi)核數(shù)據(jù)緩沖區(qū)用戶數(shù)據(jù)空間復雜設備驅動程序的例子(USB Device)中斷資源申請

溫馨提示

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

評論

0/150

提交評論