




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、嵌入式系統(tǒng)開發(fā)技術(shù)課程設(shè)計(jì)專 業(yè):計(jì)算機(jī)科學(xué)與技術(shù)(嵌入式) 設(shè)計(jì)題目: 蜂鳴器驅(qū)動(dòng)程序設(shè)計(jì) 1.緒論31.1概要31.2設(shè)計(jì)內(nèi)容42.開發(fā)環(huán)境的搭建42.1Redhat的安裝42.2安裝arm-linux-gcc交叉編譯器92.3安裝及編譯內(nèi)核93.字符設(shè)備驅(qū)動(dòng)相關(guān)知識(shí)93.1模塊機(jī)制93.2字符設(shè)備開發(fā)基本步驟103.3主設(shè)備號(hào)和次設(shè)備號(hào)113.4實(shí)現(xiàn)字符驅(qū)動(dòng)程序124.蜂鳴器原理144.1蜂鳴器的種類和工作原理144.2開發(fā)板上蜂鳴器原理圖分析154.3GPB0參數(shù)155.總體設(shè)計(jì)165.1設(shè)計(jì)思路165.2設(shè)計(jì)步驟166. 驅(qū)動(dòng)及測(cè)試程序1717217.運(yùn)行結(jié)果及截圖22綜合設(shè)計(jì)總結(jié)與
2、思考25 1.緒論1.1概要linux 驅(qū)動(dòng)在本質(zhì)上就是一種軟件程序,上層軟件可以在不用了解硬件特性的情況下,通過(guò)驅(qū)動(dòng)提供的接口,和計(jì)算機(jī)硬件進(jìn)行通信。 系統(tǒng)調(diào)用是內(nèi)核和應(yīng)用程序之間的接口,而驅(qū)動(dòng)程序是內(nèi)核和硬件之間的接口,也就是內(nèi)核和硬件之間的橋梁。它為應(yīng)用程序屏蔽了硬件的細(xì)節(jié),這樣在應(yīng)用程序看來(lái),硬件設(shè)備只是一個(gè)設(shè)備文件,應(yīng)用程序可以象操作普通文件一樣對(duì)硬件設(shè)備進(jìn)行操作。 linux 驅(qū)動(dòng)程序是內(nèi)核的一部分,管理著系統(tǒng)中的設(shè)備控制器和相應(yīng)的設(shè)備。它主要完成這么幾個(gè)功能:對(duì)設(shè)備初始化和釋放;傳送數(shù)據(jù)到硬件和從硬件讀取數(shù)據(jù);檢測(cè)和處理設(shè)備出現(xiàn)的錯(cuò)誤。 一般來(lái)說(shuō),一個(gè)驅(qū)動(dòng)可以管理一種類型的設(shè)備。
3、例如不同的 U 盤都屬于 mass storage 設(shè)備,我們不需要為每一個(gè) U 盤編寫驅(qū)動(dòng),而只需要一個(gè)驅(qū)動(dòng)就可以管理所有這些 mass storage 設(shè)備。 為方便我們加入各種驅(qū)動(dòng)來(lái)支持不同的硬件,內(nèi)核抽象出了很多層次結(jié)構(gòu),這些層次結(jié)構(gòu)是 linux 設(shè)備驅(qū)動(dòng)的上層。它們抽象出各種的驅(qū)動(dòng)接口,驅(qū)動(dòng)只需要填寫相應(yīng)的回調(diào)函數(shù),就能很容易把新的驅(qū)動(dòng)添加到內(nèi)核。 一般來(lái)說(shuō), linux 驅(qū)動(dòng)可以分為三類,就是塊設(shè)備驅(qū)動(dòng),字符設(shè)備驅(qū)動(dòng)和網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)。塊設(shè)備的讀寫都有緩存來(lái)支持,并且塊設(shè)備必須能夠隨機(jī)存取。塊設(shè)備驅(qū)動(dòng)主要用于磁盤驅(qū)動(dòng)器。 而字符設(shè)備的 I/O 操作沒(méi)有通過(guò)緩存。字符設(shè)備操作以字節(jié)為基
4、礎(chǔ),但不是說(shuō)一次只能執(zhí)行一個(gè)字節(jié)操作。例如對(duì)于字符設(shè)備我們可以通過(guò) mmap 一次進(jìn)行大量數(shù)據(jù)交換。字符設(shè)備實(shí)現(xiàn)比較簡(jiǎn)單和靈活。1.2設(shè)計(jì)內(nèi)容本次設(shè)計(jì)是簡(jiǎn)單的字符設(shè)備驅(qū)動(dòng)設(shè)計(jì),基于mini2440的蜂鳴器的驅(qū)動(dòng)設(shè)計(jì)。 2.開發(fā)環(huán)境的搭建2.1Redhat的安裝創(chuàng)建一個(gè)虛擬機(jī):點(diǎn)擊菜單欄File->New->Virtual machine。點(diǎn)擊下一步。選擇Typical選項(xiàng)。選擇Linux下的Red Hat Linux填寫虛擬機(jī)的命名和存儲(chǔ)地址。選擇磁盤大小2.2安裝arm-linux-gcc交叉編譯器 將 arm-linux-gcc-4.3.2.tgz復(fù)制到虛擬機(jī)的root目錄下解
5、壓文件:tar zxvf在bash_profile里添加路徑:gedit /.bash_profiel 路徑 /root/usrsource /.bash_profile 使更改生效2.3安裝及編譯內(nèi)核復(fù)制內(nèi)核到root目錄下解壓內(nèi)核文件 tar zxvf使內(nèi)核文件生效:cp config_mini2440_n35 .config使用make命令完成編譯 3.字符設(shè)備驅(qū)動(dòng)相關(guān)知識(shí)3.1模塊機(jī)制Linux提供了機(jī)制被稱為模塊(Module)的機(jī)制 提供了對(duì)許多模塊支持, 包括但不限于, 設(shè)備驅(qū)動(dòng)每個(gè)模塊由目標(biāo)代碼組成( 沒(méi)有連接成一個(gè)完整可執(zhí)行程序 )insmod 將模塊動(dòng)態(tài)加載到正在運(yùn)行內(nèi)核r
6、mmod 程序移除模塊Linux內(nèi)核模塊的程序結(jié)構(gòu)l static int _init beep_init(void)-模塊初始化函數(shù) 通過(guò)alloc_chrdev_region來(lái)分配設(shè)備號(hào)beep_cdev來(lái)對(duì)設(shè)備進(jìn)行各種操作。比如在加載內(nèi)核模塊時(shí),模塊的加載函數(shù)會(huì)自動(dòng)被內(nèi)核執(zhí)行,完成模塊的相關(guān)初始化工作l static void _exit beep_exit(void)-模塊卸載函數(shù)(必須) 當(dāng)通過(guò)unregister_chrdev_region命令卸載某模塊時(shí),模塊的卸載函數(shù)會(huì)自動(dòng)被內(nèi)核執(zhí)行,完成與模塊裝載函數(shù)相反的功能l MODULE_LICENSE()-模塊許可證聲明(必須)模塊許
7、可證(LICENSE)聲明描述內(nèi)核模塊的許可權(quán)限如果不聲明LICENSE,模塊被加載時(shí),將收到內(nèi)核被污染(kernel tainted)的警告l 其他一些聲明MODULE_XXXXX()-模塊聲明(可選)模塊加載函數(shù)static int _init initialization_function(void) /* 初始化代碼 */module_init(initialization_function); 模塊卸載函數(shù) static void _exit cleanup_function(void) /* 釋放資源 */ module_exit(cleanup_function); 3.2字符設(shè)
8、備開發(fā)基本步驟l 確定主設(shè)備號(hào)和次設(shè)備號(hào)l 實(shí)現(xiàn)字符驅(qū)動(dòng)程序?qū)崿F(xiàn)file_operations結(jié)構(gòu)體實(shí)現(xiàn)初始化函數(shù),注冊(cè)字符設(shè)備實(shí)現(xiàn)銷毀函數(shù),釋放字符設(shè)備l 創(chuàng)建設(shè)備文件節(jié)點(diǎn)3.3主設(shè)備號(hào)和次設(shè)備號(hào)l 主設(shè)備號(hào)是內(nèi)核識(shí)別一個(gè)設(shè)備的標(biāo)識(shí)。整數(shù)(占12bits),范圍從0到4095,通常使用1到255l 次設(shè)備號(hào)由內(nèi)核使用,用于正確確定設(shè)備文件所指的設(shè)備。整數(shù)(占20bits),范圍從0到1048575,一般使用0到255l 設(shè)備編號(hào)的內(nèi)部表達(dá)dev_t類型(32位):用來(lái)保存設(shè)備編號(hào)(包括主設(shè)備號(hào)(12位)和次設(shè)備號(hào)(20位)從dev_t獲得主設(shè)備號(hào)和次設(shè)備號(hào):MAJOR(dev_t);MINO
9、R(dev_t);將主設(shè)備號(hào)和次設(shè)備號(hào)轉(zhuǎn)換成dev_t類型:MKDEV(int major,int minor); l 分配主設(shè)備號(hào)手工分配主設(shè)備號(hào):找一個(gè)內(nèi)核沒(méi)有使用的主設(shè)備號(hào)來(lái)使用。#include <linux/fs.h>int register_chrdev_region( dev_t first, unsigned int count, char *name );l 動(dòng)態(tài)分配主設(shè)備號(hào):#include <linux/fs.h>int alloc_chrdev_resion(dev_t *dev,unsigned int firstminor,unsigned
10、int count,char *name);l 釋放設(shè)備號(hào)void unregister_chrdev_region(dev_t first, unsigned int count);3.4實(shí)現(xiàn)字符驅(qū)動(dòng)程序l cdev 結(jié)構(gòu)體struct cdev dev_t beep_devno; /*設(shè)備號(hào)*/unsigned int *map;struct file_operations *ops; /*文件操作結(jié)構(gòu)體*/ unsigned int count; ;l file_operations 結(jié)構(gòu)體字符驅(qū)動(dòng)和內(nèi)核的接口:在include/linux/fs.h定義字符驅(qū)動(dòng)只要實(shí)現(xiàn)一個(gè)file_op
11、erations結(jié)構(gòu)體并注冊(cè)到內(nèi)核中,內(nèi)核就有了操作此設(shè)備的能力。l file_operations的主要成員:open:打開設(shè)備release:關(guān)閉設(shè)備read:從設(shè)備上讀數(shù)據(jù)write:向設(shè)備上寫數(shù)據(jù)ioctl:I/O控制函數(shù)l ioctl函數(shù)為設(shè)備驅(qū)動(dòng)程序執(zhí)行“命令”提供了一個(gè)特有的入口點(diǎn)用來(lái)設(shè)置或者讀取設(shè)備的屬性信息。int ioctl (struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg);l cmd 參數(shù)的定義不推薦用0x1,0x2,0x3之類的值Linux對(duì)ioctl()的cmd參
12、數(shù)有特殊的定義構(gòu)造命令編號(hào)的宏:_IO(type,nr)用于構(gòu)造無(wú)參數(shù)的命令編號(hào);_IOR(type,nr,datatype)用于構(gòu)造從驅(qū)動(dòng)程序中讀取數(shù)據(jù)的命令編號(hào);_IOW(type,nr,datatype)用于寫入數(shù)據(jù)的命令;_IOWR(type,nr,datatype)用于雙向傳輸。type和number位字段通過(guò)參數(shù)傳入,而size位字段通過(guò)對(duì)datatype參數(shù)取sizeof獲得。 l Ioctl函數(shù)模板int xxx_ioctl( struct inode *inode, struct f ile *filp, unsigned int cmd, unsigned long arg
13、) . switch (cmd) case XXX_CMD1: . break; case XXX_CMD2: . break; default: /*不能支持的命令 */ return - ENOTTY; return 0; 3.5字符設(shè)備驅(qū)動(dòng)結(jié)構(gòu) 4.蜂鳴器原理 4.1蜂鳴器的種類和工作原理蜂鳴器主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種類型。 壓電式蜂鳴器主要由多諧振蕩器、壓電蜂鳴片、阻抗匹配器及共鳴箱、外殼等組成。有的壓電式蜂鳴器外殼上還裝有發(fā)光二極管。多諧振蕩器由晶體管或集成電路構(gòu)成。當(dāng)接通電源后(1.515V直流工作電壓),多諧振蕩器起振,輸出1.52.5kHZ
14、的音頻信號(hào),阻抗匹配器推動(dòng)壓電蜂鳴片發(fā)聲。 電磁式蜂鳴器由振蕩器、電磁線圈、磁鐵、振動(dòng)膜片及外殼等組成。接通電源后,振蕩器產(chǎn)生的音頻信號(hào)電流通過(guò)電磁線圈,使電磁線圈產(chǎn)生磁場(chǎng)。振動(dòng)膜片在電磁線圈和磁鐵的相互作用下,周期性地振動(dòng)發(fā)聲。 有源蜂鳴器和無(wú)源蜂鳴器的區(qū)別:這個(gè)“源”字是不是指電源,而是指震蕩源,即有源蜂鳴器內(nèi)有振蕩源而無(wú)源蜂鳴器內(nèi)部沒(méi)有振蕩源。有振蕩源的通電就可以發(fā)聲,沒(méi)有振蕩源的需要脈沖信號(hào)驅(qū)動(dòng)才能發(fā)聲。4.2開發(fā)板上蜂鳴器原理圖分析由原理圖可以得知,蜂鳴器是通過(guò)GPB0 IO口使用PWM信號(hào)驅(qū)動(dòng)工作的,而GPB0口是一個(gè)復(fù)用的IO口,要
15、使用它得先把他設(shè)置成TOUT0 PWM輸出模式。4.3GPB0參數(shù) 5.總體設(shè)計(jì)5.1設(shè)計(jì)思路 Linux設(shè)備驅(qū)動(dòng)屬于內(nèi)核的一部分,Linux內(nèi)核的一個(gè)模塊可以以兩種方式被編譯和加載: (1)直接編譯進(jìn)Linux內(nèi)核,隨同Linux啟動(dòng)時(shí)加載; (2)編譯成一個(gè)可加載和刪除的模塊,使用insmod加載(modprobe和insmod命令類似,但依賴于相關(guān)的配置文件),rmmod刪除。這種方式控制了內(nèi)核的大小,而模塊一旦被插入內(nèi)核,它就和內(nèi)核其他部分一樣。 這次的蜂鳴器驅(qū)動(dòng)就采用動(dòng)態(tài)模塊加載的方式5.2設(shè)計(jì)步驟Ø 編寫簡(jiǎn)單的字符設(shè)別驅(qū)動(dòng)程序框架Ø 編寫控制蜂鳴器控制開關(guān)函數(shù)&
16、#216; 編譯模塊,生成.ko Ø 編寫用戶層測(cè)試程序Ø 編譯用戶層測(cè)試程序,生成可執(zhí)行程序beep_testØ 將生成的.ko 模塊和應(yīng)用層測(cè)試程序 beep_test 下載到目標(biāo)板Ø 用 insmod 裝載模塊Ø 創(chuàng)建設(shè)備節(jié)點(diǎn) mknod /dev/beep c 253 0Ø 運(yùn)行用戶層測(cè)試程序 beep_test#./beep_test如果你的 beep_test 的屬性不是可執(zhí)行的,可以用 chmod 777 beep_test 將其設(shè)置成可執(zhí)行程序。6. 驅(qū)動(dòng)及測(cè)試程序#include<linux/cdev.h>
17、;#include<asm/io.h>#include<asm/uaccess.h>#include<linux/slab.h> #include<linux/fs.h> #include<linux/device.h>#include<linux/types.h>#include<linux/module.h>#include<linux/init.h> struct cdev beep_cdev;dev_t beep_devno;unsigned int *map;int beep_open(s
18、truct inode *node,struct file *fp)unsigned int data;request_mem_region(0xE02000A0,4,"beep");map=ioremap(0xE02000A0,8);data=ioread32(map);data=data&(0x1<<1);data=data&(0x1<<2);data=data&(0x1<<3);data=data|0x1;iowrite32(data,map);printk("beep_openn");r
19、eturn 0;void beep_start(void)unsigned int data;data=ioread32(map+0x1);data=data|0x1;iowrite32(data,map+0x1);void beep_stop(void)unsigned int data;data=ioread32(map+0x1);data&=0x1;iowrite32(data,map+0x1);int beep_close(struct inode *node,struct file *fp)return 0;ssize_t beep_read(struct file *fp,
20、char _user *buff,size_t len,loff_t *lfot)char load100="hellon"printk("beep_readn");copy_to_user(buff,load,100);return 0;ssize_t beep_write(struct file *fp,const char _user *buff,size_t len,loff_t *lfot)char load100;printk("beep_writen");copy_from_user(load,buff,100);pri
21、ntk("%sn",load);return 0;int beep_ioctl(struct inode * node, struct file *fp, unsigned int cmd , unsigned long parm)printk("beep_ioctln");switch(cmd)case 0:beep_stop();break;case 1:beep_start();break;return 0;struct file_operations fops=.open=beep_open,.release=beep_close,.read=b
22、eep_read,.write=beep_write,.ioctl=beep_ioctl;static int _init beep_init(void)int major;alloc_chrdev_region(&beep_devno,0,1,"beep");major=MAJOR(beep_devno);printk("major %dn",major);cdev_init(&beep_cdev,&fops);beep_cdev.owner=THIS_MODULE;beep_cdev.dev=beep_devno;beep_cdev.ops=&fops;beep_cdev.count=1;cdev_add(&beep_cdev,beep_devno,1);return 0;static void _exit beep_exit(void)unregister_chrdev_region(beep_devno,1);
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 淺談新媒體藝術(shù)創(chuàng)作中動(dòng)畫形象與品牌IP的設(shè)計(jì)研究
- 7月份分級(jí)護(hù)理質(zhì)控
- 市政工程基礎(chǔ)培訓(xùn)教材
- 內(nèi)科期末網(wǎng)課復(fù)習(xí)指南
- 茶樓與餐飲業(yè)聯(lián)營(yíng)合作協(xié)議范本
- 餐廳服務(wù)員提成合同范本
- 專業(yè)展覽布展設(shè)計(jì)與品牌宣傳合同
- 數(shù)字創(chuàng)意產(chǎn)業(yè)園區(qū)廠房租賃與文化創(chuàng)意合作合同
- 智能化住宅小區(qū)物業(yè)運(yùn)營(yíng)管理服務(wù)協(xié)議
- 商業(yè)綜合體場(chǎng)地承包經(jīng)營(yíng)合同規(guī)范
- 【MOOC期末】《深度學(xué)習(xí)及其應(yīng)用》(復(fù)旦大學(xué))期末考試慕課答案
- 靜電放電(ESD)及其防護(hù)措施培訓(xùn)課件
- 食品營(yíng)養(yǎng)學(xué)(暨南大學(xué))智慧樹知到期末考試答案章節(jié)答案2024年暨南大學(xué)
- GB 19522-2024車輛駕駛?cè)藛T血液、呼氣酒精含量閾值與檢驗(yàn)
- 超星爾雅學(xué)習(xí)通《心理行為與文化》章節(jié)測(cè)試含答案
- 基本藥物和國(guó)家基本藥物制度
- Photoshop二級(jí)考試試題及答案
- 裂隙燈數(shù)碼型slm說(shuō)明書
- 機(jī)械識(shí)圖基礎(chǔ)知識(shí)
- 傷口基礎(chǔ)知識(shí)和濕性愈合理論
- 完整版重點(diǎn)環(huán)節(jié)重點(diǎn)人群與高危險(xiǎn)因素管理與監(jiān)測(cè)計(jì)劃
評(píng)論
0/150
提交評(píng)論