这篇文档拖了好久了,都有点淡忘了。这段时间考试加实验太忙了,但还是先粗略的记录,归纳一下吧。
交叉编译器环境: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