S3C2440PWM定时器概述:
PWM ( Pulse Width Modulation ) —— 脉宽调制,它是利用微控制器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用于测量、通信、功率控制与变换等许多领域 。
S3C2440A 有5个16位定时器。其中定时器 0、1、2 和3具有脉宽调制(PWM)功能。定时器 4 是一个无输出引脚的内部定时器。定时器0还包含用于大电流驱动的死区发生器。定时器 0和 1共用一个8位预分频器,定时器2、3和 4 共用另外的8 位预分频器。每个定时器都有一个可以生成5 种不同分频信号(1/2,1/4,1/8,1/16 和TCLK)的时钟分频器。每个定时器模块从相应8 位预分频器得到时钟的时钟分频器中得到其自己的时钟信号。8 位预分频器是可编程的,并且按存储在 TCFG0 和 TCFG1寄存器中的加载值来分频PCLK。
S3c2440datesheet分布原理图如下:
由原理图可知,
知蜂鸣器接2440的GPB0/TOUT0.即我们的蜂鸣器是通过GPB0 IO口使用PWM信号驱动工作的,而且GPB0口是一个复用的IO口,要使用它得把他设置成TOUT0 PWM输出模式。s3c_gpio_setpull()函数和s3c_gpio_cfgpin()这两个控制GPIO口的函数在内核中,要进行修改。
[fanmaolin@Centeros linux-3.0]$ vim arch/arm/mach-s3c2440/mach-smdk2440.c
附上补丁:
--- mach-smdk2440.c 2017-04-22 06:01:27.706851435 +0800
+++ mach-smdk2440pwm.c 2017-04-22 05:59:53.525835733 +0800
@@ -31,6 +31,8 @@
#include <linux/dm9000.h> //添加DM9000网卡的头文件
+#include <linux/gpio.h>
+
#include <asm/mach/arch.h>
#include <asm/mach/map.h>
#include <asm/mach/irq.h>
@@ -59,9 +61,32 @@
#include <linux/i2c/at24.h>
#include <linux/delay.h>
+#include <sound/s3c24xx_uda134x.h>
+#include <mach/gpio-nrs.h>
+
#include <plat/common-smdk.h>
/* add DM9000 ethernet drivers ,whitch is bodify by liuchengdeng */
+
+static struct s3c24xx_uda134x_platform_data s3c24xx_uda134x_data = {
+ .l3_clk = S3C2410_GPB(4),
+ .l3_data = S3C2410_GPB(3),
+ .l3_mode = S3C2410_GPB(2),
+ .model = UDA134X_UDA1341,
+};
+
+static struct platform_device s3c24xx_uda134x = {
+ .name = "s3c24xx_uda134x",
+ .dev = {
+ .platform_data = &s3c24xx_uda134x_data,
+ }
+};
+
+static struct platform_device uda1340_codec = {
+ .name = "uda134x-codec",
+ .id = -1,
+};
+
#define DM9000_BASE (S3C2410_CS4 + 0x300)
static struct resource s3c_dm9000_resource[] = {
[0] = {
@@ -97,6 +122,20 @@
},
};
+/*beeper add by fanmaolin 2017.4.23*/
+static struct platform_device smdk2440_beeper_dev