pwm控制还是有很多要注意的地方
附上驱动的代码

/** drivers/leds/leds-mt65xx.c** This file is subject to the terms and conditions of the GNU General Public* License.  See the file COPYING in the main directory of this archive for* more details.** Hydrodent weiqifa modify add**/#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/delay.h>
#include <linux/string.h>
#include <linux/ctype.h>
#include <linux/workqueue.h>
#include <linux/wakelock.h>
#include <linux/slab.h>
#include <linux/spinlock.h>
#include <mach/mt_pwm.h>
#include <mach/pmic_mt6329_hw_bank1.h>
#include <mach/pmic_mt6329_sw_bank1.h>
#include <mach/pmic_mt6329_hw.h>
#include <mach/pmic_mt6329_sw.h>
#include <mach/upmu_common_sw.h>
#include <mach/upmu_hw.h>
#include <linux/hrtimer.h>
/***************************************************************************** 现在我们的时钟源是32k ** 频率 理论上 1<f<32  但是 10<frequency<8191  所以最大的频率是3kHZ* f=32/div/frequency  div=1 frequency=pwm_setting.duration* 比如我们设置 f=1 那么我们frequency的值就应该是30 ** 占空比* 0<duty<=100* 实际测试发现 duty 值越大 测量值就越接近测试值* 并在adb 下面显示出来** 设备文件目录:/sys/class/hdyrodent* frequency:设置频率 echo 10 > frequency* duty:设置占空比 echo 50 > duty* switch:打开关闭 echo 1 >switch 大于0是打开 小于等于0是关闭**提示:如果不设置值,直接打开默认有波形***************************************************************************/static struct class *hdyrodent_pwm_class=NULL;
static int show_frequency=123;//默认分辨率变量
static int show_duty=50;//默认占空比变量
static bool show_switch=false;
static int show_stopbit=63;//这个变量可以用来控制分辨率,默认最大值是63 最小值是0#define PWM_NO PWM4
//声明定时器
static struct hrtimer timer_ptt;
static struct pwm_easy_config pwm_setting;//pwm设置的结构体/***************************************************************************** scnprintf是linux下面一个函数,这个函数把后面 的值格式话转化成字符串* 并在adb 下面显示出来***************************************************************************/
static ssize_t hdyrodent_frequency_show(struct device *dev,struct device_attribute *attr, char *buf)
{
      printk("%s\n", __FUNCTION__);      return scnprintf(buf, PAGE_SIZE, "%d\n", show_frequency);
}
/***************************************************************************** echo pwm这个节点的时候就会调用下面这个函数,echo "12" > pwm * 那么value的值就是12 可以通过这样设置pwm的数值***************************************************************************/
static ssize_t hdyrodent_frequency_store(struct class *cls, struct class_attribute *attr, const  char *_buf, size_t _count)
{
    int value=0;
    sscanf(_buf, "%d", &value);
    sscanf(_buf, "%d", &show_frequency);//把值传给show_frequency这样 cat的值就是echo 进去的值了
    printk("%s: value: %d _count:%d\n", __FUNCTION__, value,_count);
    if(value<=0)
    {        printk("Error %s input value wrong!!!!\n",__FUNCTION__);
    }
    else
    {
        pwm_setting.duration=value;
        pwm_set_easy_config(&pwm_setting);
        printk("Success %s \n",__FUNCTION__);
    }      return _count;
}
/***************************************************************************** scnprintf是linux下面一个函数,这个函数把后面 的值格式话转化成字符串* 并在adb 下面显示出来***************************************************************************/
static ssize_t hdyrodent_brightness_show(struct device *dev,struct device_attribute *attr, char *buf)
{
      printk("%s\n", __FUNCTION__);      return scnprintf(buf, PAGE_SIZE, "%d\n", show_duty);
}
/***************************************************************************** echo pwm这个节点的时候就会调用下面这个函数,echo "12" > pwm * 那么value的值就是12 可以通过这样设置pwm的数值***************************************************************************/
static ssize_t hdyrodent_brightness_store(struct class *cls, struct class_attribute *attr, const  char *_buf, size_t _count)
{
    int value=0;
    sscanf(_buf, "%d", &value);
    sscanf(_buf, "%d", &show_duty);//把值传给show_duty这样 cat的值就是echo 进去的值了
    printk("%s: value: %d _count:%d\n", __FUNCTION__, value,_count);
    if(value<=0)
    {        mt_pwm_disable(PWM_NO, true);//关闭pwm波
        printk("Error: %s disable the pwm 2\n",__FUNCTION__);
    }
    else
    {
        pwm_setting.duty = value;
        pwm_set_easy_config(&pwm_setting);
        printk("Success: %s disable the pwm 2\n",__FUNCTION__);
    }
        return _count;
}
/***************************************************************************** scnprintf是linux下面一个函数,这个函数把后面 的值格式话转化成字符串* 并在adb 下面显示出来***************************************************************************/
static ssize_t hdyrodent_on_show(struct device *dev,struct device_attribute *attr, char *buf)
{
      printk("%s\n", __FUNCTION__);      return scnprintf(buf, PAGE_SIZE, "%d\n", show_switch);
}
/***************************************************************************** echo pwm这个节点的时候就会调用下面这个函数,echo "12" > pwm * 那么value的值就是12 可以通过这样设置pwm的数值***************************************************************************/
static ssize_t hdyrodent_on_store(struct class *cls, struct class_attribute *attr, const  char *_buf, size_t _count)
{
    int value=0;
    sscanf(_buf, "%d", &value);
    sscanf(_buf, "%d", &show_switch);//把值传给show_switch这样 cat的值就是echo 进去的值了
    printk("%s: value: %d _count:%d\n", __FUNCTION__, value,_count);
    if(value>0)
    {        pwm_set_easy_config(&pwm_setting);
        printk("Success: %s enable the pwm 2\n",__FUNCTION__);
    }
    else
    {        mt_pwm_disable(PWM_NO, true);//关闭pwm波
        printk("Success: %s disable the pwm 2\n",__FUNCTION__);
    }
        return _count;
}
/***************************************************************************** __ATTR的第一个参数是在sys文件系统里面显示的名字* 0666是这个节点的属性,0666表示是可读可写* hdyrodent_frequency_show 是cat 这个文件的时候调用的函数* hdyrodent_frequency_store 是echo的时候调用的函数***************************************************************************/
static struct class_attribute hdyrodent_attr[] = {
__ATTR(frequency,0666, hdyrodent_frequency_show, hdyrodent_frequency_store),
__ATTR(brightness,0666, hdyrodent_brightness_show, hdyrodent_brightness_store),
__ATTR(on,0666, hdyrodent_on_show, hdyrodent_on_store),
__ATTR_NULL,};
/***************************************************************************** 定时中断函数***************************************************************************/
static enum hrtimer_restart timer_ptt_interrupt(struct hrtimer *timer)
{
    static unsigned int c=0;
    c++;
    printk("%s,%d,c=%d\n",__func__,__LINE__,c);
    hrtimer_start(&timer_ptt, ktime_set(1, 0), HRTIMER_MODE_REL);
    return HRTIMER_NORESTART;
}static int __init hdyrodent_pwm_init(void)
{
    int ret;
    int i = 0;    printk("%s start\n", __FUNCTION__);
    //用class_create在sys/class/下面生成sys文件系统
    hdyrodent_pwm_class=class_create(THIS_MODULE,"hdyrodent_charger_led");
    if(IS_ERR(hdyrodent_pwm_class))
    {        printk("create hdyrodent module fail \n");
        return PTR_ERR(hdyrodent_pwm_class);;
    }    for (i = 0 ; NULL != attr_name(hdyrodent_attr[i]);i++)
    {        ret = class_create_file(hdyrodent_pwm_class, &hdyrodent_attr[i]);
        if (0 != ret)
        {            printk("creat %s class file fail\n",attr_name(hdyrodent_attr[i]));
            break;
        }
    }
    mt_pwm_disable(PWM_NO, true);//把pwm 功能关闭掉
    mt_set_gpio_mode(90,GPIO_MODE_06);
    pwm_setting.pwm_no = PWM_NO;//通过函数把这个gpio口设置成pwm1模式,对应pwm_no就是PWM2
    pwm_setting.pmic_pad = false;
    pwm_setting.duty=20;
    pwm_setting.duration=100;
    pwm_setting.clk_div = CLK_DIV1;
    pwm_setting.clk_src = PWM_CLK_OLD_MODE_32K;//PWM_CLK_OLD_MODE_BLOCK;//26M
    //pwm_set_easy_config(&pwm_setting);    //定时器
    hrtimer_init(&timer_ptt, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
    timer_ptt.function = timer_ptt_interrupt;
    hrtimer_start(&timer_ptt, ktime_set(1, 0), HRTIMER_MODE_REL);
    printk("%s end\n", __FUNCTION__);    return 0;}static void __exit hdyrodent_pwm_exit(void)
{
    int i = 0;    printk("hdyrodent module cleanup start.\n");
    mt_pwm_disable(PWM_NO, true);//把pwm 功能关闭掉
    if(hrtimer_cancel(&timer_ptt))
    {        printk("try to cancel hrtimer \n");
    }
    for (i = 0 ; NULL != attr_name(hdyrodent_attr[i]);i++)
    {            class_remove_file(hdyrodent_pwm_class, &hdyrodent_attr[i]);
        }
    class_destroy(hdyrodent_pwm_class);
    printk("hdyrodent module cleanup OK!\n");
}MODULE_AUTHOR("329410527@qq.com");
MODULE_DESCRIPTION("HDYRODENT PWM MODULE");
MODULE_LICENSE("GPL");
MODULE_VERSION("ver0.1");module_init(hdyrodent_pwm_init);
module_exit(hdyrodent_pwm_exit);

mtk pwmlinux timer相关推荐

  1. MTK 驱动(67)---深入MTK平台bootloader启动之【 lk -amp;gt; kernel】分析笔记

    Pre-loader 运行在ISRAM,待完成 DRAM 的初始化后,再将lk载入DRAM中,最后通过特殊sys call手段实现跳转到lk的执行入口,正式进入lk初始化阶段. 一.lk执行入口: 位 ...

  2. MTK 驱动(73)---MTK 6761平台 android O bootloader启动之 Pre-loader -amp;gt; Lk

    MTK 6761平台 android O bootloader启动之 Pre-loader -> Lk 1.bootloader到kernel启动总逻辑流程图 ARM架构中,EL0/EL1是必须 ...

  3. MTK 驱动开发(5)---bootloader

    1.框架 MTK 平台的启动过程经过四个模块,分别是BootRom,Preloader,LK,Kernel. 2 .bootloader到kernel启动总逻辑流程图 3.Boot ROM Boot ...

  4. 浅谈mtk平台手机通过gprs网络连接pc

    GPRS:通用分组无线技术(General packet radios service),GSM网络覆盖的区域都可快速实现GPRS的覆盖. gprs的特点:高速率的数据传输.目前gprs速率达到40k ...

  5. (转)MTK 消息分发及窗口管理

    一.总体结构 1. Software Architecture MediaTek Inc . (MTK) 2. MMI Architecture MTK 平台采用的是Pixtel Communicat ...

  6. MTK Android Led框架分析

    1 驱动部分 这部分主要根据驱动源码的初始化部分进行分析 1.1 mtk_leds_drv 路径:/kernel-4.14/drivers/misc/mediatek/leds/mtk_leds_dr ...

  7. mtk flash配置

    在mtk 的flash excel配置表中有些专业名称,在如下的文档中有详细的描写,对配置新的flash都是有帮助的 一.对clock的基本认识     第七部分是"clock & ...

  8. MTK keypad调试,扩张键盘IC AW9523

    FROM:http://blog.csdn.net/aree/article/details/28683741 按键没有hal层 设备中断-------驱动------>内核按键码(SCANCO ...

  9. A4. MTK开机流程

    preloader流程: 路径: vendor/mediatek/proprietary/bootable/bootloader/preloader/platform/mt6761/src/core/ ...

最新文章

  1. python中的is
  2. 老板和用户你听谁的——手机网站改版踩坑记
  3. xftp连接海康摄像头报错:sftp子系统申请已拒绝 请确保ssh连接的sftp子系统设置有效
  4. AAAI2019 | 腾讯AI Lab详解自然语言处理领域三大研究方向及入选论文
  5. 用Gogland开发Go程序
  6. 全自动安装 linux光盘,CentOS 7.1全自动安装光盘制作详解
  7. 企业级php第三方支付平台,ThinkPHP新版企业级php第三方api第四方支付平台程序源码商业版 带接口文件等 某宝售价3000元...
  8. 插入排序(边输边排)
  9. ubuntu下创建定时任务的两种方式及常见问题解决方案
  10. bzoj4869: [Shoi2017]相逢是问候(欧拉函数+线段树)
  11. arm开发板放张图片动起来_Python与Zynq的桥梁,米尔PYNQ开发板来了
  12. Java Jad 反编译class文件
  13. 几种常见的图像模糊处理
  14. 机器学习——数据集预处理(数据查看和空值处理)
  15. Eclipse下如何使用Maven——超详细教程
  16. C# 如何在Excel表格中插入、编辑和删除批注
  17. ipone=遥控器?
  18. 智慧城市同城小程序V4_1.0.86后端+双前端
  19. python实现ItemCF算法
  20. 以太网芯片MAC和PHY

热门文章

  1. 计算几何 - XOJ 1171 线段求交
  2. NetBeans 6.9 发布后选版 1 已经可用
  3. 计算t-test 的C程序
  4. GridView相关问题汇总
  5. ASP.NET 2.0新特性视频教程下载
  6. 软件工程形式化技术简介
  7. 短作业优先算法的缺点
  8. mysql 数据库查询测试_MySQL查询测试经验
  9. 电脑老是弹出vrvedp_m_出现三个可疑进程vrvedp_m.exe vrvrf_c.exe vrvsafec.exe
  10. 深度学习之卷积神经网络 ResNet