s3c2440 linux3.0下PWM使用之蜂鸣器驱动移植

来源:互联网 发布:snow软件下载 编辑:程序博客网 时间:2024/06/04 19:06

这篇文档拖了好久了,都有点淡忘了。这段时间考试加实验太忙了,但还是先粗略的记录,归纳一下吧。

交叉编译器环境:arm-linux-gcc-4.5.4
开发板平台:FL2440        
Linux内核版本: 3.0

先贴上修改过的地方。文件:mach-smdk2440.c

+#include <linux/gpio.h>  //add by handy 5.20+/* beeper add by Handy 2015.5.20 */+static struct platform_device smdk2440_beeper_device= {+    .name= "pwm-beeper",+    .dev= {+        .parent = &s3c_device_timer[0].dev,      //采用具有PWM脉冲宽度调制功能的定时器0;+        .platform_data = 0,+    },+    .id= 0,+}; static struct platform_device *smdk2440_devices[] __initdata = {    &s3c_device_ohci,    &s3c_device_lcd,    &s3c_device_iis,+   &s3c_device_rtc,+   &uda1340_codec,/* add UDA1341 by Handy */                                                                                          +   &smdk2440_audio,/* add UDA1341 by Handy */+   &samsung_asoc_dma,/* add DM9000 by Handy */+   &smdk2440_device_eth,/* add DM9000 by Handy */+   &s3c_device_adc,/* add Touch Screen driver by Handy,2015.5.14 */+   &s3c_device_ts, /* add Touch Screen driver by Handy,2015.5.14 */+    &s3c_device_timer,/* add timer by Handy */                  +    &smdk2440_beeper_device,/* add beeper by Handy */ };    static void __init smdk2440_machine_init(void) {    s3c24xx_fb_set_platdata(&smdk2440_fb_info);+   s3c24xx_ts_set_platdata(&smdk2440_ts_cfg);/* add Touch screen info by Handy,2015.5.14 */    s3c_i2c0_set_platdata(NULL);-+     /* PWM beeper add by Handy 2015.5.20*/+    gpio_request(S3C2410_GPB(0),"beeper");                     //IO口使用GPB0 +    s3c_gpio_setpull(S3C2410_GPB(0), S3C_GPIO_PULL_NONE);+    s3c_gpio_cfgpin(S3C2410_GPB(0), S3C2410_GPB0_TOUT0);      //设置为TOUT0 PWM输出模式+    /* PWM beeper add by Handy 2015.5.20 */

蜂鸣器可以发声,靠的不仅仅是蜂鸣器硬件的驱动,还有linux下的PWM(脉冲宽度调制)这种变频技术,靠改变脉冲宽度来控制输出电压,通过改变周期来控制其输出频率。通过改变频率可以使蜂鸣器发出不同的声音。



上面我们最基本可以知道的是定时器0,1,2,3都具有PWM脉冲宽度调制功能。当然还有定时器的操作时序等,但这些问题在这里不深究,具体看2440datesheet.


通过S3C2440原理图可知蜂鸣器接2440的GPB0/TOUT0.即我们的蜂鸣器是通过GPB0 IO口使用PWM信号驱动工作的,而且GPB0口是一个复用的IO口,要使用它得把他设置成TOUT0 PWM输出模式。另外s3c_gpio_setpull()函数和s3c_gpio_cfgpin()这两个控制GPIO口的函数在内核中,我做驱动移植并没有深入研究,待日后再深入追踪。

代码部分的修改已经完毕,接下来便是内核配置:

我们linux内核已经带有基于PWM蜂鸣器的通用驱动程序pwm-beeper.c(位于drivers/input/misc目录下),它属于input子系统。所以我们在make menuconfig配置的时候需要选上 PWM beeper support这个选项。

于是我们进到drivers/input/misc目录下的Kconfig文件中找到并修改注释掉.让这个选项不依赖于其他文件就可以勾选。

还有就是beeper support的部分驱动支持选项要选上

SystemType  --->
 [ * ] PWM device support

DeviceDrivers  --->
           Input device support  --->
                       [* ] Miscellaneous devices  --->
                                    < * > PWM beeper support
           - * - Pules-Width Modulation (PWM) Supprot --->
                      --- Pulse-Width Modulation (PWM) Support
                       - *-     Samsung pwmsupport

到此,蜂鸣器的简单驱动配置就已经完成了,烧进内核中重启后在启动内核成功时就能听到哔的一声了。当然这是最简单的,并没有调整修改频率而发出来的声音。

参考网上的文档知道我们还可以通过改变event.value的值来发出不同的声音。往后有时间我要再写个应用程序测试一下。


Referrence:

http://blog.csdn.net/zhaocj/article/details/8843892

http://blog.chinaunix.net/uid-26942706-id-3269636.html

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 水洗棉床单起球怎么办 lv羊绒围巾起球怎么办 羊绒洗缩水了怎么办啊 lv围巾洗坏了怎么办 针织衫越穿越大怎么办 右边上嘴唇肿了怎么办 毛衣洗了掉毛怎么办 身上被螨虫咬了怎么办 裤子上有蜡烛油怎么办 蜡烛滴在地板上怎么办 我用面膜过敏了怎么办 敷面膜过敏肿了怎么办 贴面膜脸过敏了怎么办 隐形船袜总是掉怎么办 车钥匙没电了怎么办 水坐垫干了结晶怎么办 冰垫里面有颗粒怎么办 车上的脚垫丢了怎么办 朔钢窗锁不好使怎么办 8个月孕妇咳嗽怎么办 孕妇7个月咳嗽怎么办 孕妇6个月喉咙痒怎么办 怀孕了咳嗽的厉害怎么办 买衣服眼光太差怎么办 我买衣服没主见怎么办 海澜之家皮带长怎么办 针织衫袖口松了怎么办 宝宝裤子腰大了怎么办 两岁了头发稀少怎么办 孩子抵抗力差爱生病怎么办 三岁宝宝总生病怎么办 冬天穿伴娘服冷怎么办 白衬衣粘了黑毛怎么办 黄衣服钻进黑毛怎么办 单位没给上社保怎么办 轮毂中心孔大了怎么办 钻戒大了怎么办小窍门 shift加f4没反应怎么办 多洗联系不上怎么办 弹力靴筒往下掉怎么办 子宫内膜厚月经停不了怎么办