OK335xS pwm buzzer Linux driver hacking

/****************************************************************************
 *                 OK335xS pwm buzzer Linux driver hacking
 * 声明:
 *   本文仅仅是为了知道如何使用pwm来控制buzzer,已达到控制不同声音的频率。
 *
 *                                  2015-10-7 雨 深圳 南山平山村 曾剑锋
 ***************************************************************************/

#include <linux/init.h>
#include <linux/export.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/pwm.h>
#include <linux/fs.h>  

#define DEBUG
#if defined(DEBUG)
#define DPRINTK(fmt,arg...) printk(fmt,##arg);
#else
#define DPRINTK(fmt,arg...)
#endif

#define BUZZER_FREQENCY 1
#define DEV_NAME    "buzzer"

/*pwm for this buzzer*/
struct pwm_device *pwm = NULL;

static int buzzer_open(struct inode *inode, struct file *filp)
{

    if(pwm != NULL)
        return -EBUSY;

    /**
     * 申请一个pwm设备
     */
    pwm = pwm_request("ecap.1", -1, "buzzer");
    if ( pwm == NULL ) {
        printk("buzzer open error.\n");
    }

    printk("buzzer open\n");
    return 0;
}

static int buzzer_release(struct inode *inode, struct file *filp)
{
    /**
     * 关闭、注销一个pwm设备
     */
    pwm_stop(pwm);
    pwm_release(pwm);
    pwm = NULL;

    printk("buzzer release\n");

    return 0;
}

static long buzzer_ioctl(struct file *filp,
                        unsigned int cmd, unsigned long arg)
{

    if(pwm == NULL)
        return -EINVAL;

    if(arg > 20000 || arg < 0)
        return -EINVAL;

    switch (cmd) {
    case BUZZER_FREQENCY:       // 设置频率
        if(arg==0)
            pwm_stop(pwm);
        else
        {
            pwm_set_period_ns(pwm, 1000000000/arg);
            pwm_set_duty_ns(pwm, 25000);
            pwm_start(pwm);
        }

        break;
    default:
        break;
    }

    return 0;
}

static struct file_operations buzzer_fops = {
    .owner   = THIS_MODULE,
    .unlocked_ioctl     = buzzer_ioctl,
    .open    = buzzer_open,
    .release = buzzer_release,
};

static struct miscdevice buzzer_miscdev =
{
     .minor    = MISC_DYNAMIC_MINOR,
     .name    = DEV_NAME,
     .fops    = &buzzer_fops,
};

static int __init buzzer_init(void)
{
    /**
     * 注册杂项设备
     */
    misc_register(&buzzer_miscdev);
    return 0;
}

static void __exit buzzer_exit(void)
{
   misc_deregister(&buzzer_miscdev);
}

module_init(buzzer_init);
module_exit(buzzer_exit);

 

时间: 2024-10-23 01:24:15

OK335xS pwm buzzer Linux driver hacking的相关文章

I.MX6 PWM buzzer driver hacking with Demo test

/***************************************************************************** * I.MX6 PWM buzzer driver hacking with Demo test * 声明: * 1. I.MX6和OK335xS实现PWM驱动函数是不一样的: * 2. 通过分析PWM驱动,了解有哪些驱动函数可以用: * 3. 使用I.MX6提供的PWM函数,编写测试用例buzzer驱动: * 4. 使用C编写测试程序.

OK335xS LAN8710 phy driver hacking

/******************************************************************** * OK335xS LAN8710 phy driver hacking * 说明: * 本文主要是对OK335xS中的phy的驱动进行代码跟踪,并解决当前遇到 * LAN8710上电后插入网线,会导致LAN8710无法自动握手,Link灯不亮,内核 * 也检测不到LAN8710有状态发生了改变,最终问题定位于LAN8710的驱动初 * 始化部分,本文解决办

OK335xS pwm device register hacking

/************************************************************************* * OK335xS pwm device register hacking * 声明: * 本文是对OK335xS pwm设备注册进行代码跟踪,其中有些部分是由于本人自己 * 添加的,但都是经过测试. * * 2015-8-25 晴 深圳 南山平山村 曾剑锋 *********************************************

OK335xS knob driver hacking

/************************************************************************* * OK335xS knob driver hacking * 说明: * 本文主要是为了分析knob设备的创建,驱动层如何注册,发送信息. * * 2015-11-18 晴 深圳 南山平山村 曾剑锋 ************************************************************************/

I.MX6 Linux I2C device&amp; driver hacking

/******************************************************************************************* * I.MX6 Linux I2C device& driver hacking * 声明: * 1. 本文主要是对Linux I2C驱动进行代码跟踪,主要是为了能够对I2C驱动框架有个全面的了解: * 2. 本文源代码来自myzr_android4_2_2_1_1_0.tar.bz2: * 3. 如果你有兴趣,

OK335xS davinci mdio driver hacking

/******************************************************************************* * OK335xS davinci mdio driver hacking * 说明: * 以前一直也想对网卡驱动的工作原理进行跟踪,这次正好有机会,先跟mdio接口部分 * 的代码. * * 2016-3-1 深圳 南山平山村 曾剑锋 **************************************************

OK335xS 网络连接打印信息 hacking

/*********************************************************************** * OK335xS 网络连接打印信息 hacking * 说明: * 当我们插入网线的时候,经常会看到对应的网卡已连接,当前属于10M. * 100M网卡工作状态等等信息,那么这些信息是如何被输出的,工作机制是什么, * 网卡的速度是由phy决定的还是由mac决定的,是不是在phy对应的中断里处理, * 等等,这些内容都需要去确认. * * 2016-

OK335xS GPMC nand device register hacking

/********************************************************************************* * OK335xS GPMC nand device register hacking * 说明: * 由于最近遇到No NAND device found这个内核错误,在网络上也没找到很好的 * 解决办法,于是只能自己去跟踪整个设备.驱动的注册流程,试着去理解整个系统 * 的运作流程. * * 2015-9-2 雨 深圳 南山平山

I.MX6 ar1020 SPI device driver hacking

/************************************************************************************ * I.MX6 ar1020 SPI device driver hacking * 声明: * 1. 本文主要是解读I.MX6中ar1020 SPI设备注册,以及驱动调用流程: * 2. 本文主要使用了vim+ctags进行代码跟踪,所以几乎都是函数原型之间的调用: * * 2015-9-5 晴 深圳 南山平山村 曾剑锋 *