当前位置: 代码迷 >> 驱动开发 >> cortex-A8,s5pv210,pwm蜂鸣器.本人初学,对这个板材不熟悉
  详细解决方案

cortex-A8,s5pv210,pwm蜂鸣器.本人初学,对这个板材不熟悉

热度:288   发布时间:2016-04-28 10:23:37.0
cortex-A8,s5pv210,pwm蜂鸣器.本人初学,对这个板子不熟悉
各位大神,希望你门能不吝赐教,我现在在S5PV210开发板上编写PWM驱动,想先写一个PWM控制蜂鸣器的驱动做当实验,但不能成功,我把代码贴出来,希望有大神可以指导一下我这样的菜鸟,真的非常感谢。


/*操控PWM主要分以下四步:
1、把相应的引脚配置成TOUT输出。

2、设置定时器的输出时钟频率。

3、设置脉冲的具体宽度。

4、最后就是对PWM的控制,它是通过寄存器TCON来实现的,
   一般来说每个定时器主要有4个位要配置(定时器0多一个死区位):
1).启动/终止位
2).手动更新位
3).输出反转位
4).自动重载位

一般要掌握好两个因素:
1、占空比,控制其震动的强度
2、频率,控制震动的舒适度
*/

//#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/poll.h>
#include <linux/interrupt.h>
#include <linux/gpio.h>
#include <linux/clk.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/miscdevice.h>

#include <asm/irq.h>
#include <asm/io.h>
#include <asm/uaccess.h>
#include <asm/mach/time.h>

#include <mach/hardware.h>
#include <mach/regs-gpio.h>
//#include <mach/regs-irg.h>

#include <plat/regs-timer.h>

#define DEVICE_NAME "pwm" // 设备名

#define PWM_IOCTL_SET_FREQ 1 // 定义宏变量,用于后面的ioctl中的控制命令
#define PWM_IOCTL_STOP 0 // 定义宏变量,用于后面的ioctl中的控制命令

static void __iomem *pwm_base_addr; 
static struct resource  *io_mem;

static unsigned long tcon;
static unsigned long tcfg1;
static unsigned long tcfg0;

#define REMAP_SIZE 0x14

#define PWMTIMER_BASE 0xE2500000

#define TCFG0  (*(volatile unsigned long *)(pwm_base_addr + 0x00)) 
#define TCFG1  (*(volatile unsigned long *)(pwm_base_addr + 0x04)) 
#define TCON  (*(volatile unsigned long *)(pwm_base_addr + 0x08)) // 控制寄存器
#define TCNTB0  (*(volatile unsigned long *)(pwm_base_addr + 0x0c)) // 计数缓冲寄存器
#define TCMPB0  (*(volatile unsigned long *)(pwm_base_addr + 0x10)) // 比较计数寄存器


/*定义信号量lock用于互斥,保证该驱动程序只能由一个进程使用*/
static struct semaphore lock;

/*配置pwm的频率,配置各个寄存器*/
static void pwm_Set_Freq(unsigned long freq)
{
unsigned long tcnt;
unsigned long pclk;
struct clk *clk_p;

tcon  = readl(TCON); //读取寄存器 TCON 到 tcon

    clk_p = clk_get(NULL, "pclk");  // 得到 pclk
  相关解决方案