企業(yè)見習報告 - (arm板蜂鳴器驅(qū)動開發(fā))_第1頁
企業(yè)見習報告 - (arm板蜂鳴器驅(qū)動開發(fā))_第2頁
企業(yè)見習報告 - (arm板蜂鳴器驅(qū)動開發(fā))_第3頁
企業(yè)見習報告 - (arm板蜂鳴器驅(qū)動開發(fā))_第4頁
企業(yè)見習報告 - (arm板蜂鳴器驅(qū)動開發(fā))_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、嵌入式系統(tǒng)開發(fā)技術(shù)企業(yè)見習專 業(yè): 計算機科學與技術(shù) 班 級: 2 011級計算機軟件 學 號:姓 名:設(shè)計題目: 蜂鳴器驅(qū)動程序設(shè)計 2014年06月上海凡狄信息技術(shù)有限公司目 錄1.緒論11.1概要11.2設(shè)計內(nèi)容12.開發(fā)環(huán)境的搭建22.1Redhat的安裝22.2安裝arm-linux-gcc交叉編譯器42.3安裝及編譯linux-2.6.35.7-Tiny210-20120301內(nèi)核63.字符設(shè)備驅(qū)動相關(guān)知識83.1模塊機制83.2字符設(shè)備開發(fā)基本步驟93.3主設(shè)備號和次設(shè)備號103.4實現(xiàn)字符驅(qū)動程序114.蜂鳴器原理134.1蜂鳴器的種類和工作原理134.2開發(fā)板上蜂鳴器原理圖分

2、析135.總體設(shè)計145.1設(shè)計思路145.2設(shè)計步驟146. 驅(qū)動及測試程序166.1buzzer驅(qū)動代碼166.2buzzer驅(qū)動 測試代碼187.運行結(jié)果及截圖208、Tiny210開發(fā)板調(diào)試22綜合設(shè)計總結(jié)與思考23 1.緒論1.1概要 Linux是一套免費使用和自由傳播的類 Unix操作系統(tǒng),它主要用于基于 Intel x86系列 CPU的計算機上。Linux以它的高效性和靈活性著稱。它能夠在 PC計算機上實現(xiàn)全部的 Unix特性,具有多任務(wù)、多用戶的能力。 Linux是在 GNU公共許可權(quán)限下免費獲得的,是一個符合 POSIX標準的操作系統(tǒng)。 Linux操作系統(tǒng)軟件包不僅包括完整的

3、 Linux操作系統(tǒng),而且還包括了文本編輯器、高級語言編譯器等應(yīng)用軟件。它還包括帶有多個窗口管理器的 X-Windows圖形用戶界面,如同我們使用 Windows NT一樣,允許我們使用窗口、圖標和菜單對系統(tǒng)進行操作。 而linux驅(qū)動是直接和硬件打交道的軟件程序。層次結(jié)構(gòu)上,它處于操作系統(tǒng)和硬件之間。系統(tǒng)調(diào)用是操作系統(tǒng)內(nèi)核與應(yīng)用程序之間的接口,設(shè)備驅(qū)動程序是操作系統(tǒng)內(nèi)核與機器硬件之間的接口。設(shè)備驅(qū)動程序為應(yīng)用程序屏蔽了硬件的細節(jié),這樣在應(yīng)用程序看來,硬件設(shè)備只是一個設(shè)備文件,應(yīng)用程序可以像操作普通文件一樣對硬件折本進行操作。設(shè)備驅(qū)動程序是內(nèi)核的一部分,它主要完成這么幾個功能:對設(shè)備初始化和釋

4、放;傳送數(shù)據(jù)到硬件和從硬件讀取數(shù)據(jù);檢測和處理設(shè)備出現(xiàn)的錯誤。 一般來說, linux 驅(qū)動可以分為三類,就是塊設(shè)備驅(qū)動,字符設(shè)備驅(qū)動和網(wǎng)絡(luò)設(shè)備驅(qū)動。塊設(shè)備的讀寫都有緩存來支持,并且塊設(shè)備必須能夠隨機存取。塊設(shè)備驅(qū)動主要用于磁盤驅(qū)動器。 1.2設(shè)計內(nèi)容本次設(shè)計是簡單的字符設(shè)備驅(qū)動設(shè)計,基于Tiny 210的蜂鳴器的驅(qū)動設(shè)計。2.開發(fā)環(huán)境的搭建2.1Redhat的安裝使用VirtualBox創(chuàng)建一個虛擬機:點擊菜單欄File->New->Virtual machine。填寫虛擬機名稱,選擇系統(tǒng)類型和版本,然后點擊下一步。配置虛擬機內(nèi)存為1024M,然后點擊下一步創(chuàng)建虛擬硬盤,下一步。

5、配置完成后的虛擬機配置242.2安裝arm-linux-gcc交叉編譯器1、下載文件:安裝包:arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz2、開始安裝 ,打開終端輸入cd,進入home目錄后,輸入命令: tar xvzf arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz如圖:2.解壓完成后在終端中輸入cd ./opt/FriendlyARM/toolschain/4.5.1/bin/,然后pwd查看當前路徑;3.修改環(huán)境變量,把交叉編譯器的路徑加入到PATH:利用tab鍵的補齊功能進入該路徑。輸入pwd命令,查看當前路徑的絕對路徑

6、/home/cf/ARM/opt/FriendlyARM/toolschain/4.5.1/bin如圖:然后輸入如下命令: vi /.bash_profile 修改下列PATHPATH=$PATH:$HOME/bin:/sbin:/opt/FriendlyARM/toolschain/4.5.1/bin然后輸入如下命令,更新環(huán)境變量source /.bash_profile4、檢查是否將路徑加入到PATH:接下來利用命令 echo $PATH 查看環(huán)境變量是否添加成功,若環(huán)境變量中出現(xiàn)了剛才添加的路徑就成功了。 5、測試是否安裝成功$ arm-linux-gcc -v 輸入命令會顯示arm-l

7、inux-gcc信息和版本.2.3安裝及編譯linux-2.6.35.7-Tiny210-20120301內(nèi)核復制內(nèi)核到root目錄下解壓內(nèi)核文件 tar zxvf linux-2.6.35.7-Tiny210-20120301.tgz使內(nèi)核文件生效:cp config_Tiny210_n35 .config使用make命令完成編譯解壓內(nèi)核文件 tar zxvf linux-2.6.35.7-20120301.tgz 使內(nèi)核文件生效:cp mini210-tvp5150_linux_defconfig .config并且使用make命令完成編譯編輯Makefile文件3.字符設(shè)備驅(qū)動相關(guān)知識3

8、.1模塊機制Linux提供了機制被稱為模塊(Module)的機制 提供了對許多模塊支持, 包括但不限于, 設(shè)備驅(qū)動每個模塊由目標代碼組成( 沒有連接成一個完整可執(zhí)行程序 )insmod 將模塊動態(tài)加載到正在運行內(nèi)核rmmod 程序移除模塊Linux內(nèi)核模塊的程序結(jié)構(gòu)l module_init()-模塊加載函數(shù)(必須) 通過insmod或modprobe命令加載內(nèi)核模塊時,模塊的加載函數(shù)會自動被內(nèi)核執(zhí)行,完成模塊的相關(guān)初始化工作l module_exit()-模塊卸載函數(shù)(必須) 當通過rmmod命令卸載某模塊時,模塊的卸載函數(shù)會自動被內(nèi)核執(zhí)行,完成與模塊裝載函數(shù)相反的功能l MODULE_LI

9、CENSE()-模塊許可證聲明(必須)模塊許可證(LICENSE)聲明描述內(nèi)核模塊的許可權(quán)限如果不聲明LICENSE,模塊被加載時,將收到內(nèi)核被污染(kernel tainted)的警告l module_param()-模塊參數(shù)(可選)模塊參數(shù)是模塊被加載的時候可以被傳遞給它的值,它本身對應(yīng)模塊內(nèi)部的全局變量。l EXPORT_SYMBOL()-模塊導出符號(可選)內(nèi)核模塊可以導出符號(symbol,對應(yīng)于函數(shù)或變量)到內(nèi)核其他模塊可以使用本模塊中的變量或函數(shù)l 其他一些聲明MODULE_XXXXX()-模塊聲明(可選)模塊加載函數(shù)static int _init initialization

10、_function(void) /* 初始化代碼 */module_init(initialization_function); 模塊卸載函數(shù) static void _exit cleanup_function(void) /* 釋放資源 */ module_exit(cleanup_function); 3.2字符設(shè)備開發(fā)基本步驟l 確定主設(shè)備號和次設(shè)備號l 實現(xiàn)字符驅(qū)動程序?qū)崿F(xiàn)file_operations結(jié)構(gòu)體實現(xiàn)初始化函數(shù),注冊字符設(shè)備實現(xiàn)銷毀函數(shù),釋放字符設(shè)備l 創(chuàng)建設(shè)備文件節(jié)點3.3主設(shè)備號和次設(shè)備號l 主設(shè)備號是內(nèi)核識別一個設(shè)備的標識。整數(shù)(占12bits),范圍從0到4095

11、,通常使用1到255l 次設(shè)備號由內(nèi)核使用,用于正確確定設(shè)備文件所指的設(shè)備。整數(shù)(占20bits),范圍從0到1048575,一般使用0到255l 設(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); l 分配主設(shè)備號手工分配主設(shè)備號:找一個內(nèi)核沒有使用的主設(shè)備號來使用。#include <linux/fs.h>int register_chrdev

12、_region( dev_t first, unsigned int count, char *name );l 動態(tài)分配主設(shè)備號:#include <linux/fs.h>int alloc_chrdev_resion(dev_t *dev,unsigned int firstminor,unsigned int count,char *name);l 釋放設(shè)備號void unregister_chrdev_region(dev_t first, unsigned int count);3.4實現(xiàn)字符驅(qū)動程序l cdev 結(jié)構(gòu)體struct cdev struct kobject

13、 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; ;l 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è)備的能力。l file_operations的主要成員:struct modul

14、e *owner: 指向模塊自身open:打開設(shè)備release:關(guān)閉設(shè)備read:從設(shè)備上讀數(shù)據(jù)write:向設(shè)備上寫數(shù)據(jù)ioctl:I/O控制函數(shù)llseek:定位讀寫指針mmap:映射設(shè)備空間到進程的地址空間l ioctl函數(shù)為設(shè)備驅(qū)動程序執(zhí)行“命令”提供了一個特有的入口點用來設(shè)置或者讀取設(shè)備的屬性信息。int ioctl (struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg);l cmd 參數(shù)的定義不推薦用0x1,0x2,0x3之類的值Linux對ioctl()的cmd參數(shù)有特殊的定義構(gòu)

15、造命令編號的宏:_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獲得。 l Ioctl函數(shù)模板int xxx_ioctl( struct inode *inode, struct f ile *filp, unsigned int cmd, unsigned long arg) . swit

16、ch (cmd) case XXX_CMD1: . break; case XXX_CMD2: . break; default: /*不能支持的命令 */ return - ENOTTY; return 0; 4.蜂鳴器原理4.1蜂鳴器的種類和工作原理蜂鳴器主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種類型。   壓電式蜂鳴器主要由多諧振蕩器、壓電蜂鳴片、阻抗匹配器及共鳴箱、外殼等組成。有的壓電式蜂鳴器外殼上還裝有發(fā)光二極管。多諧振蕩器由晶體管或集成電路構(gòu)成。當接通電源后(1.515V直流工作電壓),多諧振蕩器起振,輸出1.52.5kHZ的音頻信號,阻抗匹配器推動壓電蜂鳴片發(fā)聲。

17、   電磁式蜂鳴器由振蕩器、電磁線圈、磁鐵、振動膜片及外殼等組成。接通電源后,振蕩器產(chǎn)生的音頻信號電流通過電磁線圈,使電磁線圈產(chǎn)生磁場。振動膜片在電磁線圈和磁鐵的相互作用下,周期性地振動發(fā)聲。   有源蜂鳴器和無源蜂鳴器的區(qū)別:這個“源”字是不是指電源,而是指震蕩源,即有源蜂鳴器內(nèi)有振蕩源而無源蜂鳴器內(nèi)部沒有振蕩源。有振蕩源的通電就可以發(fā)聲,沒有振蕩源的需要脈沖信號驅(qū)動才能發(fā)聲。4.2開發(fā)板上蜂鳴器原理圖分析由原理圖可以得知,蜂鳴器是通過GPD0 IO口使用PWM信號驅(qū)動工作的,而GPD0口是一個復用的IO口,要使用它得先把他設(shè)置成TOUT0 PWM輸出

18、模式。5.總體設(shè)計5.1設(shè)計思路 Linux設(shè)備驅(qū)動屬于內(nèi)核的一部分,Linux內(nèi)核的一個模塊可以以兩種方式被編譯和加載: (1)直接編譯進Linux內(nèi)核,隨同Linux啟動時加載; (2)編譯成一個可加載和刪除的模塊,使用insmod加載(modprobe和insmod命令類似,但依賴于相關(guān)的配置文件),rmmod刪除。這種方式控制了內(nèi)核的大小,而模塊一旦被插入內(nèi)核,它就和內(nèi)核其他部分一樣。 這次的蜂鳴器驅(qū)動就采用動態(tài)模塊加載的方式5.2設(shè)計步驟Ø 編寫簡單的字符設(shè)別驅(qū)動程序框架Ø 編寫控制蜂鳴器控制開關(guān)函數(shù)Ø 編譯模塊,生成beep.koØ 編寫用戶

19、層測試程序Ø 編譯用戶層測試程序,生成可執(zhí)行程序testØ 將生成的beep.ko 模塊和應(yīng)用層測試程序 test 下載到目標板Ø 用 insmod 裝載模塊Ø 創(chuàng)建設(shè)備節(jié)點 mknod /dev/beep c 250 0Ø 運行用戶層測試程序 test#./test如果你的 test 的屬性不是可執(zhí)行的,可以用 chmod 777 test 將其設(shè)置成可執(zhí)行程序。6. 驅(qū)動及測試程序6.1蜂鳴器驅(qū)動代碼#include<linux/module.h>#include<linux/fs.h>/include file_o

20、perations#include<linux/cdev.h>#include<linux/device.h>#include<linux/types.h>#include<linux/init.h>#include<asm/io.h>/include ioread32,iowrite32;dev_t geek_num;struct cdev geek_cdev;/字符設(shè)備結(jié)構(gòu)體/struct file_operations geek_ops;/unsigned int *address;/address for GPD_CONvoi

21、d beep_start(void)unsigned int data;address = ioremap(0xE02000A0,8);data = ioread32(address+1);data |= 0x1<<0;/bit0 set 1;iowrite32(data,address+1);void beep_stop(void)unsigned int data;address = ioremap(0xE02000A0,8);data = ioread32(address+1);data &= 0x1<<0;/bit0 set 0;iowrite32(da

22、ta,address+1);static int geek_open(struct inode *node,struct file *fp)unsigned int data ;/initate address = ioremap(0xE02000A0,8);data = ioread32(address);data &=0x1<<3;/bit3 set 0;data &=0x1<<2;/bit2 set 0;data &=0x1<<1;/bit1 set 0;data |=0x1<<0;/bit0 set 1;iowri

23、te32(data,address);printk("tgeek_openn");return 0;static int geek_release(struct inode *node,struct file *fp)printk("tgeek_releasen");return 0;static int geek_read(struct file *fp,char _user *buf,size_t count,loff_t *ppos)printk("tgeek_readn");return 0;static int geek_w

24、rite(struct file *fp,const char _user *buf,size_t count,loff_t *ppos)printk("tgeek_writen");return 0;static int geek_ioctl(struct inode *node,struct file *fp,unsigned int cmd,unsigned long ll )printk("tgeek_ioctln");switch(cmd)case 0:beep_stop();printk("beep_stop");brea

25、k;case 1:beep_start();printk("beep_start");break;default:printk("command not found!n");break;return 0;struct file_operations geek_ops =/文件描述符,.owner = THIS_MODULE,/.open = geek_open,.read = geek_read,.write = geek_write,.ioctl = geek_ioctl,.release=geek_release, ;static int _init

26、 beep_init(void)/初始化int major; /主設(shè)備號alloc_chrdev_region(&geek_num,0,1,"geek_beep");/ 設(shè)備號,次設(shè)備號,分支數(shù),設(shè)備名稱major = MAJOR(geek_num);printk("major:%d",major);cdev_init(&geek_cdev,&geek_ops);geek_cdev.ops = &geek_ops;/指向file_operationsgeek_cdev.owner = THIS_MODULE;cdev_ad

27、d(&geek_cdev,geek_num,1);/注冊設(shè)備return 0;static void _exit beep_exit(void)unregister_chrdev_region(geek_num,1);/cdev_del(&geek_cdev);/刪除module_init(beep_init);/加載module_exit(beep_exit);/卸載6.2蜂鳴器驅(qū)動 測試代碼#include<stdio.h>#include<fcntl.h>int main()unsigned n=1;int fp;fp = open("/

28、dev/beep",O_RDWR);if(fp < 0)printf("Cant open the Dev!");return -1; read(fp,NULL,0);write(fp,NULL,0);printf("input time you want to beep:");scanf("%d",&n);while(n-)ioctl(fp,1,0);sleep(1);ioctl(fp,0,0);sleep(1);close(fp);return 0;7.運行結(jié)果及截圖傳輸beep.ko,test測試程序,然

29、后使用ls命令查看文件。使用insmod beep.ko加載beep驅(qū)動,mknod /dev/beep c 250 0創(chuàng)建設(shè)備結(jié)點。最后使用./test命令運行測試程序8.Tiny210開發(fā)板調(diào)試(1)連接開發(fā)板電源。(2)用串口將PC和Tiny210開發(fā)板相連。(3)打開secureCRT軟件,點擊快速連接,配置端口協(xié)議:Serial 端口:com 6(看自己的端口號) 波特率:115200 數(shù)據(jù)位:8奇偶校驗:none停止位:1勾掉RTS/CTS選項(4)點擊連接(5)打開開發(fā)板電源(6)secureCRT軟件會出現(xiàn)一些選項,選擇b,root system(7)輸入指令rz,將beep.

30、ko加載到根文件系統(tǒng)里,再輸入指令,將buzzer測試程序加載到根文件系統(tǒng)。(8)在secureCRT里輸入insmod beep.ko,將驅(qū)動程序加載到內(nèi)核模塊中。(9)在secureCRT里輸入chmod 777 test,改變可執(zhí)行程序的權(quán)限。(10)在secureCRT里輸入./test。綜合設(shè)計總結(jié)與思考為期一周的企業(yè)見習即將結(jié)束,在大三快要結(jié)束時學校給我們安排了這次企業(yè)見習非常有用。一方面是對我們這學期所開設(shè)的嵌入式linux應(yīng)用開發(fā)的一次鞏固,另一方面也讓我們深入了解了嵌入式linux開發(fā),讓我們有機會動手親自體驗linux開發(fā),為以后的實際工作奠定了良好的基礎(chǔ)。同時也讓我們知道了,linux開發(fā)并不是一件簡單的事,并不是一門單純的學科,需要綜合領(lǐng)悟并貫通知識的能力,而且想精通linux開發(fā)并不是一朝一夕的事,需要極大的耐心與不懈的努力

溫馨提示

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

評論

0/150

提交評論