目录
三.我们进到drivers/input/misc目录下的Kconfig文件中找到并修改注释掉
五、s3c2440 PWM使用之蜂鸣器驱动移植常遇问题及处理
一、蜂鸣器驱动介绍
蜂鸣器是一种简单的声响发生器,常用于电子产品中作为警示或提醒作用。其基本原理是通过交替改变直流电的电压方向来产生声音,一般使用交替电流产生声音会比较稳定。
蜂鸣器通常分为有源和无源两种,有源的蜂鸣器需要外接驱动电路以使其发声,而无源蜂鸣器则直接由电源驱动产生声音。
蜂鸣器驱动电路一般由振荡电路、驱动电路、电源电路、滤波电路组成。其中振荡电路产生频率稳定、幅度适当的交流电压信号,驱动电路将这个信号输出到蜂鸣器上,使其产生声音。电源电路为驱动电路和振荡电路提供稳定的电源,滤波电路则消除电源噪声,提高声音质量。
在驱动蜂鸣器时,可以通过改变输出信号的频率和幅度来控制蜂鸣器发出不同的声音。常用的驱动器有单片机、集成电路、普通放大电路等,根据不同的需求和电路复杂度可以选择不同的驱动方式。
二、PWM定时器简述:
S3C2440一共有5个16位的定时器,其中定时器0、1、2、3有PWM(脉冲宽度调制)功能,它们都有一个输出引脚(如TOUTn【n为0~3】),可以通过定时器来控制引脚周期性的高、低电平变化,但是定时器4没有输出引脚。
定时器顾名思义需要时钟去维持,那么它的时钟源为PCLK,首先通过两个8位的预分频降低频率,其中,定时器0共用第一个预分频器,定时器2、3、4共用第二个预分频器。预分频器的输出将进入第二级分频器,它们输出5种频率的时钟,2、4、8、16和TCLK0/1(外部时钟),每个定时器的工作时钟就是从这5种频率中选择得来的啦。
8位预分频是通过TCFG0寄存器来设置的,4位分频是通过TCFG1来设置的。定时器的结构示意图如下:
S3c2440datesheet分布原理图如下:
通过S3C2440原理图可知蜂鸣器接2440的GPB0/TOUT0.即我们的蜂鸣器是通过GPB0 IO口使用PWM信号驱动工作的,而且GPB0口是一个复用的IO口,要使用它得把他设置成TOUT0 PWM输出模式。
蜂鸣器可以发声,靠的不仅仅是蜂鸣器硬件的驱动,还有linux下的PWM(脉冲宽度调制)这种变频技术,靠改变脉冲宽度来控制输出电压,通过改变周期来控制其输出频率。通过改变频率可以使蜂鸣器发出不同的声音。
三、修改内核代码
[leiyuxing@centos6 linux-3.0]$ vim ./arch/arm/mach-s3c2440/mach-smdk2440.c
235 #include <linux/gpio.h> //add by leiyuxing,2016.8.18
236 /* beeper add by leiyuxing 2016.8.18*/
237 static struct platform_device smdk2440_beeper_device= {
238 .name= "pwm-beeper",
239 .dev= {
240 .parent = &s3c_device_timer[0].dev,//采用具有PWM脉冲宽度调制功能的定时器0;
241 .platform_data = 0,
242 },
243 .id= 0,
244 };
245 /* beeper add by leiyuxing 2016.8.18*/
246
247 static struct platform_device *smdk2440_devices[] __initdata = {
248 &s3c_device_ohci,
249 &s3c_device_lcd,
250 &s3c_device_wdt,
251 &s3c_device_i2c0,
252 &s3c_device_iis,
253 &s3c_device_dm9000,
254 &uda1340_codec,
255 &s3c24xx_uda134x,
256 &samsung_asoc_dma,
257 &s3c_device_adc, /* modify by leiyuxing */
258 &s3c_device_ts, /* modify by leiyuxing */
259 &s3c_device_rtc,//add by leiyuxing
260
261
262 &s3c_device_timer,//add by leiyuxing,2016.8.18
263 &smdk2440_beeper_device,//add by leiyuxing,2016.8.18
264 };
288 static void __init smdk2440_machine_init(void)
289 {
290 s3c24xx_fb_set_platdata(&smdk2440_fb_info);
291 s3c_i2c0_set_platdata(NULL);
292 s3c24xx_ts_set_platdata(&smdk2440_ts_cfg);/*Add Touch Screen info by leiy uxing*/
293
294 /* PWM beeper add by leiyuxing 2016.8.18*/
295 gpio_request(S3C2410_GPB(0),"beeper");//IO口使用GPB0
296 s3c_gpio_setpull(S3C2410_GPB(0), S3C_GPIO_PULL_NONE);
297 s3c_gpio_cfgpin(S3C2410_GPB(0), S3C2410_GPB0_TOUT0);//设置为TOUT0 PWM输出模式
298 /* PWM beeper add by leiyuxing 2016.8.18*/
三.我们进到drivers/input/misc目录下的Kconfig文件中找到并修改注释掉
[leiyuxing@centos6 linux-3.0]$ vim drivers/input/misc/Kconfig
321
322 config INPUT_PWM_BEEPER
323 tristate "PWM beeper support"
324 #depends on HAVE_PWM //注释掉
325 help
326 Say Y here to get support for PWM based beeper devices.
327
328 If unsure, say N.
329
330 To compile this driver as a module, choose M here: the module will be
331 called pwm-beeper
四.修改内核配置并检验效果
[leiyuxing@centos6 linux-3.0]$make menuconfig
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
到此,蜂鸣器的简单驱动配置就已经完成了,编译后烧进内核中重启后在启动内核成功时就能听到哔的一声了,这说明蜂鸣器已经配置正确可以使用了。另外在启动的过程中,系统会输出下列语句:
我们也可以通过查看输入子系统的设备来进一步确认:
当然这是最简单的,并没有调整修改频率而发出来的声音。
参考链接:
http://blog.csdn.net/zhaocj/article/details/8843892
五、s3c2440 PWM使用之蜂鸣器驱动移植常遇问题及处理
在s3c2440中使用PWM驱动蜂鸣器时,常遇到以下问题:
- PWM时钟的选择和设置:在使用PWM时需要选择合适的时钟源以及对时钟进行设置,否则可能会导致PWM输出频率不准确或不正常工作;
- PWM输出的占空比设置:占空比的不准确设置可能会导致蜂鸣器输出的声音不稳定或者无声;
- GPIO的配置:需要将GPIO配置为PWM输出模式,否则就无法将PWM信号输出到蜂鸣器上。
针对这些问题,可以采取以下措施:
- 在使用PWM时,需要确保时钟的选择和设置是正确的,可参考s3c2440的手册进行设置;
- 对于占空比的设置,需要根据具体情况进行调节,可以通过改变PWM的周期和占空比,来调整输出频率和声音大小;
- 在GPIO的配置时,需要设置GPIO为正确的PWM输出模式,可参考相关的代码示例或手册进行配置。
总之,要顺利使用s3c2440的PWM功能驱动蜂鸣器,需要充分理解并掌握PWM的工作原理和相关配置方法,同时也需要注意以上提到的问题及解决方法。