我是靠谱客的博主 跳跃镜子,最近开发中收集的这篇文章主要介绍imx6的PWM计数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

由于imx6并没有PWM计数功能,本次PWM计数主要通过中断进行PWM计数,
本文使用linux3.015的内核,没有设备树。
1、照葫芦画瓢,参考其他的中断,利用platform_get_irq函数获取中断号。

/******Pwm.h中****************/
struct pwm_device {
	struct list_head	node;
	struct platform_device *pdev;

	const char	*label;
	struct clk	*clk;

	int		clk_enabled;
	void __iomem	*mmio_base;

	unsigned int	use_count;
	unsigned int	pwm_id;
	int		pwmo_invert;

	int		irq;   /*新添加*/
	void (*enable_pwm_pad)(void);
	void (*disable_pwm_pad)(void);
};
/*添加以下中断要用的函数*/
int pwm_irq_enable(struct pwm_device *pwm); /*使能*/
int pwm_irq_disable(struct pwm_device *pwm);/*失能*/
int pwm_irq_clearflags(struct pwm_device *pwm); /*清除标志位*/
int pwm_irq_stop(struct pwm_device *pwm);/*停止中断*/
/******Pwm.c中****************/
static int __devinit mxc_pwm_probe(struct platform_device *pdev)
{
    /*此处省略n行代码*/
	pwm->irq = platform_get_irq(pdev, 0); /*获取中断号*/
	if (pwm->irq < 0) {
		ret = -EINVAL;
	}
}


///PWM interrupt config//
///config fifo interrupt/
int pwm_irq_enable(struct pwm_device *pwm)
{
	unsigned long reg;
	reg = readl(pwm->mmio_base + MX3_PWMMIR);
	reg |=MX3_PWM_ROV_IRQ_EN;
	writel(reg,pwm->mmio_base + MX3_PWMMIR);
}
EXPORT_SYMBOL(pwm_irq_enable);
/*添加以下函数与宏定义*/
#define MX3_PWMMIR               		0x08    /* PWM interrupt Register */
#define MX3_PWMFIFOIRQ_EN              (1 << 0)
#define MX3_PWM_ROV_IRQ_EN              (1 << 1)

#define MX3_PWMSR            			0x04   /* PWM statues Register */
#define MX3_PWM_ROV_EN              (1 << 4)

int pwm_irq_disable(struct pwm_device *pwm)
{
	/*unsigned long reg;
	reg = readl(pwm->mmio_base + MX3_PWMMIR);
	reg &=~ MX3_PWM_ROV_IRQ_EN;*/
	writel(0,pwm->mmio_base + MX3_PWMMIR);
}
EXPORT_SYMBOL(pwm_irq_disable);

int pwm_irq_clearflags(struct pwm_device *pwm)
{
	unsigned long reg;
	reg = readl(pwm->mmio_base + MX3_PWMSR);
	reg |= MX3_PWM_ROV_EN;
	writel(reg,pwm->mmio_base + MX3_PWMSR);
}
EXPORT_SYMBOL(pwm_irq_clearflags);

int pwm_irq_stop(struct pwm_device *pwm)
{
	writel(0,pwm->mmio_base + MX3_PWMCR);
}
EXPORT_SYMBOL(pwm_irq_stop);

写好后,将内核编译,

另写一个驱动直接调用PWM定义的函数即可,如创建PWM1的中断

int pwm_irq(struct pwm_device *pwm)
{
	int d1;
	d1=pwm->irq;
	printk("d1=%d!rn",d1);
	return d1;
}
/*在某函数调用*/
	d1= pwm_irq(pwm_dev_2);
 	pwm_irq_enable(pwm_dev_2);
	ret = request_irq(d1,pwm1_isr,0,"PWM1",pwm_dev_2);

其中pwm1_isr就是中断函数,定义一个count每次加1即可实现PWM计数。
通过示波器发现,有时候计数会出现误差,但误差在可接受范围内,待进一步测试后再确认该计数方式是否可行,除了pwm翻转中断计数外,可用FIFO空中断实现PWM粗略计数,也有人用EPIT精准定时器来进行计数,具体用那种方式比较好还有待研究。

最后

以上就是跳跃镜子为你收集整理的imx6的PWM计数的全部内容,希望文章能够帮你解决imx6的PWM计数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部