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

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

交叉编译器环境: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(脉冲宽度调制)这种变频技术,靠改变脉冲宽度来控制输出电压,通过改变周期来控制其输出频率。通过改变频率可以使蜂鸣器发出不同的声音。

s3c2440 linux3.0下PWM使用之蜂鸣器驱动移植_第1张图片

s3c2440 linux3.0下PWM使用之蜂鸣器驱动移植_第2张图片

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

s3c2440 linux3.0下PWM使用之蜂鸣器驱动移植_第3张图片s3c2440 linux3.0下PWM使用之蜂鸣器驱动移植_第4张图片

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

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

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

s3c2440 linux3.0下PWM使用之蜂鸣器驱动移植_第6张图片

于是我们进到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

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

s3c2440 linux3.0下PWM使用之蜂鸣器驱动移植_第7张图片

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


Referrence:

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

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

你可能感兴趣的:(PWM蜂鸣器驱动移植)