版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、蚌埠學院嵌入式系統(tǒng)開發(fā)技術課程設計專 業(yè):電子信息科學與技術(嵌入式)班 級: 電子信息2班 學 號: 00000000000 姓 名: 設計題目: 蜂鳴器驅動程序設計 2014年9月目錄1.緒論31.1概要31.2設計內容42.開發(fā)環(huán)境的搭建42.1redhat的安裝42.2安裝arm-linux-gcc交叉編譯器92.3安裝及編譯linux-2.6.29-mini2440-20090708內核93.字符設備驅動相關知識93.1模塊機制93.2字符設備開發(fā)基本步驟103.3主設備號和次設備號113.4實現(xiàn)字符驅動程序124.蜂鳴器原理144.1蜂鳴器的種類和工作原理144.2開發(fā)板上蜂鳴器原
2、理圖分析154.3gpb0-0參數(shù)155.總體設計165.1設計思路165.2設計步驟166. 驅動及測試程序176.1beep.c176.2beep_tset.c217.運行結果及截圖22綜合設計總結與思考25 1.緒論1.1概要linux 驅動在本質上就是一種軟件程序,上層軟件可以在不用了解硬件特性的情況下,通過驅動提供的接口,和計算機硬件進行通信。 系統(tǒng)調用是內核和應用程序之間的接口,而驅動程序是內核和硬件之間的接口,也就是內核和硬件之間的橋梁。它為應用程序屏蔽了硬件的細節(jié),這樣在應用程序看來,硬件設備只是一個設備文件,應用程序可以象操作普通文件一樣對硬件設備進行操作。 linux 驅動
3、程序是內核的一部分,管理著系統(tǒng)中的設備控制器和相應的設備。它主要完成這么幾個功能:對設備初始化和釋放;傳送數(shù)據(jù)到硬件和從硬件讀取數(shù)據(jù);檢測和處理設備出現(xiàn)的錯誤。 一般來說,一個驅動可以管理一種類型的設備。例如不同的 u 盤都屬于 mass storage 設備,我們不需要為每一個 u 盤編寫驅動,而只需要一個驅動就可以管理所有這些 mass storage 設備。 為方便我們加入各種驅動來支持不同的硬件,內核抽象出了很多層次結構,這些層次結構是 linux 設備驅動的上層。它們抽象出各種的驅動接口,驅動只需要填寫相應的回調函數(shù),就能很容易把新的驅動添加到內核。 一般來說, linux 驅動可以
4、分為三類,就是塊設備驅動,字符設備驅動和網(wǎng)絡設備驅動。塊設備的讀寫都有緩存來支持,并且塊設備必須能夠隨機存取。塊設備驅動主要用于磁盤驅動器。 而字符設備的 i/o 操作沒有通過緩存。字符設備操作以字節(jié)為基礎,但不是說一次只能執(zhí)行一個字節(jié)操作。例如對于字符設備我們可以通過 mmap 一次進行大量數(shù)據(jù)交換。字符設備實現(xiàn)比較簡單和靈活。1.2設計內容本次設計是簡單的字符設備驅動設計,基于mini2440的蜂鳴器的驅動設計。 2.開發(fā)環(huán)境的搭建2.1redhat的安裝創(chuàng)建一個虛擬機:點擊菜單欄file-new-virtual machine。點擊下一步。選擇typical選項。選擇linux下的red
5、 hat linux填寫虛擬機的命名和存儲地址。選擇磁盤大小2.2安裝arm-linux-gcc交叉編譯器 將 arm-linux-gcc-4.5.1.tgz復制到虛擬機的root目錄下解壓文件:tar zxvf arm-linux-gcc-4.5.1.tgz在bash_profile里添加路徑:gedit /.bash_profiel 路徑 /root/usr/local/arm/4.5.1/binsource /.bash_profile 使更改生效2.3安裝及編譯linux-2.6.29-mini2440-20090708內核復制內核到root目錄下解壓內核文件 tar zxvf lin
6、ux-2.6.29-mini2440-20090708.tgz使內核文件生效:cp config_mini2440_n35 .config使用make命令完成編譯 3.字符設備驅動相關知識3.1模塊機制linux提供了機制被稱為模塊(module)的機制 提供了對許多模塊支持, 包括但不限于, 設備驅動每個模塊由目標代碼組成( 沒有連接成一個完整可執(zhí)行程序 )insmod 將模塊動態(tài)加載到正在運行內核rmmod 程序移除模塊linux內核模塊的程序結構l module_init()-模塊加載函數(shù)(必須) 通過insmod或modprobe命令加載內核模塊時,模塊的加載函數(shù)會自動被內核執(zhí)行,完成
7、模塊的相關初始化工作l module_exit()-模塊卸載函數(shù)(必須) 當通過rmmod命令卸載某模塊時,模塊的卸載函數(shù)會自動被內核執(zhí)行,完成與模塊裝載函數(shù)相反的功能l module_license()-模塊許可證聲明(必須)模塊許可證(license)聲明描述內核模塊的許可權限如果不聲明license,模塊被加載時,將收到內核被污染(kernel tainted)的警告l module_param()-模塊參數(shù)(可選)模塊參數(shù)是模塊被加載的時候可以被傳遞給它的值,它本身對應模塊內部的全局變量。l export_symbol()-模塊導出符號(可選)內核模塊可以導出符號(symbol,對應于
8、函數(shù)或變量)到內核其他模塊可以使用本模塊中的變量或函數(shù)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字符設備開發(fā)基本步驟l 確定主設備號和次設備號l 實現(xiàn)字符驅動程序實現(xiàn)file_operati
9、ons結構體實現(xiàn)初始化函數(shù),注冊字符設備實現(xiàn)銷毀函數(shù),釋放字符設備l 創(chuàng)建設備文件節(jié)點3.3主設備號和次設備號l 主設備號是內核識別一個設備的標識。整數(shù)(占12bits),范圍從0到4095,通常使用1到255l 次設備號由內核使用,用于正確確定設備文件所指的設備。整數(shù)(占20bits),范圍從0到1048575,一般使用0到255l 設備編號的內部表達dev_t類型(32位):用來保存設備編號(包括主設備號(12位)和次設備號(20位)從dev_t獲得主設備號和次設備號:major(dev_t);minor(dev_t);將主設備號和次設備號轉換成dev_t類型:mkdev(int majo
10、r,int minor); l 分配主設備號手工分配主設備號:找一個內核沒有使用的主設備號來使用。#include int register_chrdev_region( dev_t first, unsigned int count, char *name );l 動態(tài)分配主設備號:#include int alloc_chrdev_resion(dev_t *dev,unsigned int firstminor,unsigned int count,char *name);l 釋放設備號void unregister_chrdev_region(dev_t first, unsigned
11、 int count);3.4實現(xiàn)字符驅動程序l cdev 結構體struct cdev struct kobject kobj; /* 內嵌的kobject 對象 */ struct module *owner; /*所屬模塊*/ struct file_operations *ops; /*文件操作結構體*/ struct list_head list; dev_t dev; /*設備號*/ unsigned int count; ;l file_operations 結構體字符驅動和內核的接口:在include/linux/fs.h定義字符驅動只要實現(xiàn)一個file_operations結
12、構體并注冊到內核中,內核就有了操作此設備的能力。l file_operations的主要成員:struct module *owner: 指向模塊自身open:打開設備release:關閉設備read:從設備上讀數(shù)據(jù)write:向設備上寫數(shù)據(jù)ioctl:i/o控制函數(shù)llseek:定位讀寫指針mmap:映射設備空間到進程的地址空間l ioctl函數(shù)為設備驅動程序執(zhí)行“命令”提供了一個特有的入口點用來設置或者讀取設備的屬性信息。int ioctl (struct inode *inode, struct file *filp, unsigned int cmd, unsigned long ar
13、g);l cmd 參數(shù)的定義不推薦用0x1,0x2,0x3之類的值linux對ioctl()的cmd參數(shù)有特殊的定義構造命令編號的宏:_io(type,nr)用于構造無參數(shù)的命令編號;_ior(type,nr,datatype)用于構造從驅動程序中讀取數(shù)據(jù)的命令編號;_iow(type,nr,datatype)用于寫入數(shù)據(jù)的命令;_iowr(type,nr,datatype)用于雙向傳輸。type和number位字段通過參數(shù)傳入,而size位字段通過對datatype參數(shù)取sizeof獲得。 l ioctl函數(shù)模板int xxx_ioctl( struct inode *inode, stru
14、ct f ile *filp, unsigned int cmd, unsigned long arg) . switch (cmd) case xxx_cmd1: . break; case xxx_cmd2: . break; default: /*不能支持的命令 */ return - enotty; return 0; 3.5字符設備驅動結構 4.蜂鳴器原理 4.1蜂鳴器的種類和工作原理蜂鳴器主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種類型。 壓電式蜂鳴器主要由多諧振蕩器、壓電蜂鳴片、阻抗匹配器及共鳴箱、外殼等組成。有的壓電式蜂鳴器外殼上還裝有發(fā)光二極管。多諧振蕩器由晶體管或集成電路構成。當
15、接通電源后(1.515v直流工作電壓),多諧振蕩器起振,輸出1.52.5khz的音頻信號,阻抗匹配器推動壓電蜂鳴片發(fā)聲。 電磁式蜂鳴器由振蕩器、電磁線圈、磁鐵、振動膜片及外殼等組成。接通電源后,振蕩器產生的音頻信號電流通過電磁線圈,使電磁線圈產生磁場。振動膜片在電磁線圈和磁鐵的相互作用下,周期性地振動發(fā)聲。 有源蜂鳴器和無源蜂鳴器的區(qū)別:這個“源”字是不是指電源,而是指震蕩源,即有源蜂鳴器內有振蕩源而無源蜂鳴器內部沒有振蕩源。有振蕩源的通電就可以發(fā)聲,沒有振蕩源的需要脈沖信號驅動才能發(fā)聲。4.2開發(fā)板上蜂鳴器原理圖分析由原理圖可以得知,蜂鳴器是通過gpb0 io口使用pwm信號驅動工作的,而g
16、pb0口是一個復用的io口,要使用它得先把他設置成tout0 pwm輸出模式。4.3gpb0參數(shù) 5.總體設計5.1設計思路 linux設備驅動屬于內核的一部分,linux內核的一個模塊可以以兩種方式被編譯和加載: (1)直接編譯進linux內核,隨同linux啟動時加載; (2)編譯成一個可加載和刪除的模塊,使用insmod加載(modprobe和insmod命令類似,但依賴于相關的配置文件),rmmod刪除。這種方式控制了內核的大小,而模塊一旦被插入內核,它就和內核其他部分一樣。 這次的蜂鳴器驅動就采用動態(tài)模塊加載的方式5.2設計步驟 編寫簡單的字符設別驅動程序框架 編寫控制蜂鳴器控制開關
17、函數(shù) 編譯模塊,生成.ko 編寫用戶層測試程序 編譯用戶層測試程序,生成可執(zhí)行程序beep_test 將生成的.ko 模塊和應用層測試程序 beep_test 下載到目標板 用 insmod 裝載模塊 創(chuàng)建設備節(jié)點 mknod /dev/beep c 253 0 運行用戶層測試程序 beep_test#./beep_test如果你的 beep_test 的屬性不是可執(zhí)行的,可以用 chmod 777 beep_test 將其設置成可執(zhí)行程序。6. 驅動及測試程序6.1beep.c#include#include#include#include#include#include#include#i
18、nclude#include#include#include#include#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define beep_major 201#define beep_st
19、art_cmd 0x0#define beep_stop_cmd 0x1static int beep_major=beep_major;static struct cdev beepdevs;static int beep_open(struct inode *inode,struct file *filp)return 0;static int beep_relesae(struct inode *inode,struct file *filp)return 0;static void beep_stop(void)s3c2410_gpio_cfgpin(s3c2410_gpb(0),s3
20、c2410_gpio_output);s3c2410_gpio_setpin(s3c2410_gpb(0),0);printk(stopn);static void beep_start(void)s3c2410_gpio_cfgpin(s3c2410_gpb(0),s3c2410_gpio_output);s3c2410_gpio_setpin(s3c2410_gpb(0),1);printk(startn);static int beep_ioctl(struct inode *inode,struct file *filp,unsigned int cmd,unsigned long a
21、rg)switch(cmd)case beep_start_cmd:printk(beep_stratn);beep_start();break;case beep_stop_cmd:printk(beep_stopn);beep_stop();break;default:printk(defaultn);break;return 0;static struct file_operations beep_remap_ops=.owner = this_module,.open =beep_open,.release = beep_relesae,.ioctl = beep_ioctl,;sta
22、tic void beep_setup_cdev(struct cdev *dev, int minor,struct file_operations *fops)int err,devno = mkdev(beep_major,minor);cdev_init(dev,fops);dev-owner = this_module;dev-ops = fops;err = cdev_add(dev,devno,1);if(err)printk(error %d adding beep %d n,err,minor);static int _init beep_init(void)int resu
23、lt;dev_t dev=mkdev(beep_major,0);if(beep_major)result= register_chrdev_region(dev,1,beep);elseresult=alloc_chrdev_region(&dev,0,1,beep);beep_major=major(dev);if(result0)printk(beep: unable to get major %d n,beep_major);return result;if(beep_major=0)beep_major=result;beep_setup_cdev(&beepdevs,0,&beep_remap_ops);printk(beep devices installed,with major %d,beep_major);return 0;static void _exit beep_exit()cdev_del(&beepdevs);unregister_chrdev_region(mkdev(beep_major,0),1);printk(beep device uninstalledn);module_author(xdq);module_license(gpl);module_init(beep_init);module_exit(beep_
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 今冬明春安全生產
- 醫(yī)療器械公司屋頂搭建施工合同
- 礦泉水廠施工合同文本
- 電商客服人員聘用合同書
- 物流行業(yè)稅務籌劃
- 健身教練操作工招聘協(xié)議
- 橋梁擴建電纜頂管施工合同
- 學校體育館鋼結構樓梯施工合同
- 保齡球器材租賃合同模板
- 水上婚禮婚禮樂隊游艇租賃合同
- 統(tǒng)編版(2024)七年級上冊語文:第四單元 閱讀綜合實踐 課件
- GB/T 43988-2024滑板課程學生運動能力測評規(guī)范
- 智能云服務交付工程師認證考試題庫(網(wǎng)大版)(濃縮500題)
- 四種形態(tài)課件
- DL-T5054-2016火力發(fā)電廠汽水管道設計規(guī)范
- 交響音樂賞析智慧樹知到期末考試答案章節(jié)答案2024年西安交通大學
- 國有企業(yè)學習解讀2024年新《公司法》課件
- 中國戲曲劇種鑒賞 知到智慧樹網(wǎng)課答案
- 寵物器械使用制度
- JTG-D82-2009公路交通標志和標線設置規(guī)范
- 獸醫(yī)產科學 知到智慧樹網(wǎng)課答案
評論
0/150
提交評論