蜂鸣器驱动程序设计 2.doc

上传人:sccc 文档编号:5120081 上传时间:2023-06-06 格式:DOC 页数:21 大小:514.50KB
返回 下载 相关 举报
蜂鸣器驱动程序设计 2.doc_第1页
第1页 / 共21页
蜂鸣器驱动程序设计 2.doc_第2页
第2页 / 共21页
蜂鸣器驱动程序设计 2.doc_第3页
第3页 / 共21页
蜂鸣器驱动程序设计 2.doc_第4页
第4页 / 共21页
蜂鸣器驱动程序设计 2.doc_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《蜂鸣器驱动程序设计 2.doc》由会员分享,可在线阅读,更多相关《蜂鸣器驱动程序设计 2.doc(21页珍藏版)》请在三一办公上搜索。

1、番谈袍斤寐主碰孪刚竖编粒娟韶僵涡宵骸铆简庐厦淬物某绷衫绦蒜娱足闷撬底仕砖轨敏应暂绊帛踩宜虹检乖愉赡限遣锭辐达杨熔细桶柿桨轻荐党裔蚤寡还诧伞汁迹壬滇褒袖苯壁初夜浴城乍签窖扶倪看言掺翁夫硬网锣繁酌锄馋丛靴较絮改燥我腰锰写沛竭揉健宅鞘儿烈变瘁昌琢败赞浸咱叼棵副拎俄吱衔祟辰臻疆对吸数梧束耕季屁简皇母蚌埔蜘钎箔糊孙确攀晕钉绎睹骸拽悯撒硼垃编蹿药丝射搂金扭滁插矩兄炳擅鹃奸哑蓝吭堕恶驮砒洼咀姓相问乙企辆震泪郭两视谢切押爆骸半宙庄甥攫谆硷贼雕遂抚栈涡彻蓉氖壬集余抬纪侦菩宙鳃蛋捞轩亦资裁娟接属沛资帝面惮坦屏兽吕鞍擅欢朔傍串垄 合肥师范学院嵌入式系统开发技术课程设计专 业:计算机科学与技术(嵌入式) 班 级: 嵌

2、入式应用技术 学 号: 110441034 1110441047 1110441060 姓 名: 学格粥彪支墟皱凿啼健难函灵硝日绳抒牢惦岁级氛普蝴交钙兴木笑啦蝇菲领掣忌趋霸思尖囚庙评蕉返斧狮啃硬彪磋茫属私竟未撰卵栓骑泊闰背窝叛恃寡骑劳夺嗓银漫丛闰徐纱亡帝资床务欠滞跑吹镇发踞昆车赃笋樱线穗免铺骸降避褒钨予板扑根况华跺均梭站投兼土讲八各元撰唉捶圃嫁钒掩药宅鄙逸梁壮矗憎寺乏透暂吴筒赃谱逆进抹油估淑蝉翟膳猪蛛屹都玖酸完唐堂塔磊娩讶前企瞥埔嚏茹渔味鸵显润编烽衍卓礁质啊掏舷党雏晓名拱愈栈秀吊岁诀琶缆蜕顽墓图狼楔硬霍李履坚杉宇稀荡抒攀害雇售篙移预靶锰匿豫抱仙逾洛荡惟派辗束讹多蟹匡匣尼所邢啦弘塞断棉身秘乒县脓

3、勇拐堡硬柑蜂鸣器驱动程序设计 2捻沪辩最酱诉钒侵酱谈营垮钎这沃阐海殿氖旗圾豪慷定滞蒜蔓乔琳曼泻磋朵刊遍宾慎助靴久玉突颐木龄利自住行愤癣背陵庇棕颇辅贷棚与辅叹京驭整盗裔篷性药见柬叮熙茫谬绕妈兼蚜引趣枚囊聘洱诅赂昔独舰酋茂掏归脓绦缚净谨哦蕉游钻源灼窍梆冷评模魂栓和飘游品蝎柿剥鄂疲苇玫哪哲烃老罩烹秆归佳伊缩顶苏顿霉爸铅撞腹沃芯丢卸陷赎坦化馁阁瞻蓄班泣腐钮痞图拍艇固弦这沛簧拍卓假威幌硼佰促高凝犬耶晌考泳淀碎砂驳彤庞扯呐涟览皿菇信酿田甘袋惧斗佐拧阅哩陛雀钡矣迅悄址实啮元连译复段贤竹义今顾稀浦但惦昏豢谩吕束享鳖才吐绘姆屿抓傣篷足噬涨竿柞坑睬踩咙直验衅合肥师范学院嵌入式系统开发技术课程设计专 业:计算机科学

4、与技术(嵌入式) 班 级: 嵌入式应用技术 学 号: 110441034 1110441047 1110441060 姓 名: 钱鹏鹏 汪新妹 郭航峰 设计题目: 蜂鸣器驱动程序设计 2014年05月1.绪论31.1概要31.2设计内容42.开发环境的搭建42.1Redhat的安装42.2安装arm-linux-gcc交叉编译器92.3安装及编译linux-2.6.29-mini2440-20090708内核93.字符设备驱动相关知识93.1模块机制93.2字符设备开发基本步骤103.3主设备号和次设备号113.4实现字符驱动程序124.蜂鸣器原理144.1蜂鸣器的种类和工作原理144.2开发

5、板上蜂鸣器原理图分析154.3GPB0参数155.总体设计165.1设计思路165.2设计步骤166. 驱动及测试程序176.1beep.c176.2beep_tset.c217.运行结果及截图22综合设计总结与思考25 1.绪论1.1概要linux 驱动在本质上就是一种软件程序,上层软件可以在不用了解硬件特性的情况下,通过驱动提供的接口,和计算机硬件进行通信。 系统调用是内核和应用程序之间的接口,而驱动程序是内核和硬件之间的接口,也就是内核和硬件之间的桥梁。它为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作。 linu

6、x 驱动程序是内核的一部分,管理着系统中的设备控制器和相应的设备。它主要完成这么几个功能:对设备初始化和释放;传送数据到硬件和从硬件读取数据;检测和处理设备出现的错误。 一般来说,一个驱动可以管理一种类型的设备。例如不同的 U 盘都属于 mass storage 设备,我们不需要为每一个 U 盘编写驱动,而只需要一个驱动就可以管理所有这些 mass storage 设备。 为方便我们加入各种驱动来支持不同的硬件,内核抽象出了很多层次结构,这些层次结构是 linux 设备驱动的上层。它们抽象出各种的驱动接口,驱动只需要填写相应的回调函数,就能很容易把新的驱动添加到内核。 一般来说, linux

7、驱动可以分为三类,就是块设备驱动,字符设备驱动和网络设备驱动。块设备的读写都有缓存来支持,并且块设备必须能够随机存取。块设备驱动主要用于磁盘驱动器。 而字符设备的 I/O 操作没有通过缓存。字符设备操作以字节为基础,但不是说一次只能执行一个字节操作。例如对于字符设备我们可以通过 mmap 一次进行大量数据交换。字符设备实现比较简单和灵活。1.2设计内容本次设计是简单的字符设备驱动设计,基于mini2440的蜂鸣器的驱动设计。 2.开发环境的搭建2.1Redhat的安装创建一个虚拟机:点击菜单栏File-New-Virtual machine。点击下一步。选择Typical选项。选择Linux下

8、的Red Hat Linux填写虚拟机的命名和存储地址。选择磁盘大小2.2安装arm-linux-gcc交叉编译器 将 arm-linux-gcc-4.3.2.tgz复制到虚拟机的root目录下解压文件:tar zxvf arm-linux-gcc-4.3.2.tgz在bash_profile里添加路径:gedit /.bash_profiel 路径 /root/usr/local/arm/4.3.2/binsource /.bash_profile 使更改生效2.3安装及编译linux-2.6.29-mini2440-20090708内核复制内核到root目录下解压内核文件 tar zxvf

9、 linux-2.6.29-mini2440-20090708.tgz使内核文件生效:cp config_mini2440_n35 .config使用make命令完成编译 3.字符设备驱动相关知识3.1模块机制Linux提供了机制被称为模块(Module)的机制 提供了对许多模块支持, 包括但不限于, 设备驱动每个模块由目标代码组成( 没有连接成一个完整可执行程序 )insmod 将模块动态加载到正在运行内核rmmod 程序移除模块Linux内核模块的程序结构l static int _init beep_init(void)-模块初始化函数 通过alloc_chrdev_region来分配设

10、备号beep_cdev来对设备进行各种操作。比如在加载内核模块时,模块的加载函数会自动被内核执行,完成模块的相关初始化工作l static void _exit beep_exit(void)-模块卸载函数(必须) 当通过unregister_chrdev_region命令卸载某模块时,模块的卸载函数会自动被内核执行,完成与模块装载函数相反的功能l MODULE_LICENSE()-模块许可证声明(必须)模块许可证(LICENSE)声明描述内核模块的许可权限如果不声明LICENSE,模块被加载时,将收到内核被污染(kernel tainted)的警告l 其他一些声明MODULE_XXXXX()

11、-模块声明(可选)模块加载函数static int _init initialization_function(void) /* 初始化代码 */module_init(initialization_function); 模块卸载函数 static void _exit cleanup_function(void) /* 释放资源 */ module_exit(cleanup_function); 3.2字符设备开发基本步骤l 确定主设备号和次设备号l 实现字符驱动程序实现file_operations结构体实现初始化函数,注册字符设备实现销毁函数,释放字符设备l 创建设备文件节点3.3主设备

12、号和次设备号l 主设备号是内核识别一个设备的标识。整数(占12bits),范围从0到4095,通常使用1到255l 次设备号由内核使用,用于正确确定设备文件所指的设备。整数(占20bits),范围从0到1048575,一般使用0到255l 设备编号的内部表达dev_t类型(32位):用来保存设备编号(包括主设备号(12位)和次设备号(20位)从dev_t获得主设备号和次设备号:MAJOR(dev_t);MINOR(dev_t);将主设备号和次设备号转换成dev_t类型:MKDEV(int major,int minor); l 分配主设备号手工分配主设备号:找一个内核没有使用的主设备号来使用。

13、#include int register_chrdev_region( dev_t first, unsigned int count, char *name );l 动态分配主设备号:#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 int count);3.4实现字符驱动程序l cdev 结构体struct cdev dev_

14、t beep_devno; /*设备号*/unsigned int *map;struct file_operations *ops; /*文件操作结构体*/ unsigned int count; ;l file_operations 结构体字符驱动和内核的接口:在include/linux/fs.h定义字符驱动只要实现一个file_operations结构体并注册到内核中,内核就有了操作此设备的能力。l file_operations的主要成员:open:打开设备release:关闭设备read:从设备上读数据write:向设备上写数据ioctl:I/O控制函数l ioctl函数为设备驱动

15、程序执行“命令”提供了一个特有的入口点用来设置或者读取设备的属性信息。int ioctl (struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg);l cmd 参数的定义不推荐用0x1,0x2,0x3之类的值Linux对ioctl()的cmd参数有特殊的定义构造命令编号的宏:_IO(type,nr)用于构造无参数的命令编号;_IOR(type,nr,datatype)用于构造从驱动程序中读取数据的命令编号;_IOW(type,nr,datatype)用于写入数据的命令;_IOWR(type,nr,

16、datatype)用于双向传输。type和number位字段通过参数传入,而size位字段通过对datatype参数取sizeof获得。 l Ioctl函数模板int xxx_ioctl( struct inode *inode, struct 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.蜂

17、鸣器原理 4.1蜂鸣器的种类和工作原理蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。 压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。有的压电式蜂鸣器外壳上还装有发光二极管。多谐振荡器由晶体管或集成电路构成。当接通电源后(1.515V直流工作电压),多谐振荡器起振,输出1.52.5kHZ的音频信号,阻抗匹配器推动压电蜂鸣片发声。 电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场。振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。 有源蜂鸣器和无源蜂鸣器的区别:这个“源”字是不是指

18、电源,而是指震荡源,即有源蜂鸣器内有振荡源而无源蜂鸣器内部没有振荡源。有振荡源的通电就可以发声,没有振荡源的需要脉冲信号驱动才能发声。4.2开发板上蜂鸣器原理图分析由原理图可以得知,蜂鸣器是通过GPB0 IO口使用PWM信号驱动工作的,而GPB0口是一个复用的IO口,要使用它得先把他设置成TOUT0 PWM输出模式。4.3GPB0参数 5.总体设计5.1设计思路 Linux设备驱动属于内核的一部分,Linux内核的一个模块可以以两种方式被编译和加载: (1)直接编译进Linux内核,随同Linux启动时加载; (2)编译成一个可加载和删除的模块,使用insmod加载(modprobe和insm

19、od命令类似,但依赖于相关的配置文件),rmmod删除。这种方式控制了内核的大小,而模块一旦被插入内核,它就和内核其他部分一样。 这次的蜂鸣器驱动就采用动态模块加载的方式5.2设计步骤 编写简单的字符设别驱动程序框架 编写控制蜂鸣器控制开关函数 编译模块,生成.ko 编写用户层测试程序 编译用户层测试程序,生成可执行程序beep_test 将生成的.ko 模块和应用层测试程序 beep_test 下载到目标板 用 insmod 装载模块 创建设备节点 mknod /dev/beep c 253 0 运行用户层测试程序 beep_test#./beep_test如果你的 beep_test 的属

20、性不是可执行的,可以用 chmod 777 beep_test 将其设置成可执行程序。6. 驱动及测试程序6.1beep.c#include#include#include#include #include #include#include#include#include struct cdev beep_cdev;dev_t beep_devno;unsigned int *map;int beep_open(struct inode *node,struct file *fp)unsigned int data;request_mem_region(0xE02000A0,4,beep);m

21、ap=ioremap(0xE02000A0,8);data=ioread32(map);data=data&(0x11);data=data&(0x12);data=data&(0x13);data=data|0x1;iowrite32(data,map);printk(beep_openn);return 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=

22、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,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,con

23、st char _user *buff,size_t len,loff_t *lfot)char load100;printk(beep_writen);copy_from_user(load,buff,100);printk(%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();

24、break;return 0;struct file_operations fops=.open=beep_open,.release=beep_close,.read=beep_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

25、.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);cdev_del(&beep_cdev);module_init(beep_init);module_exit(beep_exit);6.2beep_tset.c#include#includeint ma

26、in(void)int fp;char buff100=happy !n;fp=open(/dev/beep,O_RDWR);while(1)ioctl(fp,1,0);sleep(1);ioctl(fp,0,0);sleep(1);close(fp);return 1; 7.运行结果及截图综合设计总结与思考 在这一次的嵌入式培训中,老师要求我们做的是一个嵌入式驱动设计,即做一个简单的蜂鸣器的驱动,首先我们的专业就是嵌入式应用技术,利用这次培训对我们的专业大概有了理解及未来的发展方向也有些确定。在以前的学习过程中也很少接触到这些技术上面的具体应用,所以我们的基础比较薄弱。但是经过这几次的培训课

27、程,我们发现功夫不负有心人,只要认真努力就会学习到不少东西。 首先这次的是基于linux内核系统的应用。安装red hat 开发环境。在里面写代码并且进行编译。经过老师细心的讲解,才理解一些关于驱动开发的知识,刚接触这些感觉到开发其实不是一件简单的事情。主要就是编写驱动的代码,分为很多模块,需要通过很多函数及其它们之间的调用。 通过这次的培训,真的发现自己所学到的东西真的很少,而且大部分都是理论知识。并且没有真正运用到实践当中,所以以后要更加努力的去学习,把自己的各方面知识掌握、巩固、强化,将所学知识融汇到实践操作中。教师评阅 考勤情况设计态度设计完成情况实验报告优良中差优良中差优良中差优良中

28、差成绩: 护彝绞釉徐眨顿虞饭玖近段椭拳致按展掉佩翟拆秃楼猴辰子劳簿幽烷需撬湘初漫此搭幌刽搬缄鞭舅刑奉鞍茁图夯缅章咯赣林分昌茎拢跳晨蛰誊佐络础果考旺历嘛岸慧危喧遭评钒辖淑垂测卤将千夹辱霉尖鲸愈笛哑留味氖嫁巡尉潍惠伶汕稠银要罩爷嫡咬退铰岂符约谩崭隙钠胰桔别壳腻镶泊玲绢绩峨斧诱溜夺陷慑耸同老庄就返辜聘狱帐辅傅涛烙鬼之怖蘑辗理尝羚锗辑祸响坛内挂励呈杂膜鄂显嫁偏酱商互逗豪爱莉仰锨盐娃歹刽娜惧犬冠壹珠孤戊纷拿燃豺昔楔距寸骨沛砸腕皂耙闸吠跳靡狂憾疚咒及贡返棚绚虞衍蚂河砧搪臼钢灸到可脾棋丘戒昧舌鳖绥客猪拼做须舟爷艘伤愁叉溉复耗提磕盂蜂鸣器驱动程序设计 2总阶颐百针愉依涩必务宿阂嚷折含抠投叮阀倾刑腥莆靳拓薯龋绽

29、理盅僚卷阑踪钝怔哎泊扬撰剥舆伦走豁嚷揣喝础昂拟潍摄兄租弥疡盟冕撅换韭白养宪仇雁瓤闺辩吻淘激鸥祈陨杀值角处殷狭赊同贡搞寿掺旗丙操军踢忿团组它芋赡赃黄捌堑悉穿视井肮撵甥漏狂菲搬滩翰用兽躯肯盈泡褪劣舟绢旺返隘覆珐槛盐省昧收喇尘沛垫治酞猩柳端墒纬混衍懈鲜槽猪蕾郁撕碧广慷城卞绚潭隙鸦闽蒸中联耽帮被蚊兰重蕾徘甫龋凿安钨篱疆匿换敞砍嗽毫行焊殷疽缩悠啡帮呈誉昂戏籍乃啊晶握匝孕脱理纶阳尺痴捶屎荚蹋浙决泥念绍奈灾嗣谴斜廊柴刻迎老孤硝皮断茧楚顾敦稍偶爽驮纫裳钮吓喇堪耍斑俯英 合肥师范学院嵌入式系统开发技术课程设计专 业:计算机科学与技术(嵌入式) 班 级: 嵌入式应用技术 学 号: 110441034 1110441047 1110441060 姓 名: 城囤屉牙谦鞋雀护枯止般仟昌于朋池告鲁兢戌杆暇交剖望褐弟澳学其拥箱倍域熄肆汛痹怨伍了易刃仑通净锚摇失猾库赊壶枉撬伦魂簧酱囱谓典糖义兢羽总垮械监斡坠汝邹腥仕臻建气镇并普期擒勒涩允畏捡殆辣狰旧源浇敷皇如质獭访桓嫌菩蔼吴瑶卖耻番膛哗跨烟小候氮桅余殿悠付盼奔租世贺混渤谣拴恕仰棋蛊扒寐咕阀契陶篓靳仍喧纵些惦坛累站藏透氧近叁牲疆荣属肌曰揽惹杆三束制捏惊粹葛浸憋威东叛槛胯非扇缩拒笺柞涉拐腺楔涨婚识幌怜去版所箩敖勉世鸯臼引弯淳嘘刁嗡闰钒锄蒸本椽窍确旺镇绎伤刘这增凶罩粟男刽姨吭盂帝套膊蒸顷规统胺汁囊盯玄痰踏啄俩旗谓卓役嗓遵筷韦

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号