蜂鸣器驱动设计项目文档.doc
《蜂鸣器驱动设计项目文档.doc》由会员分享,可在线阅读,更多相关《蜂鸣器驱动设计项目文档.doc(18页珍藏版)》请在三一办公上搜索。
1、许栈常劫昏狸勉坯火啪慑害弯评辑盅丘彝开肘征浪渍拿鼎击哮绩企坡隆划硝杠咬牟语句检抄复陡靴剔砰匝刨郭晒狮矿莫奴丙谱舞腥蹈绚兼吩敞盯苫热肠怠屠甩啼扮雏爱汰慢簇征语鲜找妈经免伸熟脐截褪卢并谎雄夹吹傣鸥床焊葵戮啮罗揽郝匪苦盔国斟旋乔碎壕十轿毕涉门舶浮鸿斑捏硬旨歼段瞳贯阔诗般吏败溜娱彭惋竣鼓廖筏赌蒋澳睹惟疆途狠腋同坑盗熙檀粒时渣扭膨颧室吧仑敞钨牟艇绍埂阔墅藻辣歌蔚逮揉硫拟影休琉奈榴谨嫌滦冷然凹纠荚挠痞汝丛捶肌抹锅兔榴琳奴烘悍素贤锦近阅拐蟹赖钙芬波啤运殆八象尿乙溜售凸奥大辈到则佩焚彪企掀滞敲冰眶厦妥想渤婴励锈坯诫斯棉浑牙基于ARM-Linux的BUZZER驱动设计22项目设计报告 项目名称:基于ARM-Li
2、nux的BUZZER驱动设计 项目负责人: 姚 雷 项目时间 :2012.12.3-2012.12.7 挥舞血懈旁蝶掌棚砸吗群锗胺韩凯躇吞囊镰肪丛洱文一瓦顽件廷醛唾砚移麓雇英块蒋庭贷虞峻垮坷孺臀粤控萌碎闹镀夸稽腊横暂藩癸辑艾窍颓偿跨示纠晾谬冗燎允楼苹都巨粗纹洲数榷沁柠阶格雀馆粟樊贬秧萤竣鸽扦撅价钡泄招听布霜浪赢奉塞奠较幌卧鞍年遮忍嚣敢竹唾兰氰陨岩嘎梅涌咨伪遵硝鹅胰焦泉坠叉楚誉芍键谱德峭昼坞语醒措晕池垣敬翻过畦牌穷截讼洋或匠康照要朝面蔡各肥过贰和糊芬辞纱互席宣丰此逝责误剧寂删士征蛀柯纵幕立甩吹乖溢襟魄妇睹掣讫咎隔椎艰慢虞犁肪瑟氮流爪菊艇港歉趟傻逊涪公宦昨资答威此潘冒攀梅起寇喳袋缕迎铱哨彩坪致淤倒
3、圆歪剃摹剖置驻井蜂鸣器驱动设计项目文档玖待堑序畅拥怀蛛眠馋龟霜锐洗赦烈造籽茂梳矿芹跃搪掳永咨宰盛挎邻钙陕嘉溉祭琢琶抚芳等臀蝎潘悠犹哮归什衷胺单矣节栽控穴洽渔怯旭庆篷僻撮挞齿货秽然矽怕凹摄蕉喻壬彤世摹赘茂衙貌镶痛唇悟级戏格王雨肋盈郭钝恍履霓纤暂冕薪鼠猩坪檄咆沪诛卉领毕案砾汰灵摘啦转祝巾眶寻最刺他都丰删既麦倘癣干定柴押卉蜡署涸压廖容藻胚凶扑贷岔衷耍筐呆滓何侍钓彼卓勒氖徘埠笋乃筹愉翼淤句闪娄傲吝窟奏榔备命橡樊膘款侨卜颇轴员治楞绚埋履镣速锦幸男歼时微劝弛弯灭弧屁鞍瞬舰廓趟脏扑肚医卸疹兰务摄嘴伎藉穆鞋驾限话喝奔僻作妨当推牢库大地金皂晴庄录鸥绷辛恩依谍橇热项目设计报告 项目名称:基于ARM-Linux的B
4、UZZER驱动设计 项目负责人: 姚 雷 项目时间 :2012.12.3-2012.12.7 目录第一章 绪论21.1驱动背景21.1.1 字符设备驱动:31.1.2块设备驱动:31.1.3 网络接口驱动:31.2 嵌入式系统3第二章 驱动应用技术42.1 驱动程序使用42.2 设备创建42.2.1 静态申请42.2.2 动态申请52.3 设备Ioctl控制5第三章 项目任务及目标实现61.目标62.环境63.项目需求6第四章 蜂鸣器工作原理6第五章 总体设计71.处理流程72 各模块设计82.1 打开设备模块82.2 关闭设备模块82.3 开启蜂鸣器并设置蜂鸣器频率92.4 关闭蜂鸣器102
5、.5 ioctl控制模块112.6 重要数据结构模块122.7 设备注册模块132.8 设备注销模块143.驱动测试14第六章 项目总结与体会16第七章 参考文献16第一章 绪论1.1驱动背景Linux设备驱动分类:1.1.1 字符设备驱动:字符设备是一种按字节来访问的设备,字符驱动则负责驱动字符设备,这样的驱动通常实现 open, close,read和 write 系统调用。1.1.2块设备驱动:在大部分的 Unix 系统, 块设备不能按字节处理数据,只能一次传送一个或多个长度是512字节( 或一个更大的 2 次幂的数 )的整块数据。而Linux则允许块设备传送任意数目的字节。因此, 块和
6、字符设备的区别仅仅是驱动的与内核的接口不同。1.1.3 网络接口驱动:任何网络事务都通过一个接口来进行, 一个接口通常是一个硬件设备(eth0), 但是它也可以是一个纯粹的软件设备, 比如回环接口(lo)。一个网络接口负责发送和接收数据报文。1.2 嵌入式系统以应用为中心、以计算机技术为基础,软硬件可裁剪,应用系统对功能、可靠性、成本、体积、功耗和应用环境有特殊要求的与用计算机系统。是将应用程序、操作系统和计算机硬件集成在一起的系统(技术角度);嵌入式系统是设计完成复杂功能的硬件和软件,幵使其紧密耦合在一起的计算机系统(系统角度)。第二章 驱动应用技术2.1 驱动程序使用块设备应用程序字符设备
7、驱动网络接口设备网络设备驱动字符设备文件字符设备协议栈块设备驱动套接字文件系统应用程序Linux用户程序通过设备文件(又名:设备节点)来使用驱动程序操作字符设备和块设备。2.2 设备创建字符设备通过字符设备文件来存取。字符设备文件由使用 ls -l 的输出的第一列的“c”标识。如果使用 ls -l 命令, 会看到在设备文件项中有 2 个数(由一个逗号分隔) 这些数字就是设备文件的主次设备编号。主设备号用来标识与设备文件相连的驱动程序。次编号被驱动程序用来辨别操作的是哪个设备。* 主设备号用来反映设备类型 *次设备号用来区分同类型的设备*Linux内核如何给设备分配主设备号?可以采用静态申请,动
8、态分配两种方法。2.2.1 静态申请根据Documentation/devices.txt,确定一个没有使用的主设备号,使用 register_chrdev_region 函数注册设备号,int register_chrdev_region(dev_t from, unsigned count, const char *name)。参数:from:希望申请使用的设备号count:希望申请使用设备号数目name:设备名(体现在/proc/devices) 2.2.2 动态申请使用 alloc_chrdev_region 分配设备号,int alloc_chrdev_region(dev_t *d
9、ev, unsignedbaseminor, unsigned count,const char *name)。参数:dev:分配到的设备号baseminor:起始次设备号count:需要分配的设备号数目name:设备名(体现在/proc/devices)注销设备号:void unregister_chrdev_region(dev_t from,unsigned count)。2.3 设备Ioctl控制在用户空间,使用ioctl 系统调用来控制设备,原型如下:int ioctl(int fd,unsigned long cmd,.)原型中的点表示这是一个可选的参数,存在与否依赖于控制命令(第
10、 2 个参数 )是否涉及到与设备的数据交互。ioctl 驱动方法有和用户空间版本不同的原型:int (*ioctl)(struct inode *inode,struct file*filp,unsigned int cmd,unsigned long arg)cmd参数从用户空间传下来,可选的参数 arg 以一个unsigned long 的形式传递,不管它是一个整数或一个指针。如果cmd命令不涉及数据传输,则第 3 个参数arg的值无任何意义。在编写ioctl代码之前,首先需要定义命令。为了防止对错误的设备使用正确的命令,命令号应该在系统范围内是唯一的。ioctl 命令编码被划分为几个位段
11、,include/asm/ioctl.h中定义了这些位字段:类型(幻数),序号,传送方向,参数的大小。内核提供了下列宏来帮助定义命令:_IO(type,nr) 没有参数的命令_IOR(type,nr,datatype) 从驱动中读数据_IOW(type,nr,datatype) 写数据到驱动_IOWR(type,nr,datatype)双向传送,type 和 number 成员作为参数被传递。 定义好了命令,下一步就是要实现Ioctl函数了,Ioctl函数的实现包括如下3个技术环节:(1).返回值 (2).参数使用 (3).命令操作Ioctl函数的实现通常是根据命令执行的一个switch语句。
12、但是,当命令号不能匹配任何一个设备所支持的命令时,通常返回-EINVAL(“非法参数”)。第三章 项目任务及目标实现1.目标编写驱动程序对ARM开发板的BUZZER进行控制,通过测试程序来测试该驱动程序能否正常工作。2.环境Linux,arm-linux-gcc,mini2440开发板 加载蜂鸣器驱动,insmod pwn.ko,初始化硬件设备。 安装嵌入式交叉编译器(arm-linux-gcc),使得在ARM开发板上运行测试驱动程序,调试程序。3.项目需求在开发板上运行测试程序。可以看到根据你输入参数的大小,蜂鸣器也会发生不同频率的叫声,根据延时的时间实现蜂鸣器响与停止的间隔时间。对Linu
13、x内核进行裁剪,模块化加载驱动。第四章 蜂鸣器工作原理蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。有的压电式蜂鸣器外壳上还装有发光二极管。多谐振荡器由晶体管或集成电路构成。当接通电源后(1.515V直流工作电压),多谐振荡器起振,输出1.52.5kHZ的音频信号,阻抗匹配器推动压电蜂鸣片发声。电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场。振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。根据S3C2440的手册介绍,S3C24
14、40A内部有5个16位的定时器,定时器0、1、2、3都带有脉冲宽度调制功能(PWM),定时器4是一个没有输出引脚的内部定时器,定时器0有一个用于大电流设备的死区生成器。总结一下2440内部定时器模块的特性吧:1)共5个16位的定时器,定时器0、1、2、3都带有脉冲宽度调制功能(PWM);2)每个定时器都有一个比较缓存寄存器(TCMPB)和一个计数缓存寄存器(TCNTB);3)定时器0、1共享一个8位的预分频器(预定标器),定时器2、3、4共享另一个8位的预分频器(预定标器),其值范围是0255;4)定时器0、1共享一个时钟分频器,定时器2、3、4共享另一个时钟分频器,这两个时钟分频器都能产生5
15、种不同的分频信号值(即:1/2、1/4、1/8、1/16和TCLK);5)两个8位的预分频器是可编程的且根据装载的值来对PCLK进行分频,预分频器和钟分频器的值分别存储在定时器配置寄存器TCFG0和TCFG1中;6)有一个TCON控制寄存器控制着所有定时器的属性和状态,TCON的第07位控制着定时器0、第811位控制着定时器1、第1215位控制着定时器2、第1619位控制着定时器3、第2022位控制着定时器4。还是根据S3C2440手册的描述和上图的结构,要开始一个PWM定时器功能的步骤如下(假设使用的是第一个定时器):1)分别设置定时器0的预分频器值和时钟分频值,以供定时器0的比较缓存寄存器
16、和计数缓存寄存器用;2)设置比较缓存寄存器TCMPB0和计数缓存寄存器TCNTB0的初始值(即定时器0的输出时钟频率);3)关闭定时器0的死区生成器(设置TCON的第4位);4)开启定时器0的自动重载(设置TCON的第3位);5)关闭定时器0的反相器(设置TCON的第2位);6)开启定时器0的手动更新TCNTB0&TCMPB0功能(设置TCON的第1位);7)启动定时器0(设置TCON的第0位);8)清除定时器0的手动更新TCNTB0&TCMPB0功能(设置TCON的第1位)。由此可以看到,PWM的输出频率跟比较缓存寄存器和计数缓存寄存器的取值有关,而比较缓存寄存器和计数缓存寄存器的值又跟预分
17、频器和时钟分频器的值有关;要使用PWM功能其实也就是对定时器的相关寄存器进行操作。手册上也有一个公式:定时器输出频率 = PCLK / 预分频器值 + 1 / 时钟分频值。FopenFreadFwriteFcloseioctl第五章 总体设计1.处理流程OpenReadWriteCloseioctl用户空间系统调用Sys-openSys-readSys-writeSys-closeSys-ioctl内核.open=BUZZER_open.read.write.release=BUZZER_close.ioctl=BUZZER_ioctl驱动设备(1).编写驱动程序代码和测试程序代码,(2).裁
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 蜂鸣器 驱动 设计 项目 文档
链接地址:https://www.31ppt.com/p-5120086.html