分析第八章嵌入式Linux設(shè)備驅(qū)動(dòng)編程_第1頁(yè)
分析第八章嵌入式Linux設(shè)備驅(qū)動(dòng)編程_第2頁(yè)
分析第八章嵌入式Linux設(shè)備驅(qū)動(dòng)編程_第3頁(yè)
分析第八章嵌入式Linux設(shè)備驅(qū)動(dòng)編程_第4頁(yè)
分析第八章嵌入式Linux設(shè)備驅(qū)動(dòng)編程_第5頁(yè)
已閱讀5頁(yè),還剩39頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、分析第八章嵌入式Linux設(shè)備驅(qū)動(dòng)編程第八章-嵌入式Linux設(shè)備驅(qū)動(dòng)編程3 8.1 設(shè)備驅(qū)動(dòng)概述8.2 字符設(shè)備驅(qū)動(dòng)編程8.3 GPIO驅(qū)動(dòng)程序?qū)嵗?.4 4*4掃描按鍵驅(qū)動(dòng)8.5 小結(jié)8.6 思考與練習(xí)本章課程:本章課程:4 8.1.1 Linux設(shè)備驅(qū)動(dòng)概述設(shè)備驅(qū)動(dòng)概念操作系統(tǒng)是通過(guò)各種驅(qū)動(dòng)程序來(lái)駕馭硬件設(shè)備的,它為用戶屏蔽了各種各樣的設(shè)備,驅(qū)動(dòng)硬件是操作系統(tǒng)最基本的功能,并且提供統(tǒng)一的操作方式。設(shè)備驅(qū)動(dòng)程序是操作系統(tǒng)最基本的組成部分之一,在Linux內(nèi)核源程序中也占有60%以上。因此,熟悉驅(qū)動(dòng)的編寫(xiě)是很重要的。Linux的一個(gè)重要特點(diǎn)就是將所有的設(shè)備都當(dāng)做文件進(jìn)行處理,這一類特殊文件就

2、是設(shè)備文件(通常在/dev目錄下),這樣在應(yīng)用程序看來(lái),硬件設(shè)備只是一個(gè)設(shè)備文件,應(yīng)用程序可以象操作普通文件一樣對(duì)硬件設(shè)備進(jìn)行操作,這樣就大大方便了對(duì)設(shè)備的處理。8.1 設(shè)備驅(qū)動(dòng)編程基礎(chǔ)5 8.1.1 Linux設(shè)備驅(qū)動(dòng)概述Linux系統(tǒng)的設(shè)備分為三類:字符設(shè)備、塊設(shè)備和網(wǎng)絡(luò)設(shè)備。字符設(shè)備通常指像普通文件或字節(jié)流一樣,以字節(jié)為單位順序讀寫(xiě)的設(shè)備, 如并口設(shè)備、虛擬控制臺(tái)等。塊設(shè)備通常指一些需要以塊為單位隨機(jī)讀寫(xiě)的設(shè)備,如IDE硬盤(pán)、SCSI硬盤(pán)、光驅(qū)等。網(wǎng)絡(luò)設(shè)備通常是指通過(guò)網(wǎng)絡(luò)能夠與其他主機(jī)進(jìn)行數(shù)據(jù)通信的設(shè)備,如網(wǎng)卡等。8.1 設(shè)備驅(qū)動(dòng)編程基礎(chǔ)6 8.1.1 Linux設(shè)備驅(qū)動(dòng)概述設(shè)備驅(qū)動(dòng)程序

3、的特點(diǎn) 內(nèi)核代碼 內(nèi)核接口 內(nèi)核機(jī)制和服務(wù) 可裝載 可設(shè)置 動(dòng)態(tài)性 8.1 設(shè)備驅(qū)動(dòng)編程基礎(chǔ)7 8.1.1 Linux設(shè)備驅(qū)動(dòng)概述設(shè)備驅(qū)動(dòng)程序與整個(gè)軟硬件系統(tǒng)的關(guān)系8.1 設(shè)備驅(qū)動(dòng)編程基礎(chǔ)8 8.1.2 Linux內(nèi)核模塊編程設(shè)備驅(qū)動(dòng)和內(nèi)核模塊 Linux設(shè)備驅(qū)動(dòng)屬于內(nèi)核的一部分,Linux內(nèi)核的一個(gè)模塊可以以兩種方式被編譯和加載。直接編譯進(jìn)Linux內(nèi)核,隨同Linux啟動(dòng)時(shí)加載;編譯成一個(gè)可加載和刪除的模塊。8.1 設(shè)備驅(qū)動(dòng)編程基礎(chǔ)9 8.1.2 Linux內(nèi)核模塊編程模塊相關(guān)命令Lsmod 列出當(dāng)前系統(tǒng)中加載的模塊Rmmod 用于將當(dāng)前模塊卸載。insmod和modprobe 用于加載當(dāng)

4、前模塊 8.1 設(shè)備驅(qū)動(dòng)編程基礎(chǔ)10 8.1.2 Linux內(nèi)核模塊編程Linux內(nèi)核模塊編程(1)內(nèi)核模塊的程序結(jié)構(gòu)一個(gè)Linux內(nèi)核模塊主要由以下幾個(gè)部分組成。模塊加載函數(shù)(必須)模塊卸載函數(shù)(必須)模塊許可證聲明(必須模塊參數(shù)(可選)模塊導(dǎo)出符號(hào)(可選)模塊作者等信息聲明(可選)8.1 設(shè)備驅(qū)動(dòng)編程基礎(chǔ)11 8.1.2 Linux內(nèi)核模塊編程Linux內(nèi)核模塊編程(2)模塊加載函數(shù)static int _init initialization_function(void)/* 初始化代碼 */module_init(initialization_function);8.1 設(shè)備驅(qū)動(dòng)編程基

5、礎(chǔ)12 8.1.2 Linux內(nèi)核模塊編程Linux內(nèi)核模塊編程(3)模塊卸載函數(shù)static void _exit cleanup_function(void)/* 釋放代碼 */module_exit(cleanup_function);通常來(lái)說(shuō),模塊卸載函數(shù)要完成與模塊加載函數(shù)相反的功能若模塊加載函數(shù)注冊(cè)XXX,則模塊卸載函數(shù)應(yīng)該注銷XXX。若模塊加載函數(shù)動(dòng)態(tài)申請(qǐng)了內(nèi)存,則模塊卸載函數(shù)應(yīng)釋放該內(nèi)存。若模塊加載函數(shù)申請(qǐng)了硬件資源(中斷、DMA通道、I/O端口和I/O內(nèi)存等)的占用,則模塊卸載函數(shù)應(yīng)釋放這些硬件資源。若模塊加載函數(shù)開(kāi)啟了硬件,則卸載函數(shù)中一般要關(guān)閉硬件。8.1 設(shè)備驅(qū)動(dòng)編程基

6、礎(chǔ)13 8.1.2 Linux內(nèi)核模塊編程Linux內(nèi)核模塊編程(4)模塊參數(shù)“module_param(參數(shù)名,參數(shù)類型,參數(shù)讀/寫(xiě)權(quán)限)”為模塊定義一個(gè)參數(shù)static char *str_param = Linux Module Program;static int num_param = 4000;module_param(num_param, int, S_IRUGO);module_param(str_param, charp, S_IRUGO);8.1 設(shè)備驅(qū)動(dòng)編程基礎(chǔ)14 8.1.2 Linux內(nèi)核模塊編程Linux內(nèi)核模塊編程(5)導(dǎo)出符號(hào)EXPORT_SYMBOL(符號(hào)名)

7、;EXPORT_SYMBOL_GPL(符號(hào)名);(6)模塊聲明與描述MODULE_AUTHOR(author);MODULE_DESCRIPTION(description);MODULE_VERSION(version_string);MODULE_DEVICE_TABLE(table_info);MODULE_ALIAS(alternate_name);8.1 設(shè)備驅(qū)動(dòng)編程基礎(chǔ)15 8.1.2 Linux內(nèi)核模塊編程Linux內(nèi)核模塊編程(7)模塊的使用計(jì)數(shù)內(nèi)核中,模塊自身通過(guò)MOD_INC_USE_COUNT、MOD_DEC_USE_COUNT宏來(lái)管理自己被使用的計(jì)數(shù)。內(nèi)核提供了模塊計(jì)數(shù)

8、管理接口try_module_get(&module)和module_put (&module),從而取代內(nèi)核中的模塊使用計(jì)數(shù)管理宏。模塊的使用計(jì)數(shù)一般不必由模塊自身管理,而且模塊計(jì)數(shù)管理還考慮了SMP與PREEMPT機(jī)制的影響。int try_module_get(struct module *module);該函數(shù)用于增加模塊使用計(jì)數(shù);若返回為0,表示調(diào)用失敗,希望使用的模塊沒(méi)有被加載或正在被卸載中。void module_put(struct module *module);該函數(shù)用于減少模塊使用計(jì)數(shù)。8.1 設(shè)備驅(qū)動(dòng)編程基礎(chǔ)16 8.1.2 Linux內(nèi)核模塊編程Lin

9、ux內(nèi)核模塊編程(8)模塊編譯我們可以為HelloWorld模塊程序編寫(xiě)一個(gè)簡(jiǎn)單的Makefile,如下所示:obj-m := 并使用如下命令編譯HelloWorld模塊,如下所示:driver_study/ modules如果當(dāng)前處于模塊所在的目錄,以下命令與上述命令同等:$ make C /usr/src/linux-2.6.15.5 M=$(pwd) modules8.1 設(shè)備驅(qū)動(dòng)編程基礎(chǔ)17 8.1.2 Linux內(nèi)核模塊編程Linux內(nèi)核模塊編程(9)模塊與GPL對(duì)于自己編寫(xiě)的驅(qū)動(dòng)等內(nèi)核代碼,如果不編譯為模塊則無(wú)法繞開(kāi)GPL,編譯為模塊后企業(yè)在產(chǎn)品中使用模塊。在內(nèi)核編譯時(shí)應(yīng)該選上“E

10、nable loadable module support”,嵌入式產(chǎn)品一般不需要?jiǎng)討B(tài)卸載模塊,所以“可以卸載模塊”不用選,當(dāng)然選了也沒(méi)關(guān)系,如果有項(xiàng)目被選擇“M”,則編譯時(shí)除了make bzImage以外,也要make modules。將我們編譯的內(nèi)核模塊.ko文件放置在目標(biāo)文件系統(tǒng)的相關(guān)目錄中。產(chǎn)品的文件系統(tǒng)中應(yīng)該包含了支持新內(nèi)核的insmod、lsmod、rmmod等工具,由于嵌入式產(chǎn)品中一般不需要建立模塊間依賴關(guān)系,所以modprobe可以不要,一般也不需要卸載模塊,所以rmmod也可以不要。 在使用中用戶可使用insmod命令手動(dòng)加載模塊,如insmod 。但是一般而言,產(chǎn)品在啟動(dòng)過(guò)

11、程中應(yīng)該加載模塊,在嵌入式Linux的啟動(dòng)過(guò)程中,加載企業(yè)自己的模塊的最簡(jiǎn)單的方法是修改啟動(dòng)過(guò)程的rc腳本,增加insmod /./這樣的命令。 8.1 設(shè)備驅(qū)動(dòng)編程基礎(chǔ)18 8.1.2 Linux內(nèi)核模塊編程Linux內(nèi)核模塊編程內(nèi)核模塊示例8.1 設(shè)備驅(qū)動(dòng)編程基礎(chǔ)19 字符設(shè)備驅(qū)動(dòng)編寫(xiě)流程8.2 字符設(shè)備驅(qū)動(dòng)編程20 8.2.2 重要數(shù)據(jù)結(jié)構(gòu)file_operations struct file_operationsloff_t (*llseek) (struct file *, loff_t, int);ssize_t (*read) (struct file *filp, char *

12、buff, size_t count, loff_t *offp);ssize_t (*write) (struct file *filp, const char *buff, size_t count, loff_t *offp);int (*readdir) (struct file *, void *, filldir_t);unsigned int (*poll) (struct file *, struct poll_table_struct *);int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned

13、long);int (*mmap) (struct file *, struct vm_area_struct *);int (*open) (struct inode *, struct file *);int (*flush) (struct file *);int (*release) (struct inode *, struct file *);int (*fsync) (struct file *, struct dentry *);int (*fasync) (int, struct file *, int);int (*check_media_change) (kdev_t d

14、ev);int (*revalidate) (kdev_t dev);int (*lock) (struct file *, int, struct file_lock *);8.2 字符設(shè)備驅(qū)動(dòng)編程21 8.2.2 重要數(shù)據(jù)結(jié)構(gòu)struct inode結(jié)構(gòu)提供了關(guān)于設(shè)備文件/dev/driver(假設(shè)此設(shè)備名為driver)的信息,file結(jié)構(gòu)提供關(guān)于被打開(kāi)的文件信息,主要用于與文件系統(tǒng)對(duì)應(yīng)的設(shè)備驅(qū)動(dòng)程序使用。 struct file mode_t f_mode;/*標(biāo)識(shí)文件是否可讀或可寫(xiě),F(xiàn)MODE_READ或FMODE_WRITE*/dev_t f_rdev; /* 用于/dev/tty

15、 */off_t f_pos; /* 當(dāng)前文件位移 */unsigned short f_flags; /* 文件標(biāo)志,如O_RDONLY、O_NONBLOCK和O_SYNC */unsigned short f_count; /* 打開(kāi)的文件數(shù)目 */unsigned short f_reada;struct inode *f_inode; /*指向inode的結(jié)構(gòu)指針 */struct file_operations *f_op;/* 文件索引指針 */;8.2 字符設(shè)備驅(qū)動(dòng)編程22 設(shè)備驅(qū)動(dòng)程序主要組成設(shè)備驅(qū)動(dòng)程序主要組成1.早期版本的字符設(shè)備注冊(cè)早期版本的字符設(shè)備注冊(cè)register_

16、chrdev三三 unregister_chrdev三三 8.2 字符設(shè)備驅(qū)動(dòng)編程23 設(shè)備驅(qū)動(dòng)程序主要組成設(shè)備驅(qū)動(dòng)程序主要組成1.早期版本的字符設(shè)備注冊(cè)早期版本的字符設(shè)備注冊(cè)u(píng)nregister_chrdev三三 8.2 字符設(shè)備驅(qū)動(dòng)編程24 設(shè)備驅(qū)動(dòng)程序主要組成設(shè)備驅(qū)動(dòng)程序主要組成2.設(shè)備號(hào)相關(guān)函數(shù)獲取設(shè)備號(hào)MAJOR(dev_t dev); /*獲得主設(shè)備號(hào)*/MINOR(dev_t dev); /*獲得次設(shè)備號(hào)*/MKDEV(int major, int minor);設(shè)備注冊(cè)于注銷8.2 字符設(shè)備驅(qū)動(dòng)編程25 設(shè)備驅(qū)動(dòng)程序主要組成設(shè)備驅(qū)動(dòng)程序主要組成2.設(shè)備號(hào)相關(guān)函數(shù)獲取設(shè)備號(hào)MAJ

17、OR(dev_t dev); /*獲得主設(shè)備號(hào)*/MINOR(dev_t dev); /*獲得次設(shè)備號(hào)*/MKDEV(int major, int minor);設(shè)備注冊(cè)于注銷8.2 字符設(shè)備驅(qū)動(dòng)編程26 設(shè)備驅(qū)動(dòng)程序主要組成設(shè)備驅(qū)動(dòng)程序主要組成3.新版本設(shè)備注冊(cè)8.2 字符設(shè)備驅(qū)動(dòng)編程27 設(shè)備驅(qū)動(dòng)程序主要組成設(shè)備驅(qū)動(dòng)程序主要組成4.打開(kāi)設(shè)備int (*open) (struct inode *, struct file *);通常情況下在open函數(shù)接口中要完成如下工作:如果未初始化,則進(jìn)行初始化。識(shí)別次設(shè)備號(hào),如果必要,更新f_op指針。分配并填寫(xiě)被置于filp-private_data

18、的數(shù)據(jù)結(jié)構(gòu)。檢查設(shè)備特定的錯(cuò)誤(諸如設(shè)備未就緒或類似的硬件問(wèn)題)。8.2 字符設(shè)備驅(qū)動(dòng)編程28 設(shè)備驅(qū)動(dòng)程序主要組成設(shè)備驅(qū)動(dòng)程序主要組成5.釋放設(shè)備釋放設(shè)備釋放設(shè)備的函數(shù)接口是釋放設(shè)備的函數(shù)接口是release三。三。釋放設(shè)備時(shí)要完成的工作如下:釋放設(shè)備時(shí)要完成的工作如下:釋放打開(kāi)設(shè)備時(shí)系統(tǒng)所分配的內(nèi)存空間(包括釋放打開(kāi)設(shè)備時(shí)系統(tǒng)所分配的內(nèi)存空間(包括filp-private_data指向的內(nèi)存空間)。指向的內(nèi)存空間)。在最后一次關(guān)閉設(shè)備(使用在最后一次關(guān)閉設(shè)備(使用close三系統(tǒng)調(diào)用)時(shí)三系統(tǒng)調(diào)用)時(shí),才會(huì)真正釋放設(shè)備(執(zhí)行,才會(huì)真正釋放設(shè)備(執(zhí)行release三函數(shù))。即三函數(shù))。即在打

19、開(kāi)計(jì)數(shù)等于在打開(kāi)計(jì)數(shù)等于0時(shí)的時(shí)的close三系統(tǒng)調(diào)用才會(huì)真正三系統(tǒng)調(diào)用才會(huì)真正進(jìn)行設(shè)備的釋放操作。進(jìn)行設(shè)備的釋放操作。8.2 字符設(shè)備驅(qū)動(dòng)編程29 設(shè)備驅(qū)動(dòng)程序主要組成設(shè)備驅(qū)動(dòng)程序主要組成6.讀寫(xiě)設(shè)備讀寫(xiě)設(shè)備 read三和三和write三函數(shù)三函數(shù) 8.2 字符設(shè)備驅(qū)動(dòng)編程30 設(shè)備驅(qū)動(dòng)程序主要組成設(shè)備驅(qū)動(dòng)程序主要組成6.讀寫(xiě)設(shè)備讀寫(xiě)設(shè)備 copy_to_user三和三和copy_from_user三三 8.2 字符設(shè)備驅(qū)動(dòng)編程31 設(shè)備驅(qū)動(dòng)程序主要組成設(shè)備驅(qū)動(dòng)程序主要組成7.ioctl 大部分設(shè)備除了讀寫(xiě)操作,還需要硬件配置和控制(例如,設(shè)置串口設(shè)備的波特率)等很多其他操作。在字符設(shè)備驅(qū)動(dòng)

20、中ioctl函數(shù)接口給用戶提供對(duì)設(shè)備的非讀寫(xiě)操作機(jī)制。8.2 字符設(shè)備驅(qū)動(dòng)編程32 設(shè)備驅(qū)動(dòng)程序主要組成設(shè)備驅(qū)動(dòng)程序主要組成8.獲取內(nèi)存獲取內(nèi)存kmalloc三三/kfree三三kmalloc語(yǔ)法格式:語(yǔ)法格式:8.2 字符設(shè)備驅(qū)動(dòng)編程33 設(shè)備驅(qū)動(dòng)程序主要組成設(shè)備驅(qū)動(dòng)程序主要組成8.獲取內(nèi)存獲取內(nèi)存kmalloc三三/kfree三三kfree語(yǔ)法格式:語(yǔ)法格式:8.2 字符設(shè)備驅(qū)動(dòng)編程34 設(shè)備驅(qū)動(dòng)程序主要組成設(shè)備驅(qū)動(dòng)程序主要組成9.打印信息打印信息printk三三8.2 字符設(shè)備驅(qū)動(dòng)編程35 GPIO工作原理工作原理FS2410開(kāi)發(fā)板的S3C2410處理器具有117個(gè)多功能通用I/O(GPIO)端口管腳,包括GPIO 8個(gè)端口組,分別為GPA(23個(gè)輸出端口)、GPB(11個(gè)輸入/輸出端口)、GPC(16個(gè)輸入/輸出端口)、GPD(16個(gè)輸入/輸出端口)、GPE(16個(gè)輸入/輸出端口)、GPF(8個(gè)輸入/輸出端口)、GPH(11個(gè)輸入/輸出端口)。根據(jù)各種系統(tǒng)設(shè)計(jì)的需求,通過(guò)軟件方法可以將這些端口配置成具有相應(yīng)功能(例如:外部中斷或數(shù)據(jù)總線)的端口。8.3 GPIO驅(qū)動(dòng)程序?qū)嵗?6 GPIO工作原理工作原理LED和蜂鳴器原理圖8.3 GPIO驅(qū)動(dòng)程序?qū)嵗?7 GPIO工作原理工作原理相關(guān)寄存器8.3 GPIO驅(qū)動(dòng)程序?qū)嵗?8 工作原理G

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論