歡迎來到裝配圖網(wǎng)! | 幫助中心 裝配圖網(wǎng)zhuangpeitu.com!
裝配圖網(wǎng)
ImageVerifierCode 換一換
首頁 裝配圖網(wǎng) > 資源分類 > PPT文檔下載  

字符設(shè)備驅(qū)動程序.ppt

  • 資源ID:14286840       資源大?。?span id="5p8t6gm" class="font-tahoma">2.65MB        全文頁數(shù):44頁
  • 資源格式: PPT        下載積分:9.9積分
快捷下載 游客一鍵下載
會員登錄下載
微信登錄下載
三方登錄下載: 微信開放平臺登錄 支付寶登錄   QQ登錄   微博登錄  
二維碼
微信掃一掃登錄
下載資源需要9.9積分
郵箱/手機:
溫馨提示:
用戶名和密碼都是您填寫的郵箱或者手機號,方便查詢和重復(fù)下載(系統(tǒng)自動生成)
支付方式: 支付寶    微信支付   
驗證碼:   換一換

 
賬號:
密碼:
驗證碼:   換一換
  忘記密碼?
    
友情提示
2、PDF文件下載后,可能會被瀏覽器默認打開,此種情況可以點擊瀏覽器菜單,保存網(wǎng)頁到桌面,就可以正常下載了。
3、本站不支持迅雷下載,請使用電腦自帶的IE瀏覽器,或者360瀏覽器、谷歌瀏覽器下載即可。
4、本站資源下載后的文檔和圖紙-無水印,預(yù)覽文檔經(jīng)過壓縮,下載后原文更清晰。
5、試題試卷類文檔,如果標題沒有明確說明有答案則都視為沒有答案,請知曉。

字符設(shè)備驅(qū)動程序.ppt

上章回顧,Linux設(shè)備驅(qū)動的簡介,以及分類 字符設(shè)備 塊設(shè)備 網(wǎng)絡(luò)接口 模塊的應(yīng)用 如何編寫模塊 模塊相關(guān)的宏 模塊和應(yīng)用程序的區(qū)別 編譯和裝載內(nèi)核模塊,字符設(shè)備驅(qū)動程序,第2章,預(yù)習(xí)檢查,什么是主設(shè)備號和次設(shè)備號? 字符設(shè)備驅(qū)動程序的基本成員函數(shù)有哪些?,本章目標,掌握字符設(shè)備驅(qū)動程序的基本結(jié)構(gòu)和開發(fā)方法 掌握用戶空間調(diào)用設(shè)備驅(qū)動程序的方法,本章結(jié)構(gòu),字符設(shè)備驅(qū)動基本結(jié)構(gòu),字符設(shè)備驅(qū)動程序,用戶空間調(diào)用設(shè)備驅(qū)動程序,添加驅(qū)動程序到內(nèi)核,內(nèi)核配置和編譯方法,添加驅(qū)動程序到內(nèi)核中,主要概念和結(jié)構(gòu)體,實例,字符驅(qū)動的主要組成,2-1 字符設(shè)備驅(qū)動程序基本結(jié)構(gòu),字符設(shè)備開發(fā)的基本步驟 確定主設(shè)備號和次設(shè)備號 實現(xiàn)字符驅(qū)動程序 實現(xiàn)file_operations結(jié)構(gòu)體 實現(xiàn)初始化函數(shù),注冊字符設(shè)備 實現(xiàn)銷毀函數(shù),釋放字符設(shè)備 創(chuàng)建設(shè)備文件節(jié)點,2-1 字符設(shè)備驅(qū)動程序基本結(jié)構(gòu),什么是主設(shè)備號/次設(shè)備號 主設(shè)備號是內(nèi)核識別一個設(shè)備的標識。 整數(shù)(占12bits),范圍從0到4095,通常使用1到255 次設(shè)備號由內(nèi)核使用,用于正確確定設(shè)備文件所指的設(shè)備。 整數(shù)(占20bits),范圍從0到1048575,一般使用0到255,2-1 字符設(shè)備驅(qū)動程序基本結(jié)構(gòu),設(shè)備編號的內(nèi)部表達 dev_t類型(32位): 用來保存設(shè)備編號(包括主設(shè)備號(12位)和次設(shè)備號(20位) 從dev_t獲得主設(shè)備號和次設(shè)備號: MAJOR(dev_t); MINOR(dev_t); 將主設(shè)備號和次設(shè)備號轉(zhuǎn)換成dev_t類型: MKDEV(int major,int minor);,2-1 字符設(shè)備驅(qū)動程序基本結(jié)構(gòu),分配主設(shè)備號 手工分配主設(shè)備號:找一個內(nèi)核沒有使用的主設(shè)備號來使用。,#include int register_chrdev_region( dev_t first, unsigned int count, char *name );,要分配的設(shè)備編號范圍的起始值,次設(shè)備號經(jīng)常為0,所請求的連續(xù)設(shè)備編號的個數(shù),和該編號范圍關(guān)聯(lián)的設(shè)備名稱,2-1 字符設(shè)備驅(qū)動程序基本結(jié)構(gòu),動態(tài)分配主設(shè)備號:,#include int alloc_chrdev_resion(dev_t *dev,unsigned int firstminor, unsigned int count,char *name);,輸出的設(shè)備號,要使用的被請求的第一個次設(shè)備號,2-1 字符設(shè)備驅(qū)動程序基本結(jié)構(gòu),釋放設(shè)備號,void unregister_chrdev_region(dev_t first, unsigned int count);,通常在模塊的清除函數(shù)中調(diào)用。,2-1 字符設(shè)備驅(qū)動程序基本結(jié)構(gòu),實現(xiàn)字符驅(qū)動程序 cdev 結(jié)構(gòu)體,struct cdev struct kobject kobj; /* 內(nèi)嵌的kobject 對象 */ struct module *owner; /*所屬模塊*/ struct file_operations *ops; /*文件操作結(jié)構(gòu)體*/ struct list_head list; dev_t dev; /*設(shè)備號*/ unsigned int count; ;,2-1 字符設(shè)備驅(qū)動程序基本結(jié)構(gòu),操作cdev的函數(shù),void cdev_init( struct cdev *, struc t file_operations *); struct cdev *cdev_alloc(void) ; int cdev_add(st ruct cdev *, dev_t, unsigned) ; void cdev_del(struct cdev *);,用于初始化cdev的成員,并建立cdev和file_operations之間的連接,分別向系統(tǒng)刪除一個cdev,完成字符設(shè)備的注銷,通常在模塊的卸載函數(shù)中調(diào)用,分別向系統(tǒng)添加一個cdev,完成字符設(shè)備的注冊,通常在模塊加載函數(shù)中調(diào)用,函數(shù)用于動態(tài)申請一個cdev 內(nèi)存,2-1 字符設(shè)備驅(qū)動程序基本結(jié)構(gòu),file_operations 結(jié)構(gòu)體 字符驅(qū)動和內(nèi)核的接口: 在include/linux/fs.h定義 字符驅(qū)動只要實現(xiàn)一個file_operations結(jié)構(gòu)體 并注冊到內(nèi)核中,內(nèi)核就有了操作此設(shè)備的能力。,2-1 字符設(shè)備驅(qū)動程序基本結(jié)構(gòu),file_operations的主要成員: struct module *owner: 指向模塊自身 open:打開設(shè)備 release:關(guān)閉設(shè)備 read:從設(shè)備上讀數(shù)據(jù) write:向設(shè)備上寫數(shù)據(jù) ioctl:I/O控制函數(shù) llseek:定位讀寫指針 mmap:映射設(shè)備空間到進程的地址空間,2-1 字符設(shè)備驅(qū)動程序基本結(jié)構(gòu),file 結(jié)構(gòu)體 file結(jié)構(gòu): file_operations結(jié)構(gòu)相關(guān)的一個結(jié)構(gòu)體。 描述一個正在打開的設(shè)備文件。 成員: loff_t f_pos: 當(dāng)前讀/寫位置 unsigned int f_flags 標識文件打開時,是否可讀或可寫 O_RDONLY O_NONBLOCK O_SYNC struct file_operations *f_op 文件相關(guān)的操作,指向所實現(xiàn)的struct file_operations void *private_data: 私有數(shù)據(jù)指針。驅(qū)動程序可以將這個字段用于任何目的或者忽略這個字段。,2-1 字符設(shè)備驅(qū)動程序基本結(jié)構(gòu),inode 結(jié)構(gòu)體 內(nèi)核用inode結(jié)構(gòu)在內(nèi)部表示文件 Inode與file的區(qū)別 file表示打開的文件描述符 多個表示打開的文件描述符的file結(jié)構(gòu),可以指向單個inode結(jié)構(gòu)。,2-1 字符設(shè)備驅(qū)動程序基本結(jié)構(gòu),Inode結(jié)構(gòu)中的兩個主要字段: dev_t i_rdev; 對表示設(shè)備文件的inode結(jié)構(gòu),該字段包含了真正的設(shè)備編號。 struct cdev *i_cdev; struct cdev是表示字符設(shè)備的內(nèi)核的內(nèi)部結(jié)構(gòu)。 當(dāng)inode指向一個字符設(shè)備文件時,該字段包含了指向struct cdev結(jié)構(gòu)的指針 從一個inode中獲得主設(shè)備號和次設(shè)備號:,unsigned int iminor(struct inode *inode); unsigned int imajor(struct inode *inode);,2-1 字符設(shè)備驅(qū)動程序基本結(jié)構(gòu),注冊設(shè)備 ,在模塊或驅(qū)動初始化時調(diào)用 Linux-2.4 及之前 Linux-2.6,int register_chrdev(unsigned int major, const char *name, struct file_operations *fops),如何操作字符設(shè)備的接口,void cdev_init( struct cdev *, struc t file_operations *); int cdev_add(st ruct cdev *, dev_t, unsigned) ;,2-1 字符設(shè)備驅(qū)動程序基本結(jié)構(gòu),注銷設(shè)備:在模塊卸載時調(diào)用 Linux-2.4及之前 Linux-2.6,int unregister_chrdev(unsigned int major, const char *name);,void cdev_del (struct cdev *);,2-1 字符設(shè)備驅(qū)動程序基本結(jié)構(gòu),/ /設(shè)備驅(qū)動模塊加載函數(shù) static int _init xxx_init(void) . cdev_init( / /注冊設(shè)備 . ,2-1 字符設(shè)備驅(qū)動程序基本結(jié)構(gòu),/*設(shè)備驅(qū)動模塊卸載函數(shù)*/ static void _exit xxx_exit(void) unregister_chrdev_region(xxx_dev_no, 1); / /釋放占用的設(shè)備號 cdev_del( / /注銷設(shè)備 . ,2-1 字符設(shè)備驅(qū)動程序基本結(jié)構(gòu),打開 模塊使用計數(shù)加1 識別次設(shè)備號 硬件操作: 檢查設(shè)備相關(guān)錯誤(諸如設(shè)備未就緒或類似的硬件問題); 如果設(shè)備是首次打開,則對其初始化; 如果有中斷操作,申請中斷處理程序;,int open(struct inode *inode, struct file *filp) ;,2-1 字符設(shè)備驅(qū)動程序基本結(jié)構(gòu),關(guān)閉 模塊使用計數(shù)減1 釋放由open分配的,保存在filpprivate_data里的所有內(nèi)容。 硬件操作: 如果申請了中斷,則釋放中斷處理程序。 在最后一次關(guān)閉操作時關(guān)閉設(shè)備。,int release(struct inode *inode, struct file *filp) ;,2-1 字符設(shè)備驅(qū)動程序基本結(jié)構(gòu),read/write,ssize_t read(struct file *filp, char _user *buff, size_t count, loff_t *offp); ssize_t write(struct file *filp, const char _user *buff, size_t count, loff_t *offp);,指向用戶空間的緩沖區(qū),這個緩沖區(qū)或者保存將寫入的數(shù)據(jù),或者是一個存放新讀入數(shù)據(jù)的空緩沖區(qū)。,用戶在文件中存取操作的位置,2-1 字符設(shè)備驅(qū)動程序基本結(jié)構(gòu),用戶空間和內(nèi)核空間之間的數(shù)據(jù)拷貝過程, 不能簡單的用指針操作或者memcpy來進行數(shù)據(jù)拷貝 用戶空間的數(shù)據(jù)是可以被換出的,會產(chǎn)生一個頁面失效異常。 用戶空間的地址無法在內(nèi)核空間中使用。 用戶空間和內(nèi)核空間之間進行數(shù)據(jù)拷貝的函數(shù): 如果要復(fù)制的內(nèi)存是簡單類型,如char、int、long 等, put_user()和get_user(),unsigned long copy_from_user(void *to, const void _user *from, unsigned long count) ; unsigned long copy_to_user(void _user *to, const void *from, unsigned long count );,2-1 字符設(shè)備驅(qū)動程序基本結(jié)構(gòu),讀設(shè)備模板 ssize_t xxx_read(struct file *filp, char _user *buf, size_t count ,loff_t*f_pos) . copy_to_user(buf, ., . ); . 寫設(shè)備模板 ssize_t xxx_write(struct file *fil p, const char _user *buf , size_t count ,loff_t *f_pos) . copy_from_user(., buf, . ); . ,2-1 字符設(shè)備驅(qū)動程序基本結(jié)構(gòu),ioctl函數(shù) 為設(shè)備驅(qū)動程序執(zhí)行“命令”提供了一個特有的入口點 用來設(shè)置或者讀取設(shè)備的屬性信息。,int ioctl (struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg);,事先定義的IO控制命令 代碼,arg為對應(yīng)于cmd命令的參數(shù),2-1 字符設(shè)備驅(qū)動程序基本結(jié)構(gòu),cmd 參數(shù)的定義 不推薦用0 x1,0 x2,0 x3之類的值 Linux對ioctl()的cmd參數(shù)有特殊的定義 構(gòu)造命令編號的宏: _IO(type,nr)用于構(gòu)造無參數(shù)的命令編號; _IOR(type,nr,datatype)用于構(gòu)造從驅(qū)動程序中讀取數(shù)據(jù)的命令編號; _IOW(type,nr,datatype)用于寫入數(shù)據(jù)的命令; _IOWR(type,nr,datatype)用于雙向傳輸。 type和number位字段通過參數(shù)傳入,而size位字段通過對datatype參數(shù)取sizeof獲得。,2-1 字符設(shè)備驅(qū)動程序基本結(jié)構(gòu),Ioctl函數(shù)模板 int xxx_ioctl( struct inode *inode, struct f ile *filp, unsigned int cmd, unsigned long arg) . switch (cmd) case XXX_CMD1: . break; case XXX_CMD2: . break; default: /*不能支持的命令 */ return - ENOTTY; return 0; ,階段總結(jié),本節(jié)介紹了字符設(shè)備驅(qū)動結(jié)構(gòu),2-2 添加驅(qū)動程序到內(nèi)核,配置內(nèi)核 編譯內(nèi)核 添加驅(qū)動程序到內(nèi)核中,2-2 添加驅(qū)動程序到內(nèi)核,配置內(nèi)核 配置命令包括: make config make menuconfig make xconfig make gconfig 可通過“上”、“下”、“左”、“右”鍵移動菜單,選擇某項按“Y”,取消 選擇按“N”,如果選擇某項編譯為模塊按“M”,進入子菜單按“Enter”,返回 上一級菜單按 “Esc” 使用make config、make menuconfig等命令后,會生成一個.config配置文件(是 隱身文件,通過ls a才能看到),2-2 添加驅(qū)動程序到內(nèi)核,編譯內(nèi)核 可用如下命令編譯內(nèi)核: make ARC=arm CROSS_COMPILE=arm-linux- zImage 源代碼根目錄的Makefile中將ARCH和CROSS_COMPILE直接指定為arm和arm-linux-,如:,這樣就沒有必要每次編譯的時候都指定體系結(jié)構(gòu)和交叉編譯器了,只須使用下面命令就可以了: make zImage,ARCH?= arm CROSS_COMPILE?= arm-linux-,2-2 添加驅(qū)動程序到內(nèi)核,添加驅(qū)動程序到內(nèi)核 Linux 2.6內(nèi)核的配置系統(tǒng)由以下3個部分組成。 Makefile:分布在Linux內(nèi)核源代碼中的Makefite 定義Linux內(nèi)核的編譯規(guī)則 配置文件(Kconfig):給用戶提供配置選擇的功能。 配置工具: 包括配置命令解釋器(對配置腳本中使用的配置命令進行解釋) 配置用戶界面(提供字符界面和圖形界面)。 這些配置工具都是使用腳本語言編寫的,如Tcl/TK、Perl等。 在Linux內(nèi)核中增加程序需要完成以下3項工作。 將編寫的源代碼復(fù)制到Linux內(nèi)核源代碼的相應(yīng)目錄。 在目錄的Kconfig文件中增加新源代碼對應(yīng)項目的編譯配置選項。 在目錄的Makefile文件中增加對新源代碼的編譯條目。,2-2 添加驅(qū)動程序到內(nèi)核,實例:在內(nèi)核源代碼drivers目錄下為ARM體系結(jié)構(gòu)新增test driver test driver的樹形目錄: 步驟: 1、拷貝test到drivers路徑下 2、為新增目錄創(chuàng)建Kconfig和Makefile 3、修改新增目錄父目錄的Kconfig和 Makefile,以便新增的Kconfig和 Makefile能夠被引用 4、在arch/arm/Kconfig里增加 source “drivers/test/Kconfig”,2-2 添加驅(qū)動程序到內(nèi)核,步驟: 1、拷貝test到drivers路徑下 cp fr test linux_kernel_path/drivers 2、為新增目錄創(chuàng)建Kconfig和Makefile,2-2 添加驅(qū)動程序到內(nèi)核,修改新增目錄的父目錄的Kconfig和Makefile 在drivers/Kconig中加入:source drivers/test/Kconfig“ 在drivers/Makefile中加入:obj-$(CONFIG_TEST) += test/ 在arch/arm/Kconfig里加入:source “drivers/test/Kconfig” 增加了Kconfig和Makefile文件之后的新的test樹型目錄如下所示:,階段總結(jié),配置和編譯Linux內(nèi)核的方法 如何將驅(qū)動程序加入到內(nèi)核中-Makefile char read_buf10; dev_fd = open(/dev/node_name,O_RDWR | O_NONBLOCK); if ( dev_fd = -1 ) printf(Cannt open file /dev/ node_name n); exit(1); read(dev_fd, read_buf, 5); ioctl (dev_fd, XXX_IOCTL_CMD,0); close(dev_fd); return 0; ,2-3 用戶空間調(diào)用設(shè)備驅(qū)動程序,編寫Makefile,KERNELDIR ?=/your_kernel_path/include all: main main : main.c arm-linux-gcc -I$(KERNELDIR) -o $ $ clean : rm main,階段總結(jié),手動創(chuàng)建設(shè)備節(jié)點方法 用戶層如何調(diào)用驅(qū)動程序 編寫用戶程序的Makefile,本章總結(jié),字符設(shè)備驅(qū)動主要結(jié)構(gòu)和開發(fā)方法,如何配置、編譯內(nèi)核,以及如何把驅(qū)動程序添加到內(nèi)核,如何在用戶空間調(diào)用驅(qū)動,字符設(shè)備驅(qū)動基本結(jié)構(gòu),字符設(shè)備驅(qū)動程序,用戶空間調(diào)用設(shè)備驅(qū)動程序,添加驅(qū)動程序到內(nèi)核,內(nèi)核配置和編譯方法,添加驅(qū)動程序到內(nèi)核中,主要概念和結(jié)構(gòu)體,實例,字符驅(qū)動的主要組成,實驗,任務(wù)一、蜂鳴器驅(qū)動程序編寫與測試,

注意事項

本文(字符設(shè)備驅(qū)動程序.ppt)為本站會員(za****8)主動上傳,裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。 若此文所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng)(點擊聯(lián)系客服),我們立即給予刪除!

溫馨提示:如果因為網(wǎng)速或其他原因下載失敗請重新下載,重復(fù)下載不扣分。




關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!