IMX6输出可控PWM
驱动部分
#include <linux/init.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/errno.h>
#include <linux/miscdevice.h>
#include <linux/types.h>
#include <linux/io.h>
#include <linux/pwm.h>
#include <linux/fs.h> /************硬件相关***************/
#include <mach/iomux-mx6q.h> #define PWM_FREQENCY 1
#define DEV_NAME "mypwm"
#define PWM_DEBUG 1
/*pwm for this my_pwm*/
struct pwm_device *pwm = NULL; static int my_pwm_open(struct inode *inode, struct file *filp)
{ if(pwm != NULL)
return -EBUSY; /**
* my_pwm正好挂载在I.MX6的pwm4上,所以这里申请3号(从零开始算)PWM
*/
pwm = pwm_request(3, "my_pwm");
if ( pwm == NULL ) {
printk(KERN_ALERT"my_pwm open error.\n");
}
#ifdef PWM_DEBUG
printk(KERN_ALERT"my_pwm opened\n");
#endif
return 0;
} static int my_pwm_release(struct inode *inode, struct file *filp)
{
pwm_disable(pwm); // 关闭pwm
pwm_free(pwm); // 释放pwm
pwm = NULL;
#ifdef PWM_DEBUG
printk(KERN_ALERT"my_pwm closed\n");
#endif
return 0;
} static long my_pwm_ioctl(struct file *filp,
unsigned int cmd, unsigned long arg)
{
if(pwm == NULL)
return -EINVAL; if(arg < 0)
return -EINVAL; switch (cmd) {
case PWM_FREQENCY:
if(arg==0)
{
pwm_disable(pwm);
#ifdef PWM_DEBUG
printk(KERN_ALERT"my_pwm off\n");
#endif
}
else
{
pwm_config(pwm, 1000000000/arg/2, 1000000000/arg);
pwm_enable(pwm);
#ifdef PWM_DEBUG
printk(KERN_ALERT"my_pwm on\n");
#endif
}
break;
default:
break;
} return 0;
} static struct file_operations my_pwm_fops = {
.owner = THIS_MODULE,
.unlocked_ioctl = my_pwm_ioctl,
.open = my_pwm_open,
.release = my_pwm_release,
}; static struct miscdevice my_pwm_miscdev =
{
.minor = MISC_DYNAMIC_MINOR,
.name = DEV_NAME,
.fops = &my_pwm_fops,
}; static int __init my_pwm_init(void)
{
//printk(KERN_ALERT"check my_pwm init.\n");
misc_register(&my_pwm_miscdev);//misc杂项设备是主设备号为10的驱动设备,自动创建节点
mxc_iomux_v3_setup_pad(MX6Q_PAD_SD1_CMD__PWM4_PWMO);
#ifdef PWM_DEBUG
printk(KERN_ALERT"my_pwm init\n");
#endif
return 0;
} static void __exit my_pwm_exit(void)
{
misc_deregister(&my_pwm_miscdev);
#ifdef PWM_DEBUG
printk(KERN_ALERT"my_pwm removed\n");
#endif
} module_init(my_pwm_init);
module_exit(my_pwm_exit); MODULE_DESCRIPTION("pwm_my_pwm driver");
MODULE_LICENSE("GPL");
测试程序
#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <poll.h>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h> #define PWM_SET_FREQ 1
#define PWM_STOP 0 int fd;
int main(int argc, char **argv)//dev state freq
{
char* filename;
long int freq; filename=argv[1];
if (argc != 4)
{
printf("parm limited!\n");
return 0;
}
printf("open %s \n",filename);
fd=open(filename,O_RDWR);
if(fd<0)
{
printf("can't open\n");
return 0;
}
if(!strcmp("on",argv[2]))
{
printf("PWM ON!\n");
freq=atol(argv[3]);
ioctl(fd,PWM_SET_FREQ,freq);
printf("PWM FREQ set:%d Hz \n",freq);
}
else if(!strcmp("off",argv[2]))
{
ioctl(fd,PWM_STOP);
printf("PWM stop!\n");
}
else
printf("error:param wrong!\n");
while(1)
{
sleep(1000);
}
close(fd);
return 0;
}
IMX6输出可控PWM的更多相关文章
- 速度上手LM4F LaunchPad 输出多路PWM波
最近转战到TI的Cortex M4平台后,发现网上关于TI的LM4F120 Launchpad 资料太少了,而且其中大部分都是TI员工或者其合作伙伴提供的,例程太少,导致新手上手很慢. 我只是要实现几 ...
- ESP8266-模拟输出(PWM)
PWM(Pulse Width Modulation,脉宽调制),是在保持波的频率不变的同时改变脉宽的技术 首先,我们来理解一下占空比.一个脉冲周期由一个ON周期(VCCC)和一个OFF周期(GND) ...
- 03 Arduino-模拟输出与PWM的操作方法
在arduino开发板上面,标注为PWM的管脚的可以被当作数模转换管脚使用 01 模拟输出 analogWrite(pin, value) pin: 选定的引脚号码 value:取值范围 0-25 ...
- STM32之PWM波形输出配置总结
一. TIMER分类: STM32中一共有11个定时器,其中TIM6.TIM7是基本定时器:TIM2.TIM3.TIM4.TIM5是通用定时器:TIM1和TIM8是高级定时器,以及2个看门狗定时器 ...
- STM32F0xx_TIM输出PWM配置详细过程
前言 前面我说过STM32的定时器功能很强大,今天就来总结一下它的另外一个“强大”功能:TIM的比较输出功能,输出可调PWM波形.直接调用函数接口“TIM2_CH1_PWM(uint32_t Freq ...
- STM32F103定时器输出PWM波控制直流电机
这个暑假没有回家,在学校准备九月份的电子设计竞赛.今天想给大家分享一下STM32高级定时器输出PWM波驱动直流电机的问题.. 要想用定时器输出的PWM控制直流电机,,首先要理解“通道”的概念..一个定 ...
- STM32F0使用LL库实现PWM输出
在本次项目中,限于空间要求我们选用了STM32F030F4作为控制芯片.这款MCU不但封装紧凑,而且自带的Flash空间也非常有限,所以我们选择了LL库实现.本文我们将说明如何通过LL库实现PWM信号 ...
- A.01.10—模块的输出—PWM高端输出
PWM高端输出比低端输出用得多,如上次提到的卤素灯的控制均是采用高端输出的. PWM高端输出与PWM低端输出的差异就像固态高端输出与固态低端输出的差异类似,从线路失效后对用户的影响来看:高端输出为控制 ...
- 基于STM32F429+HAL库编写的定时器主从门控模式级联输出固定个数PWM脉冲的程序
硬件设备 42步进电机,步进电机驱动器,正点原子F429开发板 开发软件 keil5,Cube 综述 一般要精准的控制电机,就要控制单片机的引脚输出指定个数的PWM波,有多种可实现的方法 ...
随机推荐
- PHPExcel 导出表格 不知道好不好用
PHPExcel类是php一个excel表格处理插件了,下面我来给大家介绍利用PHPExcel类来导入与导出excel表格的应用方法,有需要了解的朋友不防参考参考(PHPExcel自己百度下载这里不介 ...
- 说说chrome上的JS调试
步骤:审查元素 ->source->选择js文件 ->设置断点 ->触发函数 ->进入调试点step over 到elements目录下双击某一块代码还可以立刻修改,ct ...
- CSS总结 最后的选择符和字体、元素常见样式
在伪类选择符中,还有很多,其中比较有意思的是E:target 当我们想做出点击超链接后链接变色且其他链接变回原来的颜色时,就可以用到这个选择符 <a href="#a1" i ...
- C++ Daily 《1》----关于对象
1. 问题 请问如下的一个 class 的一个对象占了多少内存? 具体包含哪些东西? non-static 变量? static member 变量? member function?? virtua ...
- PAT (Basic Level) Practise:1023. 组个最小数
[题目链接] 给定数字0-9各若干个.你可以以任意顺序排列这些数字,但必须全部使用.目标是使得最后得到的数尽可能小(注意0不能做首位).例如:给定两个0,两个1,三个5,一个8,我们得到的最小的数就是 ...
- surge for mac出测试版本了
这两天一直在MAC上试图连接我的shadowsocks服务,使用shadowsocksX一直没能连接到服务器.服务器本身是没有问题的,因为我的thinkpad和iphone都可以正常使用.结果就试着使 ...
- TCP链接时主动close时可能的rst报文
阿里核心系统团队博客http://csrd.aliapp.com/?p=1055记录了主动关闭TCP socket时,可能不发fin包,而是发rst的问题. 其原因是主动关闭socket时,若接收bu ...
- XListView刷新
package com.example.da; import java.util.ArrayList;import java.util.List; import com.badu.net.Networ ...
- ajax 中$.each(json,function(index,item){ }); 中的2个参数表示什么意思?
$.each(json,function(index,item)里面的index代表当前循环到第几个索引,item表示遍历后的当前对象,比如json数据为:[{"name":&qu ...
- C#对象复制 ICloneable
在.net framework中,提供了ICloneable接口来对对象进行克隆.当然,你也可以不去实现ICloneable接口而直接自己定义一个Clone()方法,当然,还是推荐实现ICloneab ...