蜂鳴器驅動程序設計_第1頁
蜂鳴器驅動程序設計_第2頁
蜂鳴器驅動程序設計_第3頁
蜂鳴器驅動程序設計_第4頁
蜂鳴器驅動程序設計_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、蜂鳴器驅動課程設計專 業(yè): xxxxxxxxxxxxxx 班 級: xxxxxxxxx 學 號: xxxxxxxxx 姓 名: xxxx 設計題目: 蜂鳴器驅動程序設計 2016年12月 目錄一.任務21.目標22.環(huán)境23.需求:2二總體設計21.處理流程22.模塊介紹33.模塊接口設計34.各個模塊設計3三.PWM蜂鳴器字符設備驅動31.模塊設計31. 模塊介紹32. 模塊結構圖42.接口設計41. 數(shù)據結構設計42. 驅動程序接口43.函數(shù)設計41.初始化函數(shù)5 2. 字符設備打開函數(shù)6 3. 字符設備關閉函數(shù)7 4. 模塊卸載函數(shù).85. 文件操作接口函數(shù)8四. PWM蜂鳴器字符設備驅

2、動測試81. 調用系統(tǒng)函數(shù)ioctl實現(xiàn)對蜂鳴器的控制85 tiny210開發(fā)板調試.96 綜合設計總結與思考.101. 任務1.目標:編寫按鍵蜂鳴器驅動程序函數(shù)與測試文件,實現(xiàn)上位機與tiny210-SDK開發(fā)板的連接,利用函數(shù)實現(xiàn)對蜂鳴器通過按鍵來啟動與關閉。2.環(huán)境:軟件環(huán)境:windows 7 系統(tǒng)和VMware Workstation 軟件硬件環(huán)境:tiny210 開發(fā)板 , 內核部分 Linux-3.0.8 , 交叉編譯版本 arm-linux-gcc-4.5.1-v6-vfp1Linux系統(tǒng)介紹: Linux是一種自由開發(fā)源碼的類Unix操作系統(tǒng),存在這許多不同的Linux版本,

3、但它們都使用了Linux內核。Linux可安裝在各種計算機硬件設備中,比如手機、平板電腦、路由器、視頻游戲控制臺、臺式計算機、大型機和超級計算機。 Linux是一個領先的操作系統(tǒng),世界上運算最快的10臺超級計算機運行的都是Linux操作系統(tǒng)。嚴格來說,Linux這個詞本身只表示Linux內核,但實際上人們已經習慣了用Linux來形容整個基于Linux內核,并且使用GNU工程各種工具和數(shù)據庫的操作系統(tǒng)。Linux得名于天才程序員林納斯·托瓦茲。 tiny210開發(fā)板中模塊介紹:PWM蜂鳴器模塊PWM(脈沖寬度調制)簡單的講是一種變頻技術之一,是靠改變脈沖寬度來控制輸出電壓,通過改變周期

4、來控制其輸出頻率。來看看我們實際生活中的例子,我們的電風扇為什么扭一下按扭,風扇的轉速就會發(fā)生變化;調一下收音機的聲音按鈕,聲音的大小就會發(fā)生變化。這些都是PWM的應用,都是通過PWM輸出的頻率信號進行控制的。蜂鳴器的種類和工作原理蜂鳴器主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種類型。   壓電式蜂鳴器主要由多諧振蕩器、壓電蜂鳴片、阻抗匹配器及共鳴箱、外殼等組成。有的壓電式蜂鳴器外殼上還裝有發(fā)光二極管。多諧振蕩器由晶體管或集成電路構成。當接通電源后(1.515V直流工作電壓),多諧振蕩器起振,輸出1.52.5kHZ的音頻信號,阻抗匹配器推動壓電蜂鳴片發(fā)聲。  

5、; 電磁式蜂鳴器由振蕩器、電磁線圈、磁鐵、振動膜片及外殼等組成。接通電源后,振蕩器產生的音頻信號電流通過電磁線圈,使電磁線圈產生磁場。振動膜片在電磁線圈和磁鐵的相互作用下,周期性地振動發(fā)聲。   有源蜂鳴器和無源蜂鳴器的區(qū)別:這個“源”字是不是指電源,而是指震蕩源,即有源蜂鳴器內有振蕩源而無源蜂鳴器內部沒有振蕩源。有振蕩源的通電就可以發(fā)聲,沒有振蕩源的需要脈沖信號驅動才能發(fā)聲。3. 需求:要實現(xiàn)PC與tiny210開發(fā)板的通信,要求在PC機上的VMware Workstation 軟件的Red Hat Enterprise Linux環(huán)境下編寫程序,包含蜂鳴器驅動程序和測試

6、文件。利用交叉編譯器arm-linux-gcc-4.5.1-v6-vfp1生成目標文件,最后講目標文件下載到開發(fā)板,并且驅動蜂鳴器根據按鍵的不同完成啟動或者停止的操作。2 總體設計1. 處理流程:2. 模塊介紹:按鍵模塊:通過按鍵來操作蜂鳴器的啟動與停止。蜂鳴器模塊:通過加載蜂鳴器驅動模塊到內核,驅動蜂鳴器。按鍵模塊:A. 正確驅動主設備號和次設備號B. 實現(xiàn)字符設備驅動程序C. 實現(xiàn)file-operation結構D. 實現(xiàn)初始化函數(shù),注冊字符設備E. 實現(xiàn)卸載函數(shù),釋放字符設備F. 創(chuàng)建文件節(jié)點按鍵模塊:G. 正確驅動住設備號和次設備號H. 實現(xiàn)字符設備驅動程序I. 實現(xiàn)file-oper

7、ation結構J. 實現(xiàn)初始化函數(shù),注冊字符設備K. 實現(xiàn)卸載函數(shù),釋放字符設備L. 創(chuàng)建文件節(jié)點模塊設計:(1)beep.c#include<linux/init.h>#include<linux/module.h>#include<linux/fs.h>#include<linux/cdev.h>#include<linux/types.h>#include<asm/io.h>#include<asm/uaccess.h>static int beep_major=0;static dev_t beep_d

8、evno;static struct cdev beep_cdev;static int *pload=NULL;#define BEEPNUM 3static int str_len(char *str)int count=0;while(*str!='0')count+;str+;return count;ssize_t beep_read (struct file *fp, char _user *buff, size_t count, loff_t *fps)char string20="HELLO,EVERYONEn"int retur=0;pri

9、ntk("%sn",_FUNCTION_);retur=copy_to_user(buff,string,str_len(string)+1);return retur;ssize_t beep_write (struct file *fp, const char _user *buff, size_t count, loff_t *fps)char string100;int retur=0;printk("%s",_FUNCTION_);retur=copy_from_user(string,buff,count);printk("kern

10、al-> %sn",string);return retur;int beep_open(struct inode *nodep,struct file *fp)unsigned int value=0;printk("%sn",_FUNCTION_);pload=ioremap(0XE02000A0,16);/convert register physical address to virtual addressvalue=ioread32(pload);value&=0x1<<3;value&=0x1<<2;val

11、ue&=0x1<<1;value|=0x1<<0;iowrite32(value,pload);return 0;int beep_release(struct inode *nodep,struct file *fp)printk("%sn",_FUNCTION_);return 0;void beep_start(void)unsigned int value=0;value=ioread32(pload+1);/read data registervalue|=0x1<<0;iowrite32(value,pload+1);

12、void beep_stop(void)unsigned int value=0;value=ioread32(pload+1);/read data registervalue&=0x1<<0;iowrite32(value,pload+1);long beep_unlocked_ioctl(struct file *fp,unsigned int cmd,unsigned long param)printk("%sn",_FUNCTION_);switch(cmd)case 0:/beep stopbeep_stop();break;case 1:/

13、beep startbeep_start();break;return 0;static struct file_operations beep_ops=.open=beep_open,.release=beep_release,.read=beep_read,.write=beep_write,.unlocked_ioctl=beep_unlocked_ioctl;static void alloc_beep_dev_num(void) if(beep_major>0) beep_devno=MKDEV(beep_major,0); register_chrdev_region(bee

14、p_devno,BEEPNUM,"beep"); else alloc_chrdev_region(&beep_devno,0,BEEPNUM,"beep"); beep_major=MAJOR(beep_devno); printk("beep_major = %dn",beep_major);static void initial_cdev(void) cdev_init(&beep_cdev,&beep_ops); beep_cdev.owner=THIS_MODULE; beep_cdev.ops=&a

15、mp;beep_ops; beep_cdev.dev=beep_devno; beep_cdev.count=BEEPNUM; cdev_add(&beep_cdev,beep_devno,BEEPNUM);/register a cdev variable to linux kernelstatic int _init beep_init(void) printk("%sn",_FUNCTION_); alloc_beep_dev_num();/get device number initial_cdev();/initial and register cdev

16、variable return 0;static void _exit beep_exit(void) printk("%sn",_FUNCTION_);unregister_chrdev_region(beep_devno,BEEPNUM);cdev_del(&beep_cdev); return ;module_init(beep_init);module_exit(beep_exit);3. PWM蜂鳴器字符設備驅動1.蜂鳴器模塊介紹及結構圖開發(fā)板上蜂鳴器原理圖分析由原理圖可以得知,蜂鳴器是通過GPD0 IO口使用PWM信號驅動工作的,而GPD0口是一個復用的

17、IO口,要使用它得先把他設置成TOUT0 PWM輸出模式。GPD0參數(shù)要讓蜂鳴器發(fā)聲,需要兩大要素:將蜂鳴器接到正確的端口并且設置為輸出口,將端口設置為高電平要使蜂鳴器發(fā)聲,就是要讓GPD0作為輸出端,同時該端口要設為高電平。也就是說GPD0設置為01為輸出,讓GPDDAT的最后一位設置為1則該端口就置成了高電平。2模塊代碼分析:2.1打開設備模塊 int beep_open(struct inode *nodep,struct file *fp)unsigned int value=0;printk("%sn",_FUNCTION_);pload=ioremap(0XE0

18、2000A0,16);/convert register physical address to virtual addressvalue=ioread32(pload);value&=0x1<<3;value&=0x1<<2;value&=0x1<<1;value|=0x1<<0;iowrite32(value,pload);return 0;此函數(shù)實現(xiàn)了怎么去打開設備,在設備文件上的第一個操作,并不要求驅動程序一定要實現(xiàn)這個方法。如果該項為NULL,設備的打開操作永遠成功。Open方法是驅動程序用來為以后的操作完成初始

19、化準備工作的。在大部分驅動程序中,open完成如下工作:初始化設備,標明次設備號。2.2關閉設備模塊int beep_release(struct inode * fnode,struct file *fs) printk("%sn",_FUNCTION_); return 0;當設備文件被關閉時調用這個操作。與open相仿,release也可以沒有,此處關閉函數(shù)為beep_release。Release方法的作用正好與open相反,它應該:關閉設備。本驅動程序要進行讀和寫。ssize_t beep_read (struct file *fp, char _user *bu

20、ff, size_t count, loff_t *fps)char string20="HELLO,EVERYONEn"int retur=0;printk("%sn",_FUNCTION_);retur=copy_to_user(buff,string,str_len(string)+1);return retur;ssize_t beep_write (struct file *fp, const char _user *buff, size_t count, loff_t *fps)char string100;int retur=0;print

21、k("%s",_FUNCTION_);retur=copy_from_user(string,buff,count);printk("kernal-> %sn",string);return retur;2.3 開啟蜂鳴器void beep_start(void)unsigned int value=0;value=ioread32(pload+1);/read data registervalue|=0x1<<0;iowrite32(value,pload+1);2.4 關閉蜂鳴器void beep_stop(void)unsigne

22、d int value=0;value=ioread32(pload+1);/read data registervalue&=0x1<<0;iowrite32(value,pload+1);恢復GPD0口為IO口輸出功能,由原理圖可知直接給低電平可讓蜂鳴器停止工作。2.5 ioctl控制模塊long beep_unlocked_ioctl(struct file *fp,unsigned int cmd,unsigned long param)printk("%sn",_FUNCTION_);switch(cmd)case 0:/beep stopbe

23、ep_stop();break;case 1:/beep startbeep_start();break;return 0;應用程序向設備發(fā)送命令,設備接受到命令并進行解析,并做相應的設置并啟動設備工作或停止工作。如果輸入的參數(shù)大于0,就讓蜂鳴器開始工作,不同的參數(shù),蜂鳴器的頻率也不一樣。2.6 重要數(shù)據結構模塊在Linux字符設備驅動程序設計中,有3種非常重要的數(shù)據結構:Struct fileStruct inodeStruct file_operations Struct File代表一個打開的文件。系統(tǒng)中每個打開的文件在內核空間都有一個關聯(lián)的 struct file。它由內核在打開文件時

24、創(chuàng)建, 在文件關閉后釋放。重要成員:loff_t * fp/*文件讀寫位置*/struct file_operations *fp Struct Inode用來記錄文件的物理上的信息。因此, 它和代表打開文件的file結構是不同的。一個文件可以對應多個file結構, 但只有一個inode 結構。 重要成員:dev_t:設備號 struct file_operations一個函數(shù)指針的集合,定義能在設備上進行的操作。結構中的成員指向驅動中的函數(shù), 這些函數(shù)實現(xiàn)一個特別的操作, 對于不支持的操作保留為NULL。static struct file_operations beep_ops= .ope

25、n = beep_open, .release =beep_release, .read = beep_read, .write = beep_write, .unlocked_ioctl =beep_unlocked_ioctl,2.7 在linux 內核中,字符設備使用 struct cdev 來描述。字符設備的注冊可分為如下3個步驟:分配cdev初始化cdev添加cdevStruct cdev的分配可使用cdev_alloc函數(shù)來完成。Struct cdev的初始化使用cdev_init函數(shù)來完成。struct cdev的注冊使用cdev_add函數(shù)來完成。2.8 設備注銷模塊stati

26、c void _exit beep_exit(void) printk("%sn",_FUNCTION_);unregister_chrdev_region(beep_devno,BEEPNUM);cdev_del(&beep_cdev); return ;此函數(shù)實現(xiàn)該混雜設備的注銷。4. 蜂鳴器驅動測試模塊和截圖1、模塊代碼:#include<stdio.h>#include<fcntl.h>#include<stdlib.h>#include<string.h>int main(void) int fp=0;int

27、 i=0;fp=open("/dev/beep",O_RDWR,0x777);if(fp<=0)printf("fail in opening beep device filen");return 0;while(i<5)ioctl(fp,1,0);sleep(1);ioctl(fp,0,0);sleep(1);i+; close(fp); return 0; 測試程序解析:該測試程序先執(zhí)行打開設備文件,往設備中寫入命令和參數(shù)來實現(xiàn)對蜂鳴器的控制。蜂鳴器的開啟與關閉間隔及蜂鳴器的頻率取決于往設備里寫的命令與參數(shù)。運行結果及截圖beep_open蜂鳴器開始工作,beep_release蜂鳴器停止工作五

溫馨提示

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

最新文檔

評論

0/150

提交評論